0

20 変数のいくつかの関数を最小化する遺伝的アルゴリズムを実装しています。

各個体はベクトルとして保存されます。スコアは double として保存されます。

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 に答える