我想在不同情况下使用模拟退火。网上的每个模拟退火算法都提供了带有温度示例的算法。比如在维基百科上
s ← s0; e ← E(s) // 初始状态,能量。
sbest ← s; ebest ← e // 初始“最佳”解
k ← 0 // 能量评估计数。
while k < kmax and e > emax // 当时间未用完且未达到足够好时:
T ← temperature(k/kmax) // 温度计算。
snew ← neighbour(s) // 选择某个邻居。
enew ← E(snew) // 计算其能量。
if P(e, enew, T) > random() then // 我们应该移动到那里吗?
s ← snew; e ← enew // 是的,改变状态。
if enew < ebest then // 这是新的最佳吗?
sbest ← snew; ebest ← enew // 保存‘新邻居’到‘找到的最佳’。
k ← k + 1 // 完成一次评估
return sbest // 返回找到的最佳解。
现在,这个’T’通常代表什么?假设我将模拟退火用于国际象棋。我将使用这个算法为电脑找到下一步。我有当前状态(S)及其值(e)。我有下一状态(snew)及其值(enew)。那么对于国际象棋,’T’会是什么?我需要它吗!这个算法是否有任何通用形式?我是说,没有这个温度示例,我可以得到基本的概念!我找不到任何这样的信息。请帮助我。提前感谢……
回答:
网上的所有示例都使用温度示例,因为这是模拟退火的标准术语——SA是一种受物理启发的技术,模拟了一个称为退火的现实现象。这与所有关于遗传算法的示例谈论基因和染色体非常相似。
如果你足够深入地追溯数学背景,会发现各种优化元启发式方法和一些物理过程之间存在一些引人入胜的联系,通常由熵的概念来桥接。
但从非常粗略的角度来说,模拟退火中的温度T对应于算法“跳出”局部最小值寻找全局(或至少是更好的局部)最小值的意愿或能力。高温度对应于更高的随机性,更多地跳跃,甚至可能最终进入更差的配置;低温度对应于较低的随机性(最终完全是贪婪算法),无论局部最小值多么浅,都无法逃脱。
至于如何将这个想法应用到你的应用中,这需要一些洞察力和创造力,才能让大多数元启发式方法正确运作。但你永远不会找到不讨论温度的SA讨论。