从csexchange转载:
Let s = s0
For k = 0 through kmax (exclusive):
T ← temperature( 1 - (k+1)/kmax )
Pick a random neighbour, snew ← neighbour(s)
If P(E(s), E(snew), T) ≥ random(0, 1):
s ← snew
Output: the final state s
我很难理解这个算法在温度降低时如何避免被卡在局部最优解中。如果我们在温度较高时跳来跳去,随着温度的降低最终只采取上坡移动,那么所找到的解决方案不是高度依赖于我们在搜索空间中结束时所处的位置吗?我们可能早期找到一个更好的解决方案,在温度高的时候跳出它,然后在温度降低时和我们过渡到爬坡时处于更糟糕的位置。
常见的修改方法之一是记录到目前为止找到的最佳解决方案。我理解这个改变如何减轻了在温度高的探索阶段“抛弃”更好的解决方案的风险,但我不认为这比仅仅执行反复的随机爬坡以对空间进行采样是更好的。
另一种想到的方法是将“迄今为止最好”的跟踪思想与重复的爬山和束搜索相结合。对于每个温度,我们可以执行模拟退火并跟踪最佳的'n'个解决方案。然后对于下一个温度,从这些本地峰值中的每一个开始。
更新:
- 如果不进行修改来跟踪全局最佳解,即使有温度组件,这个算法也会极易陷入局部最优解,是吗?是的,我了解随着温度降低(例如,它转变为纯爬山),采取更差的移动的概率会下降,但可能在开发阶段早期就找到了更好的解决方案,然后从中跳出,随着温度的降低,你没有回头的路,因为你走上了通往新的局部峰值的路径。
- 通过跟踪全局最优解的添加,我完全可以看出这如何减轻陷入局部峰值的问题,避免了上述问题。但是,这如何改进简单的随机搜索?一个具体的例子是重复的随机爬山。如果你正在跟踪全局最优解,并且在高温部分碰巧达到它,那基本上就是一次随机搜索。
- 在什么情况下,这个算法比重复的随机爬山之类的算法更可取,为什么?什么样的问题特别适合 SA 而不是其他替代方案。