1

ランダム選択と累積選択の違いを示すRichard Dawkin のWeasel Programの Python バージョンを試していますが、突然変異アルゴリズムに問題があります。おそらく、Python ランダム ライブラリの使用方法を理解していないのではないかと考えています。問題のあるコードは次のとおりです。

#Cumulative selection guesser
while counter <  2:
    for i in range(gen):
        for j in range(len(child)):
            mutation = random.randint(0,99)
            if mutation in range(5):
                 child[j] = random.choice(chars)
        offspring.append(child)
    counter += 1

"Counter" はテストに使用され、コードが完成するとターゲット フレーズとの同等性テストに変更されます。"child" は 28 のランダムな文字のリストです。"gen" は世代の数であり、単なる定数です。 100 や 50 などの数値、「chars」は大文字のアルファベットとスペース文字の文字列、「offspring」は空のリストです。生成されたすべての「子」を入れたいと思います。これが意味をなさない場合は、残りのコードを含めますが、私が抱えている主な問題は、各世代のすべての子供がまったく同じであることです.

起こるべきことは、コードが「子」の各要素を通過し、突然変異のためにサイコロを振ることです。突然変異が発生した場合、子の特定の要素が新しいランダムな文字に変更されます。次に、「子供」が子孫のリストに追加されます。したがって、子孫は次のようになります。

DDSMHYODHFZTZRKWQQYGMLUDB

DDSMHYODHFZTZRKW M UQYGMLUDB

DDSM I HYODHFZTZRKWQUQYGMLUDB

D P SMMHYODHFZTZRKWQUQYGML Q DB

(バリエーションは太字)

変数「gen」で指定された回数。代わりに、次のように、各子をバリエーションなしでまったく同じにします。

DDSMHYODHFZTZRKWQQYGMLUDB

DDSMHYODHFZTZRKWQQYGMLUDB

DDSMHYODHFZTZRKWQQYGMLUDB

DDSMHYODHFZTZRKWQQYGMLUDB

問題が何であるかを把握するために長い時間を費やし、コードの各部分を個別にテストしてみましたが、期待どおりに機能しているようです。私が考えることができる唯一のことは、「random.randint()」が呼び出されたときにランダムな整数を1回しか生成しないため、「mutation」の値は変化していないということです。これがランダム関数の仕組みですか?for ループの反復ごとに、新しい乱数整数が生成されることを期待します。

誰かに何か考えや提案があれば、私はそれを感謝します. ここで壁に頭をぶつけています。また、役立つ場合は、コード全体を投稿できます。ありがとう!

4

1 に答える 1

1

childに追加する前にコピーを作成してくださいoffspring

offspring.append(child[:])

child[:]と同じ内容の新しいリストを返しますchild。これは新しいリストであるため、の将来の変更は影響しchildませんchild[:]

これを行わないと、まったく同じリストoffspringへの複数の参照が含まれます。したがって、のすべてのミューテーションは、のすべてのアイテムに影響します。のすべてのアイテムは、の最後の値に等しくなります。childoffspringoffspringchild

于 2013-01-01T10:03:48.357 に答える