一. 爬山算法 ( Hill Climbing ) $ B$ z1 z! p# N3 V- Y) ?: j6 y$ R: F1 Z7 A' n* z) j
介绍模拟退火前,先介绍爬山算法。爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解。/ B5 K6 {8 Y5 j) d9 x1 g1 O
. L; M3 k5 e, r 爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解。如图1所示:假设C点为当前解,爬山算法搜索到A点这个局部最优解就会停止搜索,因为在A点无论向那个方向小幅度移动都不能得到更优的解。 7 t; E; \& I7 q% N% w4 L7 p2 a ) K: V. {2 U2 [+ h( ]3 k) p7 c j# g+ n/ ]% j& E' z) k二. 模拟退火(SA,Simulated Annealing)思想 7 i' J( t* q7 R: u* x7 I7 b4 S
爬山法是完完全全的贪心法,每次都鼠目寸光的选择一个当前最优解,因此只能搜索到局部的最优值。模拟退火其实也是一种贪心算法,但是它的搜索过程引入了随机因素。模拟退火算法以一定的概率来接受一个比当前解要差的解,因此有可能会跳出这个局部的最优解,达到全局的最优解。以图1为例,模拟退火算法在搜索到局部最优解A后,会以一定的概率接受到E的移动。也许经过几次这样的不是局部最优的移动后会到达D点,于是就跳出了局部最大值A。 / o6 L/ `$ T& w# J% q$ T% L , j8 i3 w& D1 g 模拟退火算法描述:0 j/ {; j6 x0 U
# M W# m; u0 b, [9 f
若J( Y(i+1) )>= J( Y(i) ) (即移动后得到更优解),则总是接受该移动' b. `" Y$ d, Z [& _5 j9 F! X
w1 T- ]* I: `3 h& X* c
若J( Y(i+1) )< J( Y(i) ) (即移动后的解比当前解要差),则以一定的概率接受移动,而且这个概率随着时间推移逐渐降低(逐渐降低才能趋向稳定) " q$ g: X8 e' o - W& I7 t; t, p8 }, Q+ J: T 这里的“一定的概率”的计算参考了金属冶炼的退火过程,这也是模拟退火算法名称的由来。 & p5 A1 Q4 z: I, s 6 ?- r& d/ s* H$ ^; r" T 根据热力学的原理,在温度为T时,出现能量差为dE的降温的概率为P(dE),表示为: . n1 K* I- ~2 s: G& U% h+ h, n! T
P(dE) = exp( dE/(kT) ) 3 p$ k5 Z7 {- d% ~! }/ ? T, L: @5 |0 c5 Y% W6 j 其中k是一个常数,exp表示自然指数,且dE<0。这条公式说白了就是:温度越高,出现一次能量差为dE的降温的概率就越大;温度越低,则出现降温的概率就越小。又由于dE总是小于0(否则就不叫退火了),因此dE/kT < 0 ,所以P(dE)的函数取值范围是(0,1) 。 9 B: Z5 t# q# x+ @0 |# [ 8 }, L' r. ?9 E9 H% G& ~. F; G 随着温度T的降低,P(dE)会逐渐降低。 8 \4 U, d( p9 t- O/ q1 o- z% j : ?2 h2 A9 R; F2 A 我们将一次向较差解的移动看做一次温度跳变过程,我们以概率P(dE)来接受这样的移动。+ U2 Z7 |/ `8 G8 ]
. |$ P' b' g* V% T) N 关于爬山算法与模拟退火,有一个有趣的比喻:' R. H+ z# s# s3 s* I. j! _" L K8 h
" M" s! J* ]! z; j7 u, b% Q
爬山算法:兔子朝着比现在高的地方跳去。它找到了不远处的最高山峰。但是这座山不一定是珠穆朗玛峰。这就是爬山算法,它不能保证局部最优值就是全局最优值。; {8 q' |: [* L1 O) p
) c4 j) i: o2 ^/ f 模拟退火:兔子喝醉了。它随机地跳了很长时间。这期间,它可能走向高处,也可能踏入平地。但是,它渐渐清醒了并朝最高方向跳去。这就是模拟退火。