列表中二进制向量的变异
Mutation of a binary vector inside a list
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
代表人口中的选定个体,我试图根据给定的概率对二元向量(在随机位置)进行变异。 return 它在不同的列表中(我仍然不确定是否需要额外的列表)。
它并没有真正按预期工作,有人知道代码中可能有什么问题吗?
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
此外,如果有人知道更方便的方法,我们将非常欢迎。
谢谢!
我还在猜测你想要什么,但如果你只想翻转一个二进制位:
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)
输出(注意行中最后一位已更改,第三位已更改):
[[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]]
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
代表人口中的选定个体,我试图根据给定的概率对二元向量(在随机位置)进行变异。 return 它在不同的列表中(我仍然不确定是否需要额外的列表)。
它并没有真正按预期工作,有人知道代码中可能有什么问题吗?
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
此外,如果有人知道更方便的方法,我们将非常欢迎。
谢谢!
我还在猜测你想要什么,但如果你只想翻转一个二进制位:
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)
输出(注意行中最后一位已更改,第三位已更改):
[[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]]