3

以前の回答を確認しましたが、うまくいきませんでした。

次のコードがあります

public static void createPopulation(ArrayList<City> city)
{
    for (int i = 0; i<gen.getSize(); i++)   {   
        ArrayList<City> copy = new ArrayList<City> (city); //added from previous question
        Collections.shuffle(copy, new Random(seed));
        gen.add(copy);
    }
}

コメントのある行の有無にかかわらず、一度シャッフルしますが、再度シャッフルすることはありません。これは、母集団のメンバーをシャッフルする必要がある GP アルゴリズムです (まあ、その始まりです)。

4

1 に答える 1

10

これは、Randomオブジェクトを再作成するためです。

これを行う :

Random r = new Random(seed);
for (int i = 0; i<gen.getSize(); i++)   {   
    ArrayList<City> copy = new ArrayList<City> (city); //added from previous question
    Collections.shuffle(copy, r);
    gen.add(copy);
}

javadocから:

Random の 2 つのインスタンスが同じシードで作成され、それぞれに対して同じ一連のメソッド呼び出しが行われる場合、それらは同一の数列を生成して返します。

のインスタンスはRandom、ランダム関数を呼び出すたびに状態が変更されるジェネレーターです。ここでは、この状態を最初のシード ベースの状態にリセットしたくありません。これは、返される数値のシーケンスが同じになるためです。そのため、シャッフルごとに新しいインスタンスを再作成したくないのです。

于 2013-04-08T12:04:48.473 に答える