2

宿題の一部に統一クロスオーバーアルゴリズムを作成しましたが、正しく機能していません。実際には、私の1ポイントのクロスオーバーよりも悪い結果が返されています。どこが間違っているのかを誰かに指摘してもらいたいので、修正してください:)。私は何年もの間努力してきました、そしてこれは私の最後の手段です!

    private void DoUniformCrossOver(int p1id,int p2id)
{
    ArrayList<Integer> p1 = population.get(p1id).GetRep();
    ArrayList<Integer> p2 = population.get(p2id).GetRep();
    ArrayList<Integer> c1 = new ArrayList<Integer>();
    ArrayList<Integer> c2 = new ArrayList<Integer>();

for (int i=0;i<nbits;++i)
{
    double selected = CS2004.UI(1,2);
    if (selected ==1)
    {
        c1.add(p1.get(i));
        c2.add(p2.get(i));
    }
    else
    {
        c1.add(p2.get(i));
        c2.add(p1.get(i));
    }
}

    population.add(new ScalesChrome(c1));
    population.add(new ScalesChrome(c2));
}

このメソッドは、パラメーターとして2つの親p1idとp2idを取り込みます。次に、表現の配列リスト(p1およびp2)を作成します。

forループでは、「nbits」は配列の重み(または配列の長さ)です。私のワンポイントクロスオーバーメソッドはforループでそれを使用し、問題なく機能します。

次に、1/2を生成して、各親から子が取得する遺伝子を決定します。

このアルゴリズムの適合性は非常に悪いです!! どんな助けでも大歓迎です。

どうもありがとう。

4

2 に答える 2

1

さて、まず、どのような情報をエンコードし、何を進化させようとしているのでしょうか。

解決しようとしている問題によっては、ある種のクロスオーバー戦略により、適切な解決策を見つけることができなくなります。

簡単な例:探しているソリューションに固有の対称性がある場合(たとえば、白/黒のセルオートマトン多数分類子)、遺伝的アルゴリズムがつまずいた可能性のある対称性を壊しているため、シングルポイントクロスオーバーでは非常に良い結果は得られません。 (たとえば、多数派分類器の場合、黒または白の分類は非常に優れていますが、両方ではないため、特定の-かなり低い-適合性よりも良くなることはありません)。

于 2011-03-21T12:33:37.570 に答える
0

(あなたが私のコメントに答えなかったので、私は答えとしてそれを繰り返します)

浮動小数点数に問題のある定数とdoubleを比較している場合は、を使用int selectedするとおそらくより適切になります。doubleを使用する必要がある場合は、次のようなものを使用してみてください。

if (selected < 1.5)
于 2011-03-20T07:27:32.353 に答える