Member 14074021 Ответов: 2

Почему моя программа печатает одно и то же значение?


Я написал программу для печати различных значений для функции De Jong 1 в 5 измерениях, но когда я ее компилирую, программа возвращает одно и то же значение. Сначала я генерирую двоичный вектор, а затем делю его на 5 векторов, которые представляют xi. Я вычисляю десятичное значение для каждого двоичного вектора с помощью функции BinToDec,а затем представляю значение в интервале [-5.12, 5.12] с помощью функции nr_interval.

Что я уже пробовал:

#include <bits/stdc++.h>
using namespace std;
#define CROSSOVER_RATE            0.3
#define MUTATION_RATE             0.01
#define POP_SIZE                  50          
#define CHROMO_LENGTH             150
#define GENE_LENGTH               30

int random_num(int start, int end)
{
    int range = (end-start)+1;
    int random_int = start+(rand()%range);
    return random_int;
}

string  GetRandomBits(int length)
{  srand(time(NULL));
    string bits;
        for (int i=0; i<length; i++)
    {
        if (random_num(0,1) == 1)
 
            bits += "1";
 
        else
 
            bits += "0";
    }
 
    return bits;
}

int BinToDec(string bits)
{    int val = 0;
    int p=1;
    for (int i = bits.length(); i > 0; i--)
    { if (bits.at(i-1) == '1')
        {val += p;}
        p *= 2;
    }
    return val;
}

double nr_interval(int valoare, double a, double b)
{
    double result;
    result=0.0;
    result=a+valoare*((b-a)/(pow(2,30)-1));
    return result;
}

double De_Jong(string bits){
    double x=0.0;
     for(size_t i=0; i<sizeof(bits); i=i+GENE_LENGTH)
     {  x = x + nr_interval(BinToDec(bits.substr(0,i+GENE_LENGTH)),-5.12,5.12)* nr_interval(BinToDec(bits.substr(0,i+GENE_LENGTH)),-5.12,5.12);
         
     }
 return x;   
}

int main(){
     
    for(int x=1; x<=POP_SIZE;x++)
     {  cout<<De_Jong(GetRandomBits(CHROMO_LENGTH));
        cout<<endl;
     }
    //valoare=BinToDec(GetRandomBits(l));
   //cout<<valoare;
    
    return 0;
}

2 Ответов

Рейтинг:
0

Patrice T

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.

Модульное тестирование также является хорошей идеей.
Модульное тестирование - Википедия[^]


Рейтинг:
0

KarstenK

Вы должны использовать отладчик, чтобы найти проблему. Мое лучшее предположение таково

{val += p;}
потому что ПП не меняется.

Совет: сделайте некоторый вывод результата каждой функции.

почему бы и не так;
for(size_t i=0; i<sizeof(bits); i=i+GENE_LENGTH)
{ 
  double nr = nr_interval(BinToDec(bits.substr(0,i+GENE_LENGTH)),-5.12,5.12);
  x = x + nr*nr;
}