尝试使用返回功能,因此当我调用函数时,它将使用最后生成的解决方案,但相反,它只使用我用于第一代的随机生成的解决方案,而不使用最新的,这是python中的遗传算法在倒计时时使用"*,/,+,-"作为运算符并生成六个数字。
如果这是一个过于简单的错误,请原谅我,但我在网上找不到任何关于为什么它不能正确使用最新一代/返回的内容。
Mutate
,SecondGen
和CurrentPopFitness
都是列表列表,([[]])Mutate
通过交叉算法运行并对其进行突变并附加到SecondGen
,然后计算Fitness分数并将其附加到CurrentPopFitness
以及提供该适合性的解决方案,然后将50个最佳解决方案附加到SecondGen
,并且Mutate
设置为等于它,正如我检查的那样但是,通过最后的打印,当它进入函数的下一次调用时,Mutate
又恢复到程序开始时的状态。
Mutate
在函数结束之前被设置为50长。
我已经检查了最后的第二代与第一代不同,但是,Mutate(第二代的内容在最后)最终仍然是我在函数之外生成的第一代;当第二次调用它时,每次之后。
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,并且内容与开始时设置的内容不同。
您没有记录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