【发布时间】:2013-03-20 05:54:51
【问题描述】:
我正在实施遗传算法以最小化 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 的顺序)。因此,它试图继续循环遍历甚至不存在的个体(因为每次迭代都选择了增量)。这会导致向量下标超出范围错误。
这发生在代数足够大时,并且从逻辑上讲,当随机数接近总和时。
理论上这不应该发生,但我认为问题可能是由于数字或截断或类似这些方面的有限表示。
有什么想法吗?
【问题讨论】:
-
while(random >= 0 && selected < sizeofIndividuals_score)或while(random - someSmallConstant >= 0)怎么样? -
迭代个体,如果随机则提前退出
-
代码去哪儿了?这很有帮助。
-
@john 我回滚了编辑,我不清楚为什么要删除代码。