2013-03-19 2 views
0

Я реализую генетический алгоритм для минимизации функции из 20 переменных.Как исправить этот багги-код (выбор колеса рулетки)?

Каждый человек хранится в виде вектора. баллы хранятся как двойные.

double sum = 0; 
double sum = sumOfScores(); 
double random = (rand() * sum)/RAND_MAX; 
int selected = 0; 
while(random >= 0) { 
random -= individuals_score[selected]; 
selected++; 
} 
return selected - 1; 

Проблема, когда число поколений растут очень большой (в тысячах), особи поколений начинают сходиться к решению, и все их оценки начинают вращаться вокруг оптимального решения, и Иногда случается странная вещь: даже если мы повторяем все определенные люди, случайный все еще> 0 (хотя очень маленький, отладчик говорит мне, что он находится в порядке 10^-13). Поэтому он пытается продолжить цикл над людьми, которые даже не существуют (так как выбранные приращения для каждой итерации). Который дает ошибку вектора вне диапазона.

Это происходит, когда число поколений достаточно велико и, по логике, когда случайное число приближается к сумме.

Теоретически это никогда не должно происходить, но я думаю, что проблема может быть из-за ограниченного представления чисел или усечения или чего-то подобного в этих строках.

Любые идеи?

+0

Что делать в while (random> = 0 && selected = 0) '? –

+0

Итерации над отдельными лицами, и выйдите рано, если случайно <0. – Beta

+3

Куда уходит код? Это было очень полезно. – john

ответ

0
double sum = 0; 
double sum = sumOfScores(); 
double random = (rand() * sum)/RAND_MAX; 
int selected = 0; 

//determine the number of elements in individuals_score 
const int arraySize = sizeof(individuals_score)/sizeof(individuals_score[0]); 

while(random >= 0 && selected < arraySize) { 
    random -= individuals_score[selected]; 
    selected++; 
} 
return selected - 1; 
Смежные вопросы