【问题标题】:Simple Mutation with a Probability有概率的简单突变
【发布时间】:2020-12-24 10:22:25
【问题描述】:

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

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 .

非常感谢您在解决这两个问题方面的帮助。

【问题讨论】:

  • 请用您尝试过的代码更新您的问题。
  • omg... 你不仅在应该使用randrange 的地方使用了randint,而且在你应该使用randint 的地方也设法使用了randrange。你总是写一个零。
  • "另外,通常 0 被替换为 0,因此输出没有变化,所以我想限制它的方式是 0 只会变异为 1 并且1 突变为 0。”大约一半的时间,是吗?也许你可以想出一个规则来告诉你设置值的概率是多少,这说明了设置值实际上并没有翻转它的可能性?
  • 无论如何,您是否尝试过looking at the documentation for the random module 来尝试找到您想要的东西?或者,也许您可​​以想办法将例如“0 到 1 之间的随机数”翻译成“某事发生的 X 概率”? (提示:概率可能具有的最大可能值是多少?概率可能具有的最小可能值是多少?
  • @superbrain 感谢您引起我的注意。一般来说,我对编码很陌生,即使在文档的帮助下,我的理解也很基础,所以我想在尝试调整其他代码时,我把它们混在一起了。将对其进行更多研究并牢记在心。干杯!

标签: python random probability genetic-algorithm dplyr


【解决方案1】:

简历

  • 以选定的概率改变任何值
  • 随机选择位置
  • 选择位置时,在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)

【讨论】:

  • 感谢您的回答!您介意解释一下range(10) 的作用吗?
  • @Gfizz 仅用于演示目的,展示 10 种可能的突变尝试
【解决方案2】:
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)

【讨论】:

    【解决方案3】:

    你可以这样做:

    对于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]
    

    【讨论】:

    • 这里,每个位置都有5%的几率变异,而不仅仅是一个随机位置。不过,这个问题在这方面并不完全清楚。这可能正是他们想要的。
    • @Wups 我会说,如果这就是他们想要的,他们就不会经历选择随机索引来更改的麻烦......
    • @Wups 改变了我对这两种情况的解决方案。感谢您的反馈!
    • 感谢您提供和解释这两个选项,@Wups 这是一个非常好的观点 - 感谢您提出!第一种方法几乎是我所追求的,因为我只想单独更改索引而不是整个数据集。
    猜你喜欢
    • 2010-12-24
    • 1970-01-01
    • 2020-10-21
    • 2020-03-18
    • 2015-06-19
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多