我正在编写一个简单的遗传算法,变异算子要求我以一定的概率随机翻转“基因”(即:字符串中的单个字符)。
这是我需要随机翻转每个角色的列表示例:
a = ['0010010', '0011101', '1101101', '0100110', '1010100', '1000111', '1001110', '0010011', '0011111', '0001001', '0101000', '1010010', '1110000', '0000001', '1100111', '1001100', '1000001', '1001010']
我循环遍历列表中每个元素中的每个字符,以检查是否必须像这样翻转它:
for elem in a:
for char in elem:
r = random.random()
if r<prob:
# Flip the char.
f_char = 1-int(char)
# Replace the new flipped char in the element?
(其中prob
是固定的浮动[0,1]
)
我不确定在必须的情况下如何使用新的翻转字符更新elem
。我还需要这个过程尽可能快地运行,因为我的实际列表有点大。
答案 0 :(得分:3)
两种选择:
一,您可以使用整数列表而不是字符串。然后,就地改变它们:
a = [[0, 0, 1, 0, 0, 1, 0], [0, 0, 1, 1, 1, 0, 1]]
for elem in a:
for i, bit in enumerate(elem):
r = random.random()
if r < prob:
elem[i] = 1 - bit
二,您仍然可以使用字符串,但是每次要更改其中的一个字符时都必须替换整个字符串,因为Python字符串是不可变的。最好的方法是使用生成器理解,如在inspectorG4dget的答案中:
a = ['0010010', '0011101']
for i, elem in enumerate(a):
a[i] = ''.join(str(1 - int(char)) if random.random() < prob else char
for char in elem)
答案 1 :(得分:2)
字符串是不可变的,所以当你甚至改变染色体中的一个基因时,你将不得不替换染色体列表中的整个染色体。所以试试这个:
for i,elem in enumerate(a):
a[i] = ''.join(char if random.random()>prob else str(1-int(char)) for char in elem)