次のようにワンポイントクロスオーバーを実装しました。
public void onePointCrossover(Individual indi) {
if (SGA.rand.nextDouble() < pc) {
int xoverpoint = SGA.rand.nextInt(length);
int tmp;
for (int i=xoverpoint; i<length; i++){
tmp = chromosome[i];
chromosome[i] = indi.chromosome[i];
indi.chromosome[i] = tmp;
}
}
}
1 点交叉 - 交点が選択され、染色体の先頭から交叉点までのバイナリ文字列が 1 つの親からコピーされ、残りは 2 番目の親からコピーされます。
親 1 = 染色体および親 2 = インディ。
私は親を子に変えています。
2 ポイント クロスオーバーも実行する必要がありますが、問題が発生しています。これはこれまでのところですが、コードの下半分は、中間セクションを交換するのではなく、1 ポイント クロスオーバーと同じことを行っていると思います。
public void twoPointCrossover(Individual indi) {
if (SGA.rand.nextDouble() < pc) {
int xoverpoint = SGA.rand.nextInt(length);
int xoverpoint2 = SGA.rand.nextInt(length);
int tmp;
if (xoverpoint > xoverpoint2){
tmp = xoverpoint;
xoverpoint = xoverpoint2;
xoverpoint2 = tmp;
}
for (int i=xoverpoint; i<xoverpoint2; i++){
tmp = chromosome[i];
chromosome[i] = indi.chromosome[i];
indi.chromosome[i] = tmp;
}
}
}
}
これは正しくないようです。どんな助けでも大歓迎です! ありがとう!