Mutation on a binary string (genetic algorithm) - python-3.x
我使用的是python-3.x,我正在尝试对一个二进制字符串进行突变,该字符串会随机地将元素的一个位从0翻转到1或1到0,我尝试了一些方法,但没有成功,我不知道问题出在哪里:
1 2 3 4 5 6 7 8 | x=[0, 0, 0, 0, 0] def mutation (x, muta): for i in range(len(x)): if random.random() < muta: x[i] = type(x[i])(not x[i]) return x, print (x) |
例如,输出应该是x=[0,0,0,1,0]或x=[1,0,0,0,0]等等…
我也试过这个:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | MUTATION_RATE = 0.5 CHROMO_LEN = 6 def mutate(x): x ="" for i in range(CHROMO_LEN): if (random.random() < MUTATION_RATE): if (x[i] == 1): x += 0 else: x += 1 else: x += x[i] return x print(x) |
号
如有任何建议或建议,我们将不胜感激。
您还可以使用python的xor运算符来翻转位,它将在"1"和"0"之间翻转:
埃多克斯1〔3〕
另请参见:python xor首选项:位运算符与布尔运算符
在打印
1 2 3 4 5 | def mutation(x): # your code without the trailing comma mutation(x) print(x) |
在Python中,创建一个新列表通常比改变一个旧列表要好。我会这样写您的第一个函数(我将整数转换为布尔值,因为您只是翻转它们:
1 2 3 4 5 6 | x = [False, False, False, False] def mutation(x, muta): return [not e if random.random() < muta else e for e in x] |
号
通过重新分配来更改
1 | x = mutation(x, .5) |
如果删除
1 2 3 4 5 6 7 8 9 10 11 12 13 | def mutation(x, muta): for i in range(len(x)): if random.random() < muta: x[i] = type(x[i])(not x[i]) return x x = [False, False, False, False] mutation(x, .5) Out[8]: [False, False, True, False] mutation(x, .5) Out[9]: [True, True, True, False] |
。