Shinubi:
私は遺伝的アルゴリズムについて学ぶためにしようとしていると、現在、2つの「遺伝子」「クロスオーバー」に取り組んでいます。遺伝子は、整数配列であるものとゼロからなります。私の問題を例示するために我々は二つの遺伝子を持っているとしましょう。
int[] geneA = {1,0,0,0,0};
int[] geneB = {0,1,1,1,0};
クロスオーバーから予想される結果、3位で例えば次のようになります。
geneA = [1,0,0,1,0]
geneB = [0,1,1,0,0]
3以上の指標ですべての要素は、他の遺伝子の等価な要素と交換されることを意味します。これを実現するために、私は次のメソッドを書きました:
private void crossOver(int[] geneA, int[] geneB, int pos) {
int copyA[];
int copyB[];
copyA = geneA;
copyB = geneB;
for(int i = pos; i < geneA.length; i++) {
geneA[i] = copyB[i];
geneB[i] = copyA[i];
}
System.out.println(Arrays.toString(geneA);
System.out.println(Arrays.toString(geneB);
}
しかし、geneBの要素が単純に3以上の指数でgeneAにコピーされますようです。コンソール出力は、次のとおりです。
[1, 0, 0, 1, 0]
[0, 1, 1, 1, 0]
任意の説明やヘルプは高く評価されています。前もって感謝します!
アンドレアス:
copyA = geneA
コピーを作成しません。両方の変数は、今を参照してください同じ配列。
配列全体をコピーするには、時間と空間を無駄にする必要はありません。
あなたが値を交換するとき、あなただけの一時的な変数の値の1を格納する必要があります。
private static void crossOver(int[] geneA, int[] geneB, int pos) {
for (int i = pos; i < geneA.length; i++) {
int temp = geneA[i];
geneA[i] = geneB[i];
geneB[i] = temp;
}
}
これは、インプレース配列を更新しますので、呼び出し側は変更が表示されます。
int[] geneA = {1,0,0,0,0};
int[] geneB = {0,1,1,1,0};
crossOver(geneA, geneB, 3);
System.out.println(Arrays.toString(geneA));
System.out.println(Arrays.toString(geneB));
出力
[1, 0, 0, 1, 0]
[0, 1, 1, 0, 0]