翻转嵌套列表中的位
Flipping bits in nested lists
我有一个项目,其中我必须使用遗传算法的位翻转变异。
我目前的代码如下所示:
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_1
或 populations_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
的objective。
任何人都可以帮助我修改我目前拥有的代码以适应 populations_1 中的情况吗?我认为我目前拥有的代码仅适用于 populations_2。
任何 help/suggestion/readings 将不胜感激!谢谢!
您可以使用列表推导来做您想做的事。 pop
中的值仅在 r<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]]
我有一个项目,其中我必须使用遗传算法的位翻转变异。
我目前的代码如下所示:
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_1
或 populations_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
的objective。
任何人都可以帮助我修改我目前拥有的代码以适应 populations_1 中的情况吗?我认为我目前拥有的代码仅适用于 populations_2。
任何 help/suggestion/readings 将不胜感激!谢谢!
您可以使用列表推导来做您想做的事。 pop
中的值仅在 r<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]]