我试图用循环改变一串位(参见下面的代码),但输入和输出是相同的。
bitstring = "100111001101010101010101"
print("old genome : " + bitstring)
for bit in bitstring:
if random.random() < 1:
print("old bit : " + bit)
bit = flipBit(bit)
print("new bit : " + bit)
bitstring= "".join(bitstring)
print("new genome : " + bitstring)
这给了我输出
old genome = 100111001101010101010101
new genome = 100111001101010101010101
我已检查(使用代码中的print语句)flipBit()函数是否有效。并且接缝正在工作......但是,输入的bitstring和输出是相同的。
我想做的是拒绝概率,例如
if random.random() < 0.05:
这样只有少数位发生变异。
答案 0 :(得分:1)
在python中,字符串是不可变的,这意味着您无法执行以下操作:
>> hello = "hello"
>>> for letter in hello:
letter = 'a'
>>> hello
'hello'
在上面的例子中,letter
只是一个新的标识符,分配给单词hello
的当前迭代中的字母值。因此,您可以使用该标识符执行任何操作,但这并不意味着它将更改hello
。
在尝试加入之前,您需要将字符串转换为列表,即
>>> new_word = []
>>> for letter in hello:
if letter == 'h':
new_word.append('a')
else:
new_word.append(letter)
>>> print ''.join(new_word)
aello
答案 1 :(得分:1)
问题在于:
for bit in bitstring:
if random.random() < 1:
print("old bit : " + bit)
bit = flipBit(bit)
print("new bit : " + bit)
当你这样做时:
bit = flipBit(bit)
您不会更改bitstring
中的位,而是将另一个值(由flipBit
返回)命名为bit
。
试试这个:
muted_bitstring = ""
for index, bit in enumerate(bitstring.spli()):
if random.random() < 1:
muted_bitstring += = flipBit(bit)
bitstring = muted_bitstring
答案 2 :(得分:0)
删除答案后,这是一个有效的实施方案:
import random
bitstring = "100111001101010101010101"
print("old genome : " + bitstring)
newGenome="".join(["10"[int(bit)] if random.random() < 0.05 else bit for bit in bitstring])
print("new genome : " + newGenome)