【问题标题】:How to fix this buggy code (roulette wheel selection)?如何修复这个错误代码(轮盘赌选择)?
【发布时间】: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 我回滚了编辑,我不清楚为什么要删除代码。

标签: c++ vector subscript


【解决方案1】:
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;

【讨论】:

    猜你喜欢
    • 2018-07-04
    • 2019-07-06
    • 2021-06-02
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2012-05-06
    相关资源
    最近更新 更多