gpt4 book ai didi

python - 如何随机改变二进制列表中的 5 个值?

转载 作者:行者123 更新时间:2023-12-03 18:40:05 25 4
gpt4 key购买 nike

我正在编写一个遗传算法,其中我需要从二进制列表 genotype 中选择 5 个数字并将它们翻转,因此 1001 。我尝试将我的代码放入带有 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 函数:

    因为 gene01 之一,并且同一基因上的双翻转会重现初始值,所以只会保留与选择奇数次的基因索引相对应的突变,并且因为您将其称为 range(1, 6)(奇数总数) ,整个过程中只有 01之一可以是奇数。

    关于python - 如何随机改变二进制列表中的 5 个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62005475/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com