2013-03-19 69 views
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)。因此它会尝试继续循环不存在的个体(因为每次迭代都会选择增量)。这给出了向量下标超出范围错误。

这种情况发生在世代的数量足够大的时候,在逻辑上,随机数接近总数。

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

任何想法?

+0

如何处理'while(random> = 0 && selected = 0)'? – 2013-03-19 16:17:33

+0

迭代个体,如果随机<0,则尽早退出。 – Beta 2013-03-19 16:18:18

+3

代码去哪了?这非常有帮助。 – john 2013-03-19 16:25:39

回答

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;