1

成功编写了遗传算法后,我现在正在编写一个模拟退火程序来与 GA 进行比较,但似乎无法让它达到任何一种最优,更不用说全局最优了。

经过一些测试,我认为问题似乎是将变量传递回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
4

1 回答 1

0

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

问题是一条线像NeighbourSolution = Solutionbestsolution = Solution仅仅使两个名称都指向同一个对象。因此,如果你改变 egSolution你也在改变bestsolution. 当然,当您比较bestsolution.get_changeover_times()Solution.get_changeover_times(),一个对象的转换时间永远不会少于同一对象的转换时间。

解决方案是制作对象的副本,而不是仅仅为其分配一个附加名称。我不知道你Solution是什么类型的对象,但如果它是一个列表子类,你可以Solution[:]用来复制它。或者它可能有一个.copy()方法,或者你可以使用copy模块。例如:

from copy import copy

# ...

bestsolution = copy(Solution)

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

于 2016-01-12T20:58:17.407 回答