_& I* f1 @9 U- p x 一般而言,局部搜索就是基于贪婪思想利用邻域函数进行搜索,若找到一个比现有值更优的解就弃前者而取后者。但是,它一般只可以得到“局部极小解”,就是说,可能 0 G% X7 s' [% _0 x3 \7 i I这只兔子登“登泰山而小天下”,但是却没有找到珠穆朗玛峰。而模拟退火,遗传算法,禁忌搜索,神经网络等从不同的角度和策略实现了改进,取得较好的“全局最小解 ”。& m- @3 N& W, m0 z! m9 G6 X
: s! T/ v1 b, a& p- W - C5 E3 c; m. M" P2 m 模拟退火算法(Simulated Annealing,SA) 6 h! a8 [' `, B, K# C 0 n3 U) [9 @5 u. ?! I2 K0 N
5 Q8 x+ z& _5 R7 q
模拟退火算法的依据是固体物质退火过程和组合优化问题之间的相似性。物质在加热的时候,粒子间的布朗运动增强,到达一定强度后,固体物质转化为液态,这个时候再. `3 @7 O/ y0 h6 v5 S* {
进行退火,粒子热运动减弱,并逐渐趋于有序,最后达到稳定。! U L: Q* |4 Y& H, J9 |4 F
2 q1 S: {4 N& [5 N & O! I# w" {1 { a2 H( V
模拟退火的解不再像局部搜索那样最后的结果依赖初始点。它引入了一个接受概率p。如果新的点(设为pn)的目标函数f(pn)更好,则p=1,表示选取新点;否 0 ?. Q$ M) Q& i/ H* M则,接受概率p是当前点(设为pc)的目标函数f(pc),新点的目标函数f(pn)以及另一个控制参数“温度”T的函数。也就是说,模拟退火没有像局部搜索那 % I1 n5 [4 B' B; i T( e4 w, {; m样每次都贪婪地寻找比现在好的点,目标函数差一点的点也有可能接受进来。随着算法的执行,系统温度T逐渐降低,最后终止于某个低温,在该温度下,系统不再接受变 6 \! [5 M" C& G: T3 d化。/ X% w- q; r) v: U% L; {2 B$ ~
* m* J9 f `4 V. Q8 V
+ C6 A7 d! Q1 p1 ]2 N: n2 N6 M
模拟退火的典型特征是除了接受目标函数的改进外,还接受一个衰减极限,当T较大时,接受较大的衰减,当T逐渐变小时,接受较小的衰减,当T为0时,就不再接受衰 6 ]- v h& w6 [# L1 v减。这一特征意味着模拟退火与局部搜索相反,它能避开局部极小,并且还保持了局部搜索的通用性和简单性。 ' g8 Q: Y. J4 g1 ~0 m; y$ l+ q 在物理上,先加热,让分子间互相碰撞,变成无序状态,内能加大,然后降温,最后的分子次序反而会更有序,内能比没有加热前更小。就像那只兔子,它喝醉后,对比较 5 t( S8 h' i" b, a3 I/ V& o. x近的山峰视而不见,迷迷糊糊地跳一大圈子,反而更有可能找到珠峰。( j: w; s% E0 w7 s, b4 U' I
7 X$ |# q8 B0 k " e, t+ z8 N8 D2 m. Z8 h8 \
值得注意的是,当T为0时,模拟退火就成为局部搜索的一个特例。 $ W) j- I8 b/ i( V : z' Y- K/ a! Z' E+ x
4 t; n' g( |- z9 n 模拟退火的伪码表达: 6 V. H, B3 q5 h3 @0 L! V procedure simulated annealing / j8 l r9 X; F( @0 |8 E9 l4 P0 \1 O& i4 G
begin , J0 |$ Y8 x J _$ B1 G8 v
t:=0; ) T- I% T6 i6 ~- F5 e5 f9 c. ^ initialize temperature T 4 Y9 H$ M$ P7 P1 [: w0 a
select a current string vc at random; + L. N6 |: h9 o1 g+ t1 p$ E0 n
evaluate vc; u! O2 Q& T4 a4 s/ c, E4 P7 F& @ repeat 3 ~$ t+ {$ v4 o! \% I& s repeat 4 U0 }& f$ r# E# o select a new string vn in the neighborhood of vc; (1) 1 u+ v5 o& H) U. |3 q6 j3 W; h if f(vc) then vc:=vn; ' H4 C3 j6 v: P( W" A
else if random [0,1] then vc:=vn; ! e y7 Z6 K1 V/ n7 X) Y until (termination-condition) (3) - M; a" t, F: |4 q) q/ v+ w$ J+ H T:=g(T,t); (4) ; K) j4 O2 Z6 L. J7 G T:=t+1; ! b1 L+ S9 g7 h2 a0 L" w7 z! w until (stop-criterion) (5) " k3 G9 s; a4 Z5 m$ P end; " d2 t& Y3 |+ D7 W' r5 x- C/ E- i
, k3 Q' u- `; j) f% a9 K* u" u7 Y ( z1 D$ \6 X0 o8 s& W7 i- x 上面的程序中,关键的是(1)新状态产生函数,(2)新状态接受函数,(3)抽样稳定准则,(4)退温函数,(5)退火结束准则: R) Z' R: z8 i% `* D7 C$ y
(简称三函数两准则)是直接影响优化结果的主要环节。虽然实验结果证明初始值对于最后的结果没有影响,但是初温越高,得到高质量解的概率越大。所以,应该尽量选, j& \' t3 `( u. j C
取比较高的初温。 : M3 Z0 f# `4 h - T7 j8 i0 ?+ x% R7 |8 N; W
7 s/ R% |) r; g+ S
上面关键环节的选取策略: d2 u2 Z$ s( S( O/ ^5 L7 ^3 @ (1)状态产生函数:候选解由当前解的邻域函数决定,可以取互换,插入,逆序等操作产生,然后根据概率分布方式选取新的解,概率可以取均匀分布、正态分布、高斯/ R( M+ e3 S- f: {6 W2 ^
分布、柯西分布等。, J2 B- J2 N( ^/ a' U; Q3 H8 A
6 F8 l% S$ n8 Y, p' t% ? (4)杂交:按照杂交概率(pc)进行杂交。杂交操作是遗传算法中最主要的遗传操作。通过杂交操作可以得到新一代个体,新个体组合了其父辈个体的特性。杂交体现 7 x, m6 r* P3 W% O" I4 {' |8 ^! k了信息交换的思想。 2 c3 z( Z! ?/ J( E9 U ; d' ~2 U2 [& c: N- ` 3 l' j! O3 f3 u6 [9 p+ b
可以选定一个点对染色体串进行互换,插入,逆序等杂交,也可以随机选取几个点杂交。杂交概率如果太大,种群更新快,但是高适应性的个体很容易被淹没,概率小了搜 # c9 A4 ]) F2 a3 @/ Z( E( l6 O索会停滞。 4 |8 v: D: q# v* C9 @; s & w* _6 S+ C+ m8 C4 \4 c# G
3 f/ E. v3 i6 u+ D' Z- _
(5)变异:按照变异概率(pm)进行变异。变异首先在群体中随机选择一个个体,对于选中的个体以一定的概率随机地改变串结构数据中某个串的值。同生物界一样, GA中变异发生的概率很低。变异为新个体的产生提供了机会。, _! ]! u7 v% h; H6 \ q8 h
! Z$ i* g% n) j. V b2 N
! b3 U% Y& t+ d. B% R3 y
变异可以防止有效基因的缺损造成的进化停滞。比较低的变异概率就已经可以让基因不断变更,太大了会陷入随机搜索。想一下,生物界每一代都和上一代差距很大,会是 3 k' b: A( V- N0 w; I% E5 q( h怎样的可怕情形。 9 \0 i9 D `8 Q ; z/ K1 Y/ M7 L8 f8 N* ^+ o* C ; _ |" O5 s' H2 T7 y1 @ 就像自然界的变异适和任何物种一样,对变量进行了编码的遗传算法没有考虑函数本身是否可导,是否连续等性质,所以适用性很强;并且,它开始就对一个种群进行操作 o$ n. p* |1 b
,隐含了并行性,也容易找到“全局最优解”。0 Y; s& ]9 D9 o% o) n: y
1 @' Y( {: f0 N9 t! i9 W" ^
! K3 Z( O7 I7 D; H; C. @. I 禁忌搜索算法(Tabu Search,TS) 9 \2 {, O7 z/ L$ N& Z9 b / {0 O/ F0 V( y; `, Y" `/ G # j7 J2 p9 x5 ]1 |! w 为了找到“全局最优解”,就不应该执着于某一个特定的区域。局部搜索的缺点就是太贪婪地对某一个局部区域以及其邻域搜索,导致一叶障目,不见泰山。禁忌搜索就是% X2 x6 ~5 r5 E9 c2 G2 J
对于找到的一部分局部最优解,有意识地避开它(但不是完全隔绝),从而获得更多的搜索区间。兔子们找到了泰山,它们之中的一只就会留守在这里,其他的再去别的地' e* E) P4 Z) i
方寻找。就这样,一大圈后,把找到的几个山峰一比较,珠穆朗玛峰脱颖而出。 ) c9 [" K1 |3 ? 0 z. G- e9 @, _' A
$ {" @1 P/ ~& L; _) E 当兔子们再寻找的时候,一般地会有意识地避开泰山,因为他们知道,这里已经找过,并且有一只兔子在那里看着了。这就是禁忌搜索中“禁忌表(tabu ; l& x5 Z5 N) S7 ~" f
list)”的含义。那只留在泰山的兔子一般不会就安家在那里了,它会在一定时间后重新回到找最高峰的大军,因为这个时候已经有了许多新的消息,泰山毕竟也有一 - H) D+ C" l9 c5 P6 g# d3 H. H个不错的高度,需要重新考虑,这个归队时间,在禁忌搜索里面叫做“禁忌长度(tabu 6 v: v6 r3 d. ^2 y T
length)”;如果在搜索的过程中,留守泰山的兔子还没有归队,但是找到的地方全是华北平原等比较低的地方,兔子们就不得不再次考虑选中泰山,也就是说,当! ^7 b& s. ]2 v$ J
一个有兔子留守的地方优越性太突出,超过了“best ' ?# l+ U: \. x! i to ) l* H6 O* j: ]( k* y4 ?+ X f far”的状态,就可以不顾及有没有兔子留守,都把这个地方考虑进来,这就叫“特赦准则(aspiration : ], V: q+ L8 A1 x' [8 y" v
criterion)”。这三个概念是禁忌搜索和一般搜索准则最不同的地方,算法的优化也关键在这里。# f, m* w' [) j. B! S4 [/ P0 E+ Z h- E
) _+ O) ~4 i, C9 R0 `4 v" F7 O
7 A( g. R( O3 q2 l H' S 伪码表达:' K% H8 d$ y+ E' I" v) \
procedure tabu search; & N6 _; u6 G1 n% n* }0 r
begin ! s5 l9 ?% d' {8 ]2 r( e8 y
initialize a string vc at random,clear up the tabu list; 2 B( P3 s( M# t# d; j. n$ e3 L cur:=vc; - S9 i$ a: [5 k& w. }5 y
repeat ; s& D: v6 r$ r, t4 F* i& ^
select a new string vn in the neighborhood of vc; ! _- J7 R2 O( w7 B" [. k' ]8 t
if va>best_to_far then {va is a string in the tabu list} ; n D9 E& I, \, g& l6 o' D begin " e+ U! ^: ?3 {2 [ cur:=va; $ ]/ k9 w& T: l let va take place of the oldest string in the tabu list; . x* S2 Y' x5 W/ d) q! ?- Y/ r& J% I
best_to_far:=va; ) n3 h9 O Y `& [3 {
end else 8 W$ ?, z- c7 T( J begin 6 E; h* j9 K( z. ]# W
cur:=vn; & U" {' V% e7 C* \) T) L( K let vn take place of the oldest string in the tabu list; 0 z# u& S$ U7 E1 i: P, w6 }
end; - J+ P, m0 b+ { until (termination-condition); 9 R$ G x/ w U Y' c( _ end; 0 J z4 n1 w$ @7 N; f " a8 i* p b4 _" u6 {& E6 d * ?4 f9 Y, B/ v# I( z; { 以上程序中有关键的几点:0 m# y3 X/ t% C X
(1)禁忌对象:可以选取当前的值(cur)作为禁忌对象放进tabu - |& M H. c5 j3 G7 c2 g3 ^* d/ I list,也可以把和当然值在同一“等高线”上的都放进tabu 5 c5 R$ U( g; D2 h( R! P! |
list。 ; G" Y/ k# V; F+ E0 `+ }/ t) p6 W9 ~ (2)为了降低计算量,禁忌长度和禁忌表的集合不宜太大,但是禁忌长度太小容易循环搜索,禁忌表太小容易陷入“局部极优解”。0 t; p+ f7 Q* ]- w, d: i
+ t$ _& v' `& G( v6 C9 d7 B; D4 K
) z# t/ _& i T (3)上述程序段中对best_to_far的操作是直接赋值为最优的“解禁候选解”,但是有时候会出现没有大于best_to_far的,候选解也全部被禁的 “死锁”状态,这个时候,就应该对候选解中最佳的进行解禁,以能够继续下去。9 h& |# m+ c2 i& I& v2 p3 x. z
+ u) i; p: @2 Q3 Y 9 ]( B' m- e D4 [( D (4)终止准则:和模拟退火,遗传算法差不多,常用的有:给定一个迭代步数;设定与估计的最优解的距离小于某个范围时,就终止搜索;当与最优解的距离连续若干步1 i2 k; |" c5 A" ]; p( C
保持不变时,终止搜索;/ u9 s5 f1 ~; a" n
3 p9 ]6 m' [6 |6 i% u7 w / W& s; a! t+ c9 Z 禁忌搜索是对人类思维过程本身的一种模拟,它通过对一些局部最优解的禁忌(也可以说是记忆)达到接纳一部分较差解,从而跳出局部搜索的目的。% Q* D E/ k5 g/ k/ e
/ Z T; t, e( i7 y: h
t) g& |8 h, E, M
人工神经网络(Artificial Neural Network,ANN): l5 Z9 ~4 X2 J- n
( J5 `9 n8 W9 Q8 e
. L6 P: |6 U' `" M: O
神经网络从名字就知道是对人脑的模拟。它的神经元结构,它的构成与作用方式都是在模仿人脑,但是也仅仅是粗糙的模仿,远没有达到完美的地步。和冯·诺依曼机不同* E5 ?1 K( H: u+ Z* {
,神经网络计算非数字,非精确,高度并行,并且有自学习功能。% ~% f- v8 s* `! y0 c; {; B
9 R% j( r. h. [9 y7 ?# m& s: M8 e0 s/ o
9 u# |, R/ C% m( H$ ] 生命科学中,神经细胞一般称作神经元,它是整个神经结构的最基本单位。每个神经细胞就像一条胳膊,其中像手掌的地方含有细胞核,称作细胞体,像手指的称作树突,4 ]% j& Q! U) r% ?& D6 ~
是信息的输入通路,像手臂的称作轴突,是信息的输出通路;神经元之间错综复杂地连在一起,互相之间传递信号,而传递的信号可以导致神经元电位的变化,一旦电位高* U# K' S9 b( g" m
出一定值,就会引起神经元的激发,此神经元就会通过轴突传出电信号。 ' Y3 \* O1 J8 M4 \ u5 L- a1 N- f( q+ g, C $ G( K5 H) ?; H- D* Z 而如果要用计算机模仿生物神经,就需要人工的神经网络有三个要素:(1)形式定义人工神经元;(2)给出人工神经元的连接方式,或者说给出网络结构;(3)给出' a2 N* T/ U: ~, }/ o
人工神经元之间信号强度的定义。 3 z8 r8 A5 |- C1 c0 f . X1 R! W. l l