7

私は現在、遺伝的アルゴリズムの非常に単純な例を実現しようとしています。

ある時点で、「子供」を得るために、2 つの数字 (親) で「クロスオーバー」(生物学) を行う必要があります。

クロスオーバーの説明は、次の場所にあります。

2 つの文字列を「クロスオーバー」する方法 (1234 & abcd -> 12cd & ab34)

(2番目の図、より簡単な「ワンポイント」クロスオーバーは、私がやろうとしているものです。)

染色体(親と子)は数字ですが、「クロスオーバー」はビット操作になります。

次の「染色体」の1つの解決策を見つけました。

  • ビット X 量を右に移動します ( >>>operator )
  • 次に、ビットを再びX位置に移動しますが、今回は左に移動します(<<演算子)

したがって、これは染色体の 1 つの末尾を保持し、先頭を 0 で埋めます。

しかし、もう一方の染色体の問題を解決してからクロスオーバーを行う方法がよくわかりません。

(おそらく、染色体の最初と最後を保持し、残りを 0 で埋めた XOR です。)

または、この問題に別の角度からアプローチする必要がありますか?

4

2 に答える 2

4

クロスオーバーの割合が p (たとえば、p = .25) の場合、これは機能するはずです。

mask1 = ((0xffff >> 16*p) << 16*p)
mask2 = 0xffff ^ mask1
output1 = (input1 & mask1) ^ (input2 & mask2)
output2 = (input1 & mask2) ^ (input2 & mask1)

いくつかのメモ:

  • これは単なる疑似コードです。そこにいくつかのキャストが必要になる場合があります。
  • これは、上記のコメントで p を扱う場合とは異なる方法で p を扱います。(p の定義を取得するには、p を 1-p に置き換えるだけです。)
于 2012-07-29T01:11:24.740 に答える
1

単純なアプローチは、4 つのローカル変数を使用することです。

int chromatid1Start;
int chromatid1End;
int chromatid2Start;
int chromatid2End;

次に、chromatid1最初の 2 つの変数とchromatid2最後の 2 つの変数に入力を割り当てます。

chromatid1Start = chromatid1;
chromatid1End = chromatid1;
chromatid2Start = chromatid2;
chromatid2End = chromatid2;

Start交差点まで染色分体変数で右シフトを実行し、次に正確に同じ量を左シフトします。染色分End体変数では、クロス オーバー ポイントまで左シフトしてから、まったく同じ量だけ右シフトします。

chromatid1Start = (chromatid1Start >> 16 * crossoverPercent) << 16 * crossoverPercent;
chromatid1End = (chromatid1End << 16 * (1 - crossoverPercent)) >> 16 * (1 - crossoverPercent);
chromatid2Start = (chromatid2Start >> 16 * crossoverPercent) << 16 * crossoverPercent;
chromatid2End = (chromatid2End << 16 * (1 - crossoverPercent)) >> 16 * (1 - crossoverPercent);

これにより、一方の開始点をもう一方の終了点と交差させることができます。

int daughterChromatid1 = chromatid1Start + chromatid2End;
int daughterChromatid2 = chromatid2Start + chromatid1End;
于 2012-07-29T01:16:10.873 に答える