「METHINKS IT IS LIKE A WEASEL」アルゴリズムについて読んだ後、気まぐれで以下を書きました。pop_gen() で期待しているのは、Gib の 10 個のインスタンスが作成され、それぞれにランダムな名前が付けられ、リスト popul に格納されることです。代わりに取得するのは、同じ名前のインスタンスのリストです。実際にはインスタンスを 1 つだけ作成し、それを 10 回参照していると思いますが、理由がわかりません。リスト内包表記の代わりに for ループを使用して、代わりにランダム化された名前を変数として渡してみました。 Gib クラス自体のランダム化。
import random
import string
class Evolver:
def __init__(self, input_text, chance):
self.input_text = list(input_text)
self.gib_text = [random.choice(chars) for c in self.input_text]
self.chance = chance
self.popul = []
def pop_gen(self):
temp_popul = [Gib(self.gib_text, self.chance) for i in range(10)]
self.popul = temp_popul
class Gib:
def __init__(self, gib_text, chance):
self.name = self.mutator(gib_text, chance)
self.score = 0
def mutator(self, gib_text, chance):
for c in range(len(gib_text)):
if chance >= random.randint(1, 100):
gib_text[c] = random.choice(chars)
return gib_text
chars = string.uppercase
e = Evolver("TEST", 100)
e.pop_gen()
for p in e.popul:
print p, p.name
ありとあらゆる助けに感謝します!