C++ 如何修复这个错误代码(轮盘赌选择)?

C++ 如何修复这个错误代码(轮盘赌选择)?,c++,vector,subscript,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; 问题是

我正在实现遗传算法来最小化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)。因此,它试图继续在甚至不存在的个体上循环(因为每次迭代都选择增量)。这会产生向量下标超出范围的错误

当世代数足够大时,以及从逻辑上讲,当随机数接近总和时,就会发生这种情况

理论上,这永远不会发生,但我认为问题可能是因为数字的有限表示或截断或类似的东西

有什么想法吗?

双倍和=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;
双倍总和=总和分数(); 双随机=(rand()*sum)/rand_MAX; 选定的整数=0; //确定个人得分中元素的数量 const int arraySize=sizeof(个人得分)/sizeof(个人得分[0]); 而(随机>=0&&selected
while(random>=0&&selected
while(random-someSmallConstant>=0)
如何处理
while(random-someSmallConstant>=0)
?对个体进行迭代,如果random(random)则提前退出代码去了哪里?这非常有用。@john我回滚了编辑,我不清楚删除代码的原因。