【问题标题】:Flipping bits in nested lists翻转嵌套列表中的位
【发布时间】:2020-06-15 18:12:36
【问题描述】:

我有一个项目,我必须使用遗传算法的位翻转突变。

到目前为止,我的代码如下所示:

def mutation(pop, mr):
    for i in range(len(pop)):
        if (random.random() < mr):
            if (pop[i] == 1):
                pop[i] = 0
            else:
                pop[i] = 1
        else:
            pop[i] = pop[i]
    return pop

mut = mutation(populations, 0.3)
print(mut)

例如,我有以下内容(取决于我的项目,populations 可能看起来像 populations_1populations_2):

populations_1 = [[1, 0], [1, 1], [0, 1], [1, 0]] 
populations_2 = [[1], [1], [0], [1]]

我正在做的是将随机生成的数字分配给populations 中的元素,并检查它是否小于mutation rate。如果是,那么bit-flip mutation 会发生,如果不是,它会照原样发生remain。对于populations_1的情况,如果populations_1 index 2小于突变率,那么它应该变成[1, 0]。对于populations_2 index 3,如果它小于突变率,它应该变成[0]。这是mutation function 的目标。

任何人都可以帮助我将我目前拥有的代码转换为适应诸如 population_1 中的情况吗?我认为我到目前为止的代码仅适用于 population_2。

任何帮助/建议/阅读将不胜感激!谢谢!

【问题讨论】:

  • 我不确定 population_1 索引 2 会发生什么,其中值为 [1,1]。在这种情况下,他们应该变成[0,0]?
  • @DavideBrex 如果它满足条件,那么它应该。 [0, 0] 也是如此。

标签: python-3.x mutation


【解决方案1】:

你可以使用列表推导来做你想做的事。 pop 中的值仅在 r&lt;mr 时更新。要更新它们,您可以遍历列表 pop[i] 中的每个元素 (a),如果 a == 0 变为 1,则变为 0。请参见下面的代码:

def mutation(pop, mr):
    for i in range(len(pop)):
        r = random.random()
        print(r) # you can remove this line, it is only for testing
        if r < mr:
            pop[i] = [1 if a == 0  else 0 for a in pop[i]]
    return pop

测试 1:

populations_1 = [[1, 0], [1, 1], [0, 1], [1, 0], [0,0]] 
mut = mutation(populations_1, 0.3)
print(mut)

#random number for each iteration
0.3952226177233832
0.11290933711515283
0.08131952363738537
0.8489702326753509
0.9598842135077205
#output:
[[1, 0], [0, 0], [1, 0], [1, 0], [0, 0]]

测试 2:

populations_2 = [[1], [1], [0], [1]]
mut = mutation(populations_2, 0.3)
print(mut)


0.3846024893833684
0.7680389523799874
0.19371896835988422
0.008814288533701364
[[1], [1], [1], [0]]

【讨论】:

  • 对于population_1索引1,如果满足突变条件,应该是这样。 [0, 0] 也是如此(如果生成的随机数小于 mr,则应为 [1, 1]。
  • 谢谢你!将尝试了解您提供的代码发生了什么。
  • 我更新了答案,现在我一分钟解释代码
  • 感谢您的解释。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 2021-06-11
  • 1970-01-01
  • 2017-05-24
相关资源
最近更新 更多