宿題の一部に統一クロスオーバーアルゴリズムを作成しましたが、正しく機能していません。実際には、私の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を生成して、各親から子が取得する遺伝子を決定します。
このアルゴリズムの適合性は非常に悪いです!! どんな助けでも大歓迎です。
どうもありがとう。