import random
chosen=[[[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [3], [0]],
[[0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0], [5], [2]]]
def mutation(chosen, mp):
for i in range(len(chosen)):
if random.random() < mp:
chosen[0][i] = type(chosen[0][i])(not chosen[0][i])
return (chosen)
mp=0.9 #probability
mutated=mutation(chosen, mp)
print (mutated)
假设chosen
代表群体中的选定个体,我试图根据给定的概率改变二元向量(在随机位置)。并将其返回到不同的列表中(我仍然不确定是否需要额外的列表)。
它没有按预期工作,任何人都知道代码中可能出现的问题?
File "<ipython-input-229-91852a46fa82>", line 9, in mutation
chosen[0][i] = type(chosen[0][i])(not chosen[0][i])
TypeError: 'bool' object is not iterable
此外,如果有人知道更方便的方式,那将非常受欢迎。
谢谢!
答案 0 :(得分:2)
我仍在猜你想要什么,但如果你只想翻转其中一个二进制位:
import random
chosen=[[[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [3], [0]],
[[0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0], [5], [2]]]
def mutation(chosen, mp):
for i in range(len(chosen)):
if random.random() < mp:
pos = random.randrange(len(chosen[i][0]))
chosen[i][0][pos] = 0 if chosen[i][0][pos] else 1
# before
for item in chosen:
print(item)
print()
mutation(chosen, 1) # 100% of the time, for now
# after
for item in chosen:
print(item)
输出(注意最后一位已更改,行中第3位已更改):
[[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [3], [0]]
[[0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0], [5], [2]]
[[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0], [3], [0]]
[[0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0], [5], [2]]