0

次のようにワンポイントクロスオーバーを実装しました。

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;
            }   
        }   
    }
}

これは正しくないようです。どんな助けでも大歓迎です! ありがとう!

4

2 に答える 2

1

ループ内でi < (or <=) xoverpoint2はなく、チェックする必要があります。i<length

于 2012-02-16T14:31:45.907 に答える