模拟退火算法中的邻居选择

时间:2013-04-06 16:52:36

标签: algorithm artificial-intelligence simulated-annealing

选择邻居时应该考虑算法的温度吗?那么,例如,如果在选择邻居时温度很高,那么应该进行排列吗?或者温度是否只影响接受概率?

3 个答案:

答案 0 :(得分:3)

后者是正确的:只有接受概率受温度的影响。温度越高,越接受局部最优的“坏”动作越多。如果你预先选择能量值较低的邻居,你基本上会与模拟退火的想法相矛盾,并把它变成一个贪婪的搜索。

来自Wikipedia的伪代码:

s ← s0; e ← E(s)                                  // Initial state, energy.
sbest ← s; ebest ← e                              // Initial "best" solution
k ← 0                                             // Energy evaluation count.
while k < kmax and e > emax                       // While time left & not good enough:
  T ← temperature(k/kmax)                         // Temperature calculation.
  snew ← neighbour(s)                             // Pick some neighbour.
  enew ← E(snew)                                  // Compute its energy.
  if P(e, enew, T) > random() then                // Should we move to it?
    s ← snew; e ← enew                            // Yes, change state.
  if enew < ebest then                            // Is this a new best?
    sbest ← snew; ebest ← enew                    // Save 'new neighbour' to 'best found'.
  k ← k + 1                                       // One more evaluation done
return sbest                                      // Return the best solution found.

答案 1 :(得分:3)

我也有同样的问题,但我认为另一篇文章Basics of Simulated Annealing in Python的回答表明T与选择邻居有关是非常合理的。

  

选择邻居也取决于您的问题。限制邻域的主要原因是,一旦你找到一个合适的解决方案,即使你后来转向更糟糕的解决方案,你至少留在附近。直觉是大多数客观函数都有些平滑,所以好的解决方案将靠近其他好的解决方案。因此,您需要一个足够小的社区,让您接近良好的解决方案,但大到足以让您快速找到它们。您可以尝试的一件事是随着时间的推移减少邻域(例如,使其与温度成比例)。 - hun于2013年11月4日20:58

答案 2 :(得分:3)

以下是来自维基百科的描述,其中指出实际上应该针对某些问题计算温度。

  

高效的候选人生成

     

启发式的更精确的陈述是应该尝试第一个候选状态s&#39;其中P(E(s),E(s&#39;),T)很大。对于&#34;标准&#34;上面的接受函数P,意味着E(s&#39;) - E(s)大约为T或更小。因此,在上面的旅行推销员示例中,可以使用交换两个随机城市的neighbor()函数,其中选择城市对的概率随着距离增加超过T而消失。

这确实意味着确定邻居时温度可能是相关因素。

关于如何编写邻居函数的更有用的阅读:How to efficiently select neighbour in 1-dimensional and n-dimensional space for Simulated Annealing