模拟退火算法
本篇为关于模拟退火算法的个人笔记。因为网上的资料不够综合,所以自己写了一份。会根据自己的见解持续更新。
名称来源
退火指物体逐渐降温冷却的物理现象。温度越低,物体的能量越低,在结晶状态时系统的能量状态到达最低。在自然中,缓慢降温(退火)可以导致结晶,而与之相对的快速降温(淬火)会导致不是最低能态的非晶体形态。
该算法的名称借用了这个说法。
符号说明
$E$ 物体的能量
$T$ 物体的温度
$k$ 玻尔兹曼常数
物理含义
根据热力学的原理,在温度为$T$时,出现能量差为$dE$的降温的概率为$p(dE)$,表示为:
$$p(dE) = e^{-\frac{dE}{kT}}$$
温度越高,出现一次能量差为$dE$的降温的概率就越大;温度越低,则出现降温的概率就越小。
基本思想
模拟退火算法是通过赋予搜索过程一种时变且最终趋于零的概率突跳性,从而有效避免陷入局部最优并最终趋于全局最优的优化算法。
即不同于只考虑局部最优的贪心算法,模拟退火算法会以一定的概率 $p$ 接受比当前差的解,因此有可能跳出局部的最优解,到达全局最优解。
一般认为该概率 $p$ 以 $e^{- \frac{\Delta E}{kT}}$ 时最优,即:
$$p = \left\{ \begin{aligned} &e^{-\frac{E(x_{new})-E(x_{old})}{kT}} & E(x_{new})> E(x_{old}) \\ &1 & E(x_{new}) < E(x_{old}) \end{aligned} \right.$$
由上式可知,温度越高,接受比当前差的解的概率越高;温度越低,则接受比当前差的解的概率越小。
算法步骤
1 设置初始温度$T$,温度下限$T_{min}$,初始解状态$x$,每个$T$值的迭代次数$L$
2 产生新解$x_{new}=x+ \Delta x$,$\Delta x$随机
3 计算目标函数差值$dE$,若$dE<0$,则接受新值,若否则$random(0,1)$,当 $p$ 大于该随机数时,接受新值。此时$x = x_{new}$
4 在当前温度下执行$L$次2-3
5 $T= \alpha T$ $\alpha$一般取接近1的值
6 $if$ $T<T_{min}$ $end$,$else$返回2