列表中二进制向量的变异

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]]