模拟退火

简介

模拟退火来自冶金学的专有名词退火。退火是将材料加热后再经特定速率冷却，目的是增大晶粒的体积，并且减少晶格中的缺陷。材料中的原子原来会停留在使内能有局部最小值的位置，加热使能量变大，原子会离开原来位置，而随机在其他位置中移动。退火冷却时速度较慢，使得原子有较多可能可以找到内能比原先更低的位置。
模拟退火的原理也和金属退火的原理近似：我们将热力学的理论套用到统计学上，将搜寻空间内每一点想像成空气内的分子；分子的能量，就是它本身的动能；而搜寻空间内的每一点，也像空气分子一样带有“能量”，以表示该点对命题的合适程度。算法先以搜寻空间内一个任意点作起始：每一步先选择一个“邻居”，然后再计算从现有位置到达“邻居”的概率。
可以证明，模拟退火算法所得解依概率收敛到全局最优解。

初始化

由一个产生函数从当前解产生一个位于解空间的新解，并定义一个足够大的数值作为初始温度。

停止准则

迭代过程的停止准则：温度T降至某最低值时，完成给定数量迭代中无法接受新解，停止迭代，接受当前寻找的最优解为最终解。

退火方案

在某个温度状态T下，当一定数量的迭代操作完成后，降低温度T，在新的温度状态下执行下一个批次的迭代操作。

伪代码

寻找能量E（s）最低的状态s
s := s0; e := E (s)                           // 設定目前狀態為s0，其能量E (s0)
k := 0                                       // 評估次數kwhile k < kmax and e > emin                  // 若還有時間（評估次數k還不到kmax）且結果還不夠好（能量e不夠低）則：
  sn := neighbour (s)                         //   隨機選取一鄰近狀態sn
  en := E (sn)                                //   sn的能量為E (sn)
  if random() < P(e, en, temp(k/kmax)) then  //   決定是否移至鄰近狀態sn
    s := sn; e := en                         //     移至鄰近狀態sn
  k := k + 1                                 //   評估完成，次數k加一return s                                     // 回傳狀態s