2 f5 N: b5 Y4 g7 N 爬山法是完完全全的贪心法,每次都鼠目寸光的选择一个当前最优解,因此只能搜索到局部的最优值。模拟退火其实也是一种贪心算法,但是它的搜索过程引入了随机因素。模拟退火算法以一定的概率来接受一个比当前解要差的解,因此有可能会跳出这个局部的最优解,达到全局的最优解。以图1为例,模拟退火算法在搜索到局部最优解A后,会以一定的概率接受到E的移动。也许经过几次这样的不是局部最优的移动后会到达D点,于是就跳出了局部最大值A。 1 ]. q' ?3 S& w" v" e ( ~4 o; Q2 i) P5 H 模拟退火算法描述: 3 B2 y. O0 P; j0 l8 p* t 4 A$ y& T% b9 m 若J( Y(i+1) )>= J( Y(i) ) (即移动后得到更优解),则总是接受该移动 + U# K I1 C9 x0 ^9 B4 m/ O& J, ~) y' p3 [' s. q: X6 l! y! Q. P
若J( Y(i+1) )< J( Y(i) ) (即移动后的解比当前解要差),则以一定的概率接受移动,而且这个概率随着时间推移逐渐降低(逐渐降低才能趋向稳定)" x) Q* ~2 Q' c' A4 Z! o
}0 V' b$ L8 C# J2 S 这里的“一定的概率”的计算参考了金属冶炼的退火过程,这也是模拟退火算法名称的由来。- d" T2 f1 p3 L9 U4 u
6 V- I! F4 J0 V9 b# j
根据热力学的原理,在温度为T时,出现能量差为dE的降温的概率为P(dE),表示为:0 B: ~3 y: V0 K
: B$ D7 f6 s! ~4 z- x/ T' p% I
P(dE) = exp( dE/(kT) )( i; Q$ V$ s, b' m! [. b8 X$ Y
# a; M, ~4 C$ _- W- C 其中k是一个常数,exp表示自然指数,且dE<0。这条公式说白了就是:温度越高,出现一次能量差为dE的降温的概率就越大;温度越低,则出现降温的概率就越小。又由于dE总是小于0(否则就不叫退火了),因此dE/kT < 0 ,所以P(dE)的函数取值范围是(0,1) 。, T8 U& |" u" p7 b
7 W" U+ W/ D2 F* y; [. F 随着温度T的降低,P(dE)会逐渐降低。! Y8 x/ j2 d1 k3 _1 q* B
8 K k+ M% O4 l0 c3 v8 {0 R1 t. C" D 我们将一次向较差解的移动看做一次温度跳变过程,我们以概率P(dE)来接受这样的移动。* B; Q, r' ], d; p. X# A; y
0 ?2 \, f4 x. E# K" M# c& A
关于爬山算法与模拟退火,有一个有趣的比喻:& [6 L$ a6 a7 \/ ~8 L% Y3 {" d% C. w
, x, I- a, F/ x8 b
爬山算法:兔子朝着比现在高的地方跳去。它找到了不远处的最高山峰。但是这座山不一定是珠穆朗玛峰。这就是爬山算法,它不能保证局部最优值就是全局最优值。& C+ i! H9 o. B7 j6 i& D
: X6 l# t8 `; n 模拟退火:兔子喝醉了。它随机地跳了很长时间。这期间,它可能走向高处,也可能踏入平地。但是,它渐渐清醒了并朝最高方向跳去。这就是模拟退火。