0

一言で言えば、私はどのように私は:

  • doubleからビットに行く、
  • 次に、クロスオーバー(1ポイント、2ポイント)を実行します。
  • に戻ってdouble

ルーレットホイールセレクションを開発できます。私がはっきりと見えないのは、2つのダブルを混ぜると「より良い」ダブルが得られるかもしれないということです。それは完全にランダムですか?私doublesと私の「最も弱い」ものの「最も適した」ものが組み合わさった場合、それらは中間点を生み出しませんdoubleか?

精緻化: ポイントからこの曲線までの最短距離

編集1:プログラムをあまり遅くすることなく。

編集2:私はを使用することを検討しましたbyte[]が、それが遺伝的アルゴリズムの部分に反するかどうかはわかりません。

4

3 に答える 3

1

ここで何が最善かは、ダブルの「意味」と、各ダブルが表すゲノムの部分の大きさによって異なります。多くの場合、最善のアプローチは、ダブルを離散として扱い、一度にダブル全体を交差させることです。

したがって、親が{0.1 0.2 0.30.40.5}および{0.60.70.8 0.9 1.0}の場合、次のようになります(例)。

  • {0.1 0.6 0.3 0.4 0.5}均一な選択(ランダムな親から各遺伝子を選択)
  • {0.1 0.2 0.3 0.9 1.0}シングルポイントクロスオーバー(最初のn個の遺伝子を一方の親から取得し、残りをもう一方の親から取得します。ここで、nは乱数です。
  • {0.1 0.7 0.8 0.4 0.5} 2点クロスオーバー下(2つの乱数を選択し、一方の親からもう一方の親にそれらの間に遺伝子を挿入します)
于 2013-01-31T12:42:15.197 に答える
1

これは私のために働いた:

BitArray BAA1 = new BitArray(BitConverter.GetBytes(a1));
BitArray BAA2 = new BitArray(BitConverter.GetBytes(a2));

    for (int i = r.Next(0, 64); i > 0; i--)
            {
                temp = BAA1.Get(i);
                temp2 = BAA2.Get(i);

                BAA1.Set(i, temp2);
                BAA2.Set(i, temp);


                temp = BAB1.Get(i);
                temp2 = BAB2.Get(i);

                BAB1.Set(i, temp2);
                BAB2.Set(i, temp);
            }

        byte[] tempbytes = new byte[BAA1.Length];

        BAA1.CopyTo(tempbytes, 0);
        double baa1 = BitConverter.ToDouble(tempbytes, 0);

        BAA2.CopyTo(tempbytes, 0);
        double baa2 = BitConverter.ToDouble(tempbytes, 0);

baa1とbaa2はクロスの最終製品です。

于 2013-02-01T04:15:24.927 に答える
-1

少し違うダブルスのクロスを実行する方が良いかもしれないと思います。1.02.0をお持ちの場合は、次のようにしてください。

  1. 真ん中を取る、(1.0 + 2.0)/ 2 = 1.5
  2. 小さな突然変異を追加します、1.5 * random(0.9、1.0)= 1.57

2つのdoubleのビットを混合すると、2つの親のいずれかとは大きく異なる子doubleが生成される可能性があります。

于 2013-01-27T22:56:41.603 に答える