我正在编写一个遗传算法,其中我需要从二进制列表 genotype
中选择 5 个数字并将它们翻转,因此 1
→ 0
和 0
→ 1
。我尝试将我的代码放入带有 range(1,6)
的循环中,但是当我这样做时,它仍然只更改了其中一个数字。下面是我没有循环的原始代码,它随机选择一个二进制值并对其进行变异。除了列表中的 5 个元素之外,有没有人知道这样做的更好方法?
genotype = [1,0,0,1,0,0,1,1,1,0]
def mutate(self):
gene = random.choice(genotype)
if genotype[gene] == 1:
genotype[gene] = 0
else:
genotype[gene] = 1
return genotype
最佳答案
虽然您的主要问题在 ilyankou 给出的答案后似乎已解决:
for i in random.sample(range(len(genotype)), 5):
genotype[i] ^= 1
并且建议了这种替代(更现实)的突变模型:
for i in [random.choice(range(len(genotype))) for _ in range(5)]:
genotype[i] ^= 1
我发现这个观察 很有挑战性 并且有点鼓舞人心
I tried putting my code in a loop with a range(1,6) however when I do this it still only changes one of the numbers.
这总是真的吗?可以或必须吗?
我尝试了以下代码的几次运行(我从您的原始代码中删除了多余的
self
)import random
genotype = [1,0,0,1,0,0,1,1,1,0]
def mutate():
gene = random.choice(genotype)
if genotype[gene] == 1:
genotype[gene] = 0
else:
genotype[gene] = 1
return genotype
print(genotype)
for _ in range(1,6):
mutate()
print(genotype)
并且只观察到这些输出:
[0, 0, 0, 1, 0, 0, 1, 1, 1, 0]
-- 索引 0 处的基因翻转 [1, 1, 0, 1, 0, 0, 1, 1, 1, 0]
-- 索引 1 处的基因翻转 事实上,这个 必须是这样的 奇数调用 到上面的
mutate
函数:因为
gene
是 0
和 1
之一,并且同一基因上的双翻转会重现初始值,所以只会保留与选择奇数次的基因索引相对应的突变,并且因为您将其称为 range(1, 6)
(奇数总数) ,整个过程中只有0
和1
之一可以是奇数。
关于python - 如何随机改变二进制列表中的 5 个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62005475/