0

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

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

理论上这不应该发生,但我认为问题可能是因为数字或截断或类似这些方面的有限表示。

有任何想法吗?

4

1 回答 1

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;
于 2013-03-19T16:27:52.037 回答