列表内的二进制向量的变异

时间:2017-11-12 20:35:47

标签: python python-3.x genetic-algorithm mutation

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

此外,如果有人知道更方便的方式,那将非常受欢迎。

谢谢!

1 个答案:

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