python - 如何修复一个不接受它返回的函数?
问题描述
已经尝试使用返回功能,所以当我调用函数时,它将使用最后一代生成的解决方案,但相反,它只使用我用于第一代的随机生成的解决方案,而不使用最新的解决方案,这是python 中的遗传算法在倒计时时尝试使用“*,/,+,-”作为运算符和生成的六个数字来找到解决方案。
如果这是一个过于简单的错误,请原谅我,但我在网上找不到任何关于它为什么不能正确使用最新的 Generation/return 的信息。
Mutate
,SecondGen
并且CurrentPopFitness
都是列表的列表, ([[]])Mutate
通过交叉算法运行,对其进行变异并附加到SecondGen
,然后计算适应度分数并将其CurrentPopFitness
与给出该适应度的解决方案一起附加到然后将 50 个最佳解决方案附加到SecondGen
并Mutate
设置为等于它,正如我在最后通过打印检查时所做的那样,但是当它进入函数的下一次调用时又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 长并且内容不同于它们在开始时设置的内容。
解决方案
您没有记录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
推荐阅读
- c# - 需要帮助按属性选择 xml 节点
- mongodb - Prisma、MongoDB、Docker“对 http://localhost:4466/ 的请求失败,原因:连接 ECONNREFUSED 127.0.0.1:4466”
- javascript - 当我希望它覆盖另一个图像时,我的图像似乎锁定在块显示中
- php - 此集合实例上不存在图像
- python - 如何在命令提示符下将 python 变量传递给进程
- javascript - 当 app.use 使用导入的中间件函数时 express.js api 请求挂起
- git - Github 发布 - 如何部署发布
- r - 使用 ggplot 以两种不同的方式进行分组
- javascript - 使用 Webpack 和 React 创建一个 2 页网站( index.html 和 another.html )
- pandas - 处理 pandas 中的列表