Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 原始列表在应用遗传算子后发生变异_Python_Python 3.x - Fatal编程技术网

Python 原始列表在应用遗传算子后发生变异

Python 原始列表在应用遗传算子后发生变异,python,python-3.x,Python,Python 3.x,原始列表在应用遗传算子后发生变异 我正在使用下面的函数,将RANKEDCHROOS的一部分复制到newpop(列表列表列表),然后使用while循环将剩余列表添加到其中,直到newpop的长度等于预定的popSize。但是由于某种原因,newpop列表在实现while循环后发生了变化。在while循环中,我试图实现一些GA操作符,我所做的就是将新的个体附加到newpop列表中,这不应该变异newpop,但它确实变异了。不仅如此,甚至rankedChromos也因为某种原因发生了变异 def ne

原始列表在应用遗传算子后发生变异 我正在使用下面的函数,将RANKEDCHROOS的一部分复制到
newpop
(列表列表列表),然后使用while循环将剩余列表添加到其中,直到
newpop
的长度等于预定的
popSize
。但是由于某种原因,
newpop
列表在实现while循环后发生了变化。在while循环中,我试图实现一些GA操作符,我所做的就是将新的个体附加到
newpop
列表中,这不应该变异
newpop
,但它确实变异了。不仅如此,甚至rankedChromos也因为某种原因发生了变异

def nextGenPopulation (population, rankedPop, num_robots, crossover_rate):
    newpop = 0
    fitnessScores = [item[-1] for item in rankedPop ] # extract fitness scores                     
    rankedChromos = [item[0] for item in rankedPop ] # extract chromosomes 
    popSize = len(population)
    newpop = []
    print("\n fitness", fitnessScores)
    newpop.extend(rankedChromos[:int(popSize*0.4)]) # elitism
    print("newpop before operations", newpop)
    while len(newpop) < popSize:
        ind1, ind2 = selectFittest (fitnessScores, rankedChromos)
        ind1, ind2 = breed (ind1, ind2, num_robots, crossover_rate)
        newpop.append(ind1)
        newpop.append(ind2)
    print("\n newpop after operation", newpop)
    return newpop
newpop.extend(rankedChromos[:int(popSize*0.4)]
它实际上是在将第一个
int(popSize*0.4)-1
列表的
rankedChromos
中的列表引用复制到
newpop
,这意味着对这些列表的
rankehromos
的任何修改都将反映在
newpop
中,很可能是函数
selectFittest
正在变异
rankedChromos
,因此,您可以在变量
newpop
中看到变异,您可以使用它来消除这种行为

from copy import deepcopy

newpop = deepcopy(rankedChromos[:int(popSize*0.4)])

以下是一个了解您的问题的示例:

list_1 = [[1, 1], [2, 2], [3, 3], [4, 4]] # rankedChromos in your example
list_2 = [] # newpop in your example
list_2.extend(list_1[1: 3])
print('before operation',list_2)

# the function that mutates, selectFittest in your example
def some_fumction(l):
    for i in l:
        i[1:] = [-9]

some_fumction(list_1)

print('after operation',list_2)
输出:

before operation [[2, 2], [3, 3]]
after operation [[2, -9], [3, -9]]

不读这个问题,是的,python就是这样工作的。但是python库中的某个地方有一个deepcopy实用程序。我现在读这个问题,马上在文档中查找deepcopy。@Kenny Ostrom你是说copy import deepcopy的
?当他用python3.x标记他的问题时,我想他需要我们可能还需要一个有足够信息的文件来调用它并复制结果。你能添加
selectFittest
繁殖
或解释他们在做什么?虽然它有效,但当我再运行几次时,它又在做同样的事情确保有相同的输入:)详细信息很重要您是指相同的输入值还是相同的格式?每次生成新一代染色体时,该值都会发生变化。对于初始总体,我使用的是仅在开始时运行的随机生成器。这个问题似乎不是每次运行
nextGenPopulation
时都会发生,但它确实经常发生。我想我发现了我的问题。你提出的解决方案是正确的。我刚刚不得不在我的主函数中使用
deepcopy()
。它现在工作正常。谢谢!
before operation [[2, 2], [3, 3]]
after operation [[2, -9], [3, -9]]