Я реализую генетический алгоритм, чтобы минимизировать некоторые функции из 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;
Проблема в том, что, когда число поколений становится очень большим (в тысячах), люди поколений начинают сходиться к решению, и все их оценки начинают вращаться вокруг оптимального решения, и иногда происходит нечто странное: даже если мы итерировали по всем определенным индивидам, random по-прежнему> 0 (хотя и очень маленький, отладчик говорит мне, что он порядка 10 ^ -13). Поэтому он пытается продолжить зацикливание на отдельных лицах, которые даже не существуют (так как выбранные приращения для каждой итерации). Что дает векторный индекс вне диапазона ошибок.
Это происходит, когда число поколений достаточно велико и, логически, когда случайное число приближается к сумме.
теоретически это никогда не должно происходить, но я думаю, что проблема может быть из-за ограниченного представления чисел или усечения или чего-то подобного.
Есть идеи?
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;
Других решений пока нет …