具有概率的简单突变

Simple Mutation with a Probability

根据下面的代码部分,我正在尝试实现一个自动和随机的变异过程。

data = [0,1,0,0,0,0,0,1,0,0,1,1,0,0,1]

data[random.randint(0,len(data)-1)]=random.randrange(0,1)

print(data)

该代码是我发现的其他一些帖子的改编版,尽管它每次都会用 0 或 1 随机改变一个值。我要求这只以一定的概率发生(例如 0.05 的机会)突变)而不是总是得到保证。

此外,通常 0 会被 0 替换,因此输出没有变化,所以我想将其限制为 0 只会变异为 1 而 1 会变异为一个 0.

非常感谢您帮助解决这两个问题。

继续

  • 以选定的概率改变任何值
  • 随机选择位置
  • 选择位置后,在01之间切换
def mutate(data, proba=0.05):
    if random.random() < proba:
        data[random.randrange(len(data))] ^= 1    

if __name__ == '__main__':
    data = [0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1]
    for i in range(10):
        mutate(data)
        print(data)

您可以进行以下操作:

对于data中的每个元素,仅当random()函数生成的随机值小于定义的变异概率时才对其进行变异(1 - val)。

例如:

import random

mutation_prob = 0.05

data = [0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1]

mutated_data = [1 - x if random.random() < mutation_prob else x for x in data]

如果要将数据作为一个整体来决定突变,你可以这样做:

mutation_prob = 0.05

data = [0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1]

do_mutation = random.random() < mutation_prob
mutated_data = [1 - x if do_mutation else x for x in data]
import random

def changeData(data):
  seed = random.randint(0,1000)
  # probability of 0.05 (50 / 1000)
  if seed <= 50:
     indexToChange = random.randint(0,len(data)-1)
  # change 0 with 1 and viceversa
     data[indexToChange] = 1 if data[indexToChange]  == 0 else 0
 
if __name__== '__main__':
   data = [0,1,0,0,0,0,0,1,0,0,1,1,0,0,1]
   for i in range(0,100):
     changeData(data)
   print(data)