首页 > 解决方案 > 如何修复一个不接受它返回的函数?

问题描述

已经尝试使用返回功能,所以当我调用函数时,它将使用最后一代生成的解决方案,但相反,它只使用我用于第一代的随机生成的解决方案,而不使用最新的解决方案,这是python 中的遗传算法在倒计时时尝试使用“*,/,+,-”作为运算符和生成的六个数字来找到解决方案。

如果这是一个过于简单的错误,请原谅我,但我在网上找不到任何关于它为什么不能正确使用最新的 Generation/return 的信息。

Mutate,SecondGen并且CurrentPopFitness都是列表的列表, ([[]])Mutate通过交叉算法运行,对其进行变异并附加到SecondGen,然后计算适应度分数并将其CurrentPopFitness与给出该适应度的解决方案一起附加到然后将 50 个最佳解决方案附加到SecondGenMutate设置为等于它,正如我在最后通过打印检查时所做的那样,但是当它进入函数的下一次调用时又Mutate回到程序开始时的状态.

Mutate在函数结束之前将其设为 50 长。

我检查了最后的第二代与第一代的不同,但是,变异(第二代的内容在最后)仍然是我在外部生成的第一代功能; 当第二次和之后每次调用它时。

Target = random.randint(101,1000) 
track2 = 0
Mutate = [[5/6*24-4+3+2][2/5+100*50-7-8]....]
def OffspringMutation(SecondGen,Mutate):
   print(len(Mutate))
   for x in range(50):
      if track2 >= 1:
        SecondGen = SecondGen + 1*[[]]
        SecondGen[track2].append(CurrentPopFitness[x][1])
        SecondGen[track2].append(CurrentPopFitness[x][2])
        SecondGen[track2].append(CurrentPopFitness[x][3])
        SecondGen[track2].append(CurrentPopFitness[x][4])
        SecondGen[track2].append(CurrentPopFitness[x][5])
        SecondGen[track2].append(CurrentPopFitness[x][6])
        SecondGen[track2].append(CurrentPopFitness[x][7])
        SecondGen[track2].append(CurrentPopFitness[x][8])
        SecondGen[track2].append(CurrentPopFitness[x][9])
        SecondGen[track2].append(CurrentPopFitness[x][10])
        SecondGen[track2].append(CurrentPopFitness[x][11])
        track2 += 1
    Mutate = SecondGen    
    return(Mutate)



TruFal = True
while TruFal != False:
    stop = input("Type X to stop the Genetic Algorithm, otherwise press enter")
    if stop == "X":
        TruFal = False
    OffspringMutation(SecondGen,Mutate)

预期的结果是len(Mutate)在开始时大约是 60 长(我做了大约 60 长)。然后在函数的第二次调用(第二代)len(Mutate)应该是 50 长并且内容不同于它们在开始时设置的内容。

标签: pythongenetic-algorithm

解决方案


您没有记录OffspringMutation. 尽管您将对函数的引用传递Mutate给该函数,但此引用存储在与您指定的名称相同的局部变量中。因此,对其内容的任何操作都会更改原始内容,例如:追加、切片、删除等。但是这样做Mutate = SecondGen您并没有编辑引用的内容,而是告诉局部变量指向不同的引用,而不影响原始引用。通过这种逻辑,Mutate[:] = SecondGen(切片)之类的东西会改变原来的,但这对于函数来说是不好的做法。

Target = random.randint(101,1000) 
track2 = 0
Mutate = [[5/6*24-4+3+2][2/5+100*50-7-8]....]
def OffspringMutation(SecondGen,Mutate):
   print(len(Mutate))
   for x in range(50):
      if track2 >= 1:
        SecondGen = SecondGen + 1*[[]]
        SecondGen[track2].append(CurrentPopFitness[x][1])
        SecondGen[track2].append(CurrentPopFitness[x][2])
        SecondGen[track2].append(CurrentPopFitness[x][3])
        SecondGen[track2].append(CurrentPopFitness[x][4])
        SecondGen[track2].append(CurrentPopFitness[x][5])
        SecondGen[track2].append(CurrentPopFitness[x][6])
        SecondGen[track2].append(CurrentPopFitness[x][7])
        SecondGen[track2].append(CurrentPopFitness[x][8])
        SecondGen[track2].append(CurrentPopFitness[x][9])
        SecondGen[track2].append(CurrentPopFitness[x][10])
        SecondGen[track2].append(CurrentPopFitness[x][11])
        track2 += 1
    Mutate = SecondGen    
    return Mutate



TruFal = True
while TruFal != False:
    stop = input("Type X to stop the Genetic Algorithm, otherwise press enter")
    if stop == "X":
        TruFal = False
    Mutate = OffspringMutation(SecondGen,Mutate)

与最后一个循环具有相同逻辑的更简洁的方法是:

while True:
    stop = input("Type X to stop the Genetic Algorithm, otherwise press enter")
    Mutate = OffspringMutation(SecondGen,Mutate)
    if stop == "X":
    break

推荐阅读