如何解决这个错误的代码(轮盘赌轮选择)?

时间:2013-03-19 16:14:19

标签: c++ vector subscript

我正在实施遗传算法以最小化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)。因此,它尝试继续循环甚至不存在的个体(因为每次迭代都选择了增量)。这使得矢量下标超出范围误差。

这种情况发生在代数足够大时,逻辑上,当随机数接近总和时。

理论上这应该永远不会发生,但我认为问题可能是因为数字或截断的表示有限或沿着这些线的某些东西。

有什么想法吗?

1 个答案:

答案 0 :(得分: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;