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

标签 python random genetic-algorithm

我正在编写一个遗传算法,其中我需要从二进制列表 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/

    相关文章:

    python - 需要编写Python脚本的一部分来保存数据并将其写入文件

    python - 键和列表的字典 - 如果列表中的任何值都为空,则删除键

    c# - 使用Aforge遗传算法库实现一条兼作基因的染色体?

    python - 理解列表的问题(我认为)

    python - 如何在打印函数中定义变量?

    python - 为什么这个随机选择器总是选择相同的选择

    javascript - 你如何防止 javascript 中的 Math.random() 多次选择相同的数字?

    mysql - 选择随机行,但不重复另一列中的值

    algorithm - 遗传算法中的最佳发现

    genetic-algorithm - 遗传算法选择和交叉问题