Python中的模拟退火,While循环中的变量?

2024-09-29 21:28:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在写的遗传算法似乎永远也达不到任何一种模拟退火算法,但我现在写不出一种全局最优的。在

经过一段时间的测试,我认为问题似乎是将变量传回while循环。为了测试的目的,我修改了代码,基本上只接受比以前的解决方案能量增量更低的解决方案,所以我应该期望存储最佳解决方案的变量只显示一个较低的数字,但实际上是波动的,总是返回最新的解决方案,无论它是否更好。任何帮助都将不胜感激。在

while temperature >0.01:
    solutionlength = len(Solution)
    NeighbourSolution = Solution
    switch1 = i % solutionlength
    i +=random.randint(0,100)
    switch2 = i % solutionlength
    NeighbourSolution[switch1], NeighbourSolution[switch2] = NeighbourSolution[switch2], NeighbourSolution[switch1]
    EnergyOld = Solution.get_changeover_times()
    EnergyNew = NeighbourSolution.get_changeover_times()
    EnergyDelta = EnergyNew - EnergyOld

    if EnergyDelta < 0:
        acceptanceprob = 1

    else:
        acceptanceprob = 0 #math.exp(-EnergyDelta/temperature)

    if acceptanceprob > 0: #random.random():
        Solution = NeighbourSolution

    if Solution.get_changeover_times() < bestsolution.get_changeover_times():
        bestsolution = Solution

    print (bestsolution.get_changeover_times())

    temperature -= coolingrate

Tags: getifrandom解决方案solutiontemperaturetimesswitch2
1条回答
网友
1楼 · 发布于 2024-09-29 21:28:47

问题不在于“将变量传递回while循环”,因为只能将变量传递到函数中,而不能传递到循环中。在

问题是像NeighbourSolution = Solutionbestsolution = Solution这样的行仅仅使两个名称指向同一个对象。因此,如果你改变了Solution,你也在改变{}。当然,当你比较bestsolution.get_changeover_times()和{}时,一个对象的转换次数永远不会小于同一个对象的转换次数。

解决方案是对对象进行一个副本,而不仅仅是给它指定一个额外的名称。我不知道您的Solution是什么类型的对象,但是如果它是一个列表子类,您可以使用Solution[:]来复制它。或者它可能有一个.copy()方法,或者您可以使用copy模块。例如:

from copy import copy

# ...

bestsolution = copy(Solution)

copy.copy()是一个浅拷贝,意味着它创建一个新的顶级对象,但在其中放置对原始对象所包含的相同对象的引用。如果这不能完全起作用,请尝试copy.deepcopy(),它还可以复制包含的对象及其包含的任何对象,依此类推。在

相关问题 更多 >

    热门问题