gpt4 book ai didi

python函数正在改变一个全局变量

转载 作者:太空宇宙 更新时间:2023-11-04 09:43:47 26 4
gpt4 key购买 nike

我正在尝试在 python 中实现遗传算法。我有六个人的初始人口。我测量它们的适应度和成为下一代的概率,并选择三对进行交配,交配概率为 0.7。为了进行交叉,我将配对和交配概率传递给一个函数。

new_population = cross_over(pairsg, mating_prob)

其中 pairsg 是选择交配的配对,交配概率 是二进制列表(如果 1 进行交叉,如果 0 不进行)。 问题是 cross_over 函数改变了原始种群,尽管其中从未使用过种群变量

def cross_over(prs, mp):
new = []
for pr in prs:
if mp[prs.index(pr)] == 1:
index = np.random.choice([1,2,3], p=[1/3, 1/3, 1/3])
pr[0][:index], pr[1][:index] = pr[1][:index], pr[0][:index]

for pr in prs:
new.append(pr[0])
new.append(pr[1])

return new

这是完整的代码:

from random import *
import numpy as np

#fitness function
def fit(x):
return 15*x -x**2

#covert binary list to decimal number
def to_dec(x):
return int("".join(str(e) for e in x), 2)

#picks pairs from the original population
def gen_pairs(populationl, prob):
pairsl = []
test = [0, 1, 2, 3, 4, 5]
for i in range(3):
pair = []
for j in range(2):
temp = np.random.choice(test, p=prob)
pair.append(populationl[temp])
pairsl.append(pair)

return pairsl

#mating function
def cross_over(prs, mp):
new = []
for pr in prs:
if mp[prs.index(pr)] == 1:
index = np.random.choice([1,2,3], p=[1/3, 1/3, 1/3])
pr[0][:index], pr[1][:index] = pr[1][:index], pr[0][:index]

for pr in prs:
new.append(pr[0])
new.append(pr[1])

return new


population = [[1,0,1,0], [0,1,1,0], [1,0,0,1], [1,1,1,0],[1,1,0,0],[1,0,0,0]]
fittness = [fit(to_dec(y)) for y in population]

s = sum(fittness)
prob = [e/s for e in fittness]
pairsg = gen_pairs(population.copy(), prob)

mating_prob = []
for i in pairsg:
mating_prob.append(np.random.choice([0,1], p=[0.3,0.7]))

new_population = cross_over(pairsg, mating_prob)

最佳答案

问题是您要在

中制作 副本
gen_pairs(population.copy(), prob)

但是您复制了外部列表,但没有复制子列表数据(这是一个副本)。所以

pr[0][:index], pr[1][:index] = pr[1][:index], pr[0][:index]

更改原始数据(因为 pair.append(populationl[temp]) 也没有复制但使用相同的子列表引用)

您必须按照子列表的引用来弄清楚。

一旦您理解了这个问题,就有很多方法可以避免它。在某个时候复制子列表。

你可以这样做:

gen_pairs([x.copy() for x in population], prob)

创建“深拷贝”(或copy.deepcopy(population)))

或者替换

pair.append(populationl[temp])

通过

pair.append(populationl[temp].copy())

关于python函数正在改变一个全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50610520/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com