我正在实施遗传算法以最小化 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 的顺序)。因此,它试图继续循环遍历甚至不存在的个体(因为每次迭代都选择了增量)。这给出了一个向量下标超出范围的错误。
当代数足够大并且从逻辑上讲,当随机数接近总和时,就会发生这种情况。
理论上这不应该发生,但我认为问题可能是因为数字或截断或类似这些方面的有限表示。
有任何想法吗?