本帖最后由 梦里花111 于 2013-9-25 22:28 编辑 , `0 l: t0 ~8 d- F0 c5 E" z# r8 c/ d) z% j5 q: E+ s# T2 B" S' n/ {9 {
在工程实践中,经常会接触到一些比较“新颖”的算法或理论,比如:等。这些算法或理论都有一些共同的特性(比如模拟自然过4 ?! b- q- x0 I" h2 T' t% G0 L8 @# M" o
程),通称为“智能算法”。它们在解决一些复杂的工程问题时大有用武之地。* I3 A' b- V" a0 D! }" R
u$ p' \& ]; o$ W' j* D, r
4 \1 w g* I# e! ] `) v' s
这些算法都有什么含义?首先给出个局部搜索,模拟退火,遗传算法,禁忌搜索的形象比喻:5 K( s5 t6 Z2 w; @, ^
# M* ~- F! H" C; Q" b/ h. l 2 c! n9 W3 g* T5 z2 e 为了找出地球上最高的山,一群有志气的兔子们开始想办法。 ! z1 e/ F4 s* J. d5 J" \ & V1 ~9 _$ N# m9 z$ p! x
* q" n+ l+ ^! x! |9 J 1.兔子朝着比现在高的地方跳去。他们找到了不远处的最高山峰。但是这座山不一定是珠穆朗玛峰。这就是局部搜索,它不能保证局部最优值就是全局最优值。; [0 ?$ ]( Z+ B. C6 N
$ X( H; r; y- ]( l# v 1 i) i/ E- s# G9 `
2.兔子喝醉了。他随机地跳了很长时间。这期间,它可能走向高处,也可能踏入平地。但是,他渐渐清醒了并朝最高方向跳去。这就是模拟退火。 # T5 h2 L6 p/ |# g# j" H 6 T7 B4 j4 \/ r& g _4 `$ G9 c % F/ m; B3 ^' Z0 v, P8 N 3.兔子们吃了失忆药片,并被发射到太空,然后随机落到了地球上的某些地方。他们不知道自己的使命是什么。但是,如果你过几年就杀死一部分海拔低的兔子,多产的 1 T% M' @: H4 f9 c- u0 @% M兔子们自己就会找到珠穆朗玛峰。这就是遗传算法。 - J0 R( g" x& d D" m( w 3 u7 A2 l; _* i( u6 b& ?! W7 v / T1 r6 H3 @6 x3 i+ m5 v! d5 W 4.兔子们知道一个兔的力量是渺小的。他们互相转告着,哪里的山已经找过,并且找过的每一座山他们都留下一只兔子做记号。他们制定了下一步去哪里寻找的策略。这 8 V- K5 r/ ?6 w. t% s+ ~, K1 W& L就是禁忌搜索。0 k9 i6 N' ]8 q' {9 d
: N0 r- ]# c3 W3 [& C
9 X9 N' }4 t# A9 t2 }
智能优化算法的概述 4 ^" @6 O; c( K0 r' Y9 L- O ) @+ z5 e4 J8 D
) X9 @0 |" h, }. X V3 Q/ E) M 智能优化算法要解决的一般是最优化问题。最优化问题可以分为(1)求解一个函数中,使得函数值最小的自变量取值的函数优化问题和(2)在一个解空间里面,寻找最 / S4 R F0 E7 t$ K& q" e优解,使目标函数值最小的组合优化问题。典型的组合优化问题有:旅行商问题(Traveling . m9 q) R: _( v6 I+ B Salesman Problem,TSP),加工调度问题(Scheduling 2 R3 R4 o# ?4 a" @ Problem),0-1背包问题(Knapsack + _" D8 p$ F6 b7 {+ E
Problem),以及装箱问题(Bin Packing Problem)等。! G3 p+ a4 p8 I1 v5 s3 n, m: Z% T; i
优化算法有很多,经典算法包括:有线性规划,动态规划等;改进型局部搜索算法包括爬山法,最速下降法等,本文介绍的模拟退火、遗传算法以及禁忌搜索称作指导性搜 5 R) s l. T- @8 r索法。而神经网络,混沌搜索则属于系统动态演化方法。9 M4 J. B- L" a/ j# ~7 D
/ |3 `6 {# Z7 G& d
, @. }# m p2 K4 b) E! @2 w- l6 w0 s
优化思想里面经常提到邻域函数,它的作用是指出如何由当前解得到一个(组)新解。其具体实现方式要根据具体问题分析来定。 3 D1 C& m4 x6 \+ e' a* k: D: D ! V& R4 J" O" f / Y$ Q1 e+ |9 V2 [6 e: X# Z) @
一般而言,局部搜索就是基于贪婪思想利用邻域函数进行搜索,若找到一个比现有值更优的解就弃前者而取后者。但是,它一般只可以得到“局部极小解”,就是说,可能7 t& ]; M1 m- ^9 m' q( |
这只兔子登“登泰山而小天下”,但是却没有找到珠穆朗玛峰。而模拟退火,遗传算法,禁忌搜索,神经网络等从不同的角度和策略实现了改进,取得较好的“全局最小解 ”。1 n& n. h5 E+ C9 r2 G+ Z
1 i0 }$ {# y/ m) S: O: C
/ X* e2 m& [9 _
模拟退火算法(Simulated Annealing,SA) , ]5 ~) p7 A/ @& g0 e ( B1 N6 d+ n2 } W" l1 @* \6 B @# A( _ 9 r, e3 j7 a7 m- v5 Y o 模拟退火算法的依据是固体物质退火过程和组合优化问题之间的相似性。物质在加热的时候,粒子间的布朗运动增强,到达一定强度后,固体物质转化为液态,这个时候再 - A/ J* B2 H' H! A进行退火,粒子热运动减弱,并逐渐趋于有序,最后达到稳定。3 x0 x* W; j& O9 p0 }7 D
# v' n% A; ~1 w4 Q+ B7 k# W ) T( i: n9 M; }% W2 T; ^( Y* L) w- z
模拟退火的解不再像局部搜索那样最后的结果依赖初始点。它引入了一个接受概率p。如果新的点(设为pn)的目标函数f(pn)更好,则p=1,表示选取新点;否8 n* E Y! g; c7 F- b! ~+ x
则,接受概率p是当前点(设为pc)的目标函数f(pc),新点的目标函数f(pn)以及另一个控制参数“温度”T的函数。也就是说,模拟退火没有像局部搜索那 4 S3 L% ]% v; a9 i2 S样每次都贪婪地寻找比现在好的点,目标函数差一点的点也有可能接受进来。随着算法的执行,系统温度T逐渐降低,最后终止于某个低温,在该温度下,系统不再接受变 ( B9 p+ K/ a+ C' X化。 , l- W( n) L5 M5 I6 L6 B8 d 8 i+ @$ |6 M2 D8 a
) O$ c$ e5 b s. }5 e, q 模拟退火的典型特征是除了接受目标函数的改进外,还接受一个衰减极限,当T较大时,接受较大的衰减,当T逐渐变小时,接受较小的衰减,当T为0时,就不再接受衰 6 y6 p! y" Y1 E4 }: E减。这一特征意味着模拟退火与局部搜索相反,它能避开局部极小,并且还保持了局部搜索的通用性和简单性。' V- e$ x4 P' C! H7 x- v
在物理上,先加热,让分子间互相碰撞,变成无序状态,内能加大,然后降温,最后的分子次序反而会更有序,内能比没有加热前更小。就像那只兔子,它喝醉后,对比较+ ]. F/ X9 y+ ~7 j& ?8 d
近的山峰视而不见,迷迷糊糊地跳一大圈子,反而更有可能找到珠峰。& _- r) L( F/ n b' P4 R
- j) ]9 P7 V& b, f% b& m
+ ?+ v( E" p! |( ~: q4 H- E2 @ 值得注意的是,当T为0时,模拟退火就成为局部搜索的一个特例。" T4 j: Y9 Q) e: d
# w4 C: p; A8 p, m
7 z- k3 C: L; [1 a# X
模拟退火的伪码表达:1 r; r& B! F( |5 d' F4 Y3 r7 R
procedure simulated annealing ! @7 t& v. F" v
begin ! N0 a# Q' L, D+ P
t:=0; 3 u. }" m; s7 ?; Z7 [7 e8 G initialize temperature T ; s7 v9 v# M/ ?, ]
select a current string vc at random; G' \- d8 T: D+ p evaluate vc; ; S3 z8 m' d& Y& T repeat % n! \$ ^' ^/ i8 S o4 Z; J5 p
repeat 7 o7 z2 b" U' q select a new string vn in the neighborhood of vc; (1) # {. I% t; ]! u) f4 P2 R( E if f(vc) then vc:=vn; 3 Z8 S, s [! C; W else if random [0,1] then vc:=vn; ( I( l; m2 k( b' [: b4 ?# }3 K
until (termination-condition) (3) 5 |" a1 I- Q% y1 j* S: j# u9 Y T:=g(T,t); (4) . ]& L, P5 } G! e T:=t+1; * M1 Y, Y) `5 G7 b0 d4 m$ H until (stop-criterion) (5) . U* f% O, \8 x- h4 D
end; 0 p+ [: I6 N1 P' r% ?8 I3 H
2 m# b1 l5 l3 x4 u$ N: p q& e5 V
! Z& n2 Y& D( n 上面的程序中,关键的是(1)新状态产生函数,(2)新状态接受函数,(3)抽样稳定准则,(4)退温函数,(5)退火结束准则9 ~1 j) `7 N/ {* e5 D; J
(简称三函数两准则)是直接影响优化结果的主要环节。虽然实验结果证明初始值对于最后的结果没有影响,但是初温越高,得到高质量解的概率越大。所以,应该尽量选 ?9 @( j/ G8 V- ]
取比较高的初温。 5 R" n8 s; M+ W, \9 K( V7 y b6 E' Q; v5 P7 f
7 U/ w1 S9 M: S8 Z' V- u6 R e
上面关键环节的选取策略:' a( c7 }; g" E X3 X
(1)状态产生函数:候选解由当前解的邻域函数决定,可以取互换,插入,逆序等操作产生,然后根据概率分布方式选取新的解,概率可以取均匀分布、正态分布、高斯 2 H% `! h4 L2 f' T% E% G分布、柯西分布等。 ( B- w0 t" K# ^7 n 8 c8 ~' _+ n" q3 V! ~ / O4 i. n! s% A9 h
(2)状态接受函数:这个环节最关键,但是,实验表明,何种接受函数对于最后结果影响不大。所以,一般选取min 8 R4 b; T7 M) L I' L, \# f
[1, exp ((f (vn)-f (vc))/T)]。4 l# k+ }- i/ Y& h: U D
(3)抽样稳定准则:一般常用的有:检验目标函数的均值是否稳定;连续若干步的目标值变化较小;规定一定的步数; ' ~( Q* m# k' q 7 z5 M% L0 }$ P5 h5 @ % Q+ L/ d8 }9 X- r X
(4)退温函数:如果要求温度必须按照一定的比率下降,SA算法可以采用 $ k; a( m" W+ r2 w! r6 q3 r& e ,但是温度下降很慢;快速SA中,一般采用. W# {+ [! O. H. t5 F" n( o1 M5 G; D
。目前,经常用的是 , 是一个不断变化的值。- {5 `/ h6 K' q" R
(5)退火结束准则:一般有:设置终止温度;设置迭代次数;搜索到的最优值连续多次保持不变;检验系统熵是否稳定。 3 d% _, W( \ x+ T7 [$ H ( g3 b- H6 p& y( ]% |' r: d 6 {; A+ I- Y; y* ]# s1 O! j, Y
为了保证有比较优的解,算法往往采取慢降温、多抽样、以及把“终止温度”设的比较低等方式,导致算法运行时间比较长,这也是模拟退火的最大缺点。人喝醉了酒办起+ v$ e7 z" i. p' |" M# v
事来都不利索,何况兔子?" D$ b4 K; R" u
& a8 B+ V% g, _, l; M9 K0 C- h# u ) c% q9 j% C# L9 i# U \1 l3 } 遗传算法(Genetic Algorithm, GA) ( B' Z" S* G& g' s1 d , _, N2 d' F+ @ + p& ?, U" z) C# l1 A “物竞天择,适者生存”,是进化论的基本思想。遗传算法就是模拟自然界想做的事。遗传算法可以很好地用于优化问题,若把它看作对自然过程高度理想化的模拟,更能9 x% M7 z; ~5 z0 ^) w6 E
显出它本身的优雅——虽然生存竞争是残酷的。1 r) C$ I- p C' ?+ n$ G
# T3 {$ @/ p. D- D5 y% q" m# i 3 }# d: a- d* ?6 O) _
遗传算法以一种群体中的所有个体为对象,并利用随机化技术指导对一个被编码的参数空间进行高效搜索。其中,选择、交叉和变异构成了遗传算法的遗传操作;参数编码 0 s6 Q" n* s3 U) \8 {、初始群体的设定、适应度函数的设计、遗传操作设计、控制参数设定五个要素组成了遗传算法的核心内容。0 [: [8 L9 C" A, S0 O' T
作为一种新的全局优化搜索算法,遗传算法以其简单通用、健壮性强、适于并行处理以及高效、实用等显著特点,在各个领域得到了广泛应用,取得了良好效果,并逐渐成 _" e4 X6 X0 n8 G4 H9 W3 X+ Q
为重要的智能算法之一。 ( @$ n+ _+ @% ^ 3 @3 m( p! ]/ R0 N T. D 3 ?) H: O( F+ j
遗传算法的伪码: . ^+ c( f9 u/ C6 k ' ?) Z$ d2 B' c) ?# H/ f: ^- f* {
( E7 N8 W J3 I& x/ j% t
procedure genetic algorithm " g6 _5 X1 D- u) i5 s. S- J begin 0 \2 b& B9 Q# y% Z initialize a group and evaluate the fitness value ; (1) 5 D: P/ c" L) W; m1 E while not convergent (2): y9 K4 a6 v. A% p; z7 P
begin ' y7 B) A5 v, _! \& r' b- r$ y select; (3) 4 Q# D& H+ n' u* a v) i if random[0,1] crossover; (4) 8 Q6 M5 w: w( o' I9 _# C if random (0,1) mutation; (5) 4 i% S- g8 e) t end; 9 u, ?6 D% `3 R9 K end / H/ B% G5 Y$ n9 t9 ]2 G3 c7 z( Q
上述程序中有五个重要的环节: $ f) @2 C% m0 H (1)编码和初始群体的生成:GA在进行搜索之前先将解空间的解数据表示成遗传空间的基因型串结构数据,这些串结构数据的不同组合便构成了不同的点。然后随机产 |) C9 y) k3 T- N5 j
生N个初始串结构数据,每个串结构数据称为一个个体,( G9 Q9 c- Y7 H6 ~
N个体构成了一个群体。GA以这N个串结构数据作为初始点开始迭代。 . A& n: b/ |( ?2 B6 r 3 Q' L5 T: S C" l: Y
- {! R: y5 R# Y: X- {* ]
比如,旅行商问题中,可以把商人走过的路径进行编码,也可以对整个图矩阵进行编码。编码方式依赖于问题怎样描述比较好解决。初始群体也应该选取适当,如果选取的7 S6 i8 \$ M$ }8 E5 F& M1 S' L" a
过小则杂交优势不明显,算法性能很差(数量上占了优势的老鼠进化能力比老虎强),群体选取太大则计算量太大。 ' }$ e0 h' e/ V& `! i' Q6 n * Y5 B- O+ f/ m 2 }: ]9 ?& F [5 w1 p$ `; a
(2)检查算法收敛准则是否满足,控制算法是否结束。可以采用判断与最优解的适配度或者定一个迭代次数来达到。 + N" M% J7 G$ P, C" o Y ' ^3 G7 B5 L7 u; ^
o8 R1 m; N' g% ~! K
(3)适应性值评估检测和选择:适应性函数表明个体或解的优劣性,在程序的开始也应该评价适应性,以便和以后的做比较。不同的问题,适应性函数的定义方式也不同- l' e. Z! f, K s( ?1 L
。根据适应性的好坏,进行选择。选择的目的是为了从当前群体中选出优良的个体,使它们有机会作为父代为下一代繁殖子孙。遗传算法通过选择过程体现这一思想,进行 " u0 Q$ G# ^& D. x1 r选择的原则是适应性强的个体为下一代贡献一个或多个后代的概率大。选择实现了达尔文的适者生存原则。0 e" J. v1 D% q" F3 `
- D. P- q, @: ?0 w' S1 i8 ^9 {
! y$ F3 L4 f6 E# M4 K, b
(4)杂交:按照杂交概率(pc)进行杂交。杂交操作是遗传算法中最主要的遗传操作。通过杂交操作可以得到新一代个体,新个体组合了其父辈个体的特性。杂交体现' O; a: s( a( k5 o% O4 c
了信息交换的思想。 0 l3 V6 I1 [2 O% `/ C0 K! X . v2 Y* _ H3 p' B: T0 H$ Q
7 ^4 X$ o8 |4 _2 h/ N4 N' L 可以选定一个点对染色体串进行互换,插入,逆序等杂交,也可以随机选取几个点杂交。杂交概率如果太大,种群更新快,但是高适应性的个体很容易被淹没,概率小了搜 - L: P/ {9 A3 J2 @6 h& N: @- D0 M索会停滞。; I, v4 Q9 i# u6 M6 T% k
# J( \& k* a1 f' |+ F4 L0 o/ p
# ~% {( ?$ X1 a0 K (5)变异:按照变异概率(pm)进行变异。变异首先在群体中随机选择一个个体,对于选中的个体以一定的概率随机地改变串结构数据中某个串的值。同生物界一样, GA中变异发生的概率很低。变异为新个体的产生提供了机会。 0 G8 F" |% R3 T2 \ ; _5 R; {( v* W1 m
0 u7 |8 J7 |' {8 N
变异可以防止有效基因的缺损造成的进化停滞。比较低的变异概率就已经可以让基因不断变更,太大了会陷入随机搜索。想一下,生物界每一代都和上一代差距很大,会是8 _' }' D+ E$ g, M$ z6 }
怎样的可怕情形。 2 T6 S% F6 o3 q ' v0 {- j+ \- q5 @/ D$ k X+ C : Z, V' U& G+ z6 `
就像自然界的变异适和任何物种一样,对变量进行了编码的遗传算法没有考虑函数本身是否可导,是否连续等性质,所以适用性很强;并且,它开始就对一个种群进行操作* W) N9 c, K1 k7 n. j" n
,隐含了并行性,也容易找到“全局最优解”。1 D" A3 {3 W" y
2 D) G2 x9 a7 P6 S 5 p& u$ [5 B6 r L/ g& w
禁忌搜索算法(Tabu Search,TS)0 Q& O& v5 i! ]4 l9 U! q
* @( f! p; f! c+ U8 g 7 E, i6 ^' U3 i Z9 l, b# a2 b
为了找到“全局最优解”,就不应该执着于某一个特定的区域。局部搜索的缺点就是太贪婪地对某一个局部区域以及其邻域搜索,导致一叶障目,不见泰山。禁忌搜索就是 + _# ^: L4 R4 j9 f! V0 H5 n对于找到的一部分局部最优解,有意识地避开它(但不是完全隔绝),从而获得更多的搜索区间。兔子们找到了泰山,它们之中的一只就会留守在这里,其他的再去别的地3 s7 L( g% L: A! m
方寻找。就这样,一大圈后,把找到的几个山峰一比较,珠穆朗玛峰脱颖而出。 1 U5 X4 w6 S f. X" q ? 5 G7 q; n: G; ?
: E2 c% B6 ~% J! B `
当兔子们再寻找的时候,一般地会有意识地避开泰山,因为他们知道,这里已经找过,并且有一只兔子在那里看着了。这就是禁忌搜索中“禁忌表(tabu C1 W ?+ m* l' U+ b list)”的含义。那只留在泰山的兔子一般不会就安家在那里了,它会在一定时间后重新回到找最高峰的大军,因为这个时候已经有了许多新的消息,泰山毕竟也有一! Q5 L( p: ]& \' X5 r& H
个不错的高度,需要重新考虑,这个归队时间,在禁忌搜索里面叫做“禁忌长度(tabu 1 H. g7 u7 r. F9 ?/ z length)”;如果在搜索的过程中,留守泰山的兔子还没有归队,但是找到的地方全是华北平原等比较低的地方,兔子们就不得不再次考虑选中泰山,也就是说,当 a. P, }) n5 a5 P9 l
一个有兔子留守的地方优越性太突出,超过了“best 3 }% K+ T/ c# I5 k! H: o/ I# A
to 1 u- `3 O, _+ }2 b5 } far”的状态,就可以不顾及有没有兔子留守,都把这个地方考虑进来,这就叫“特赦准则(aspiration # [1 ]1 R+ E7 t. } criterion)”。这三个概念是禁忌搜索和一般搜索准则最不同的地方,算法的优化也关键在这里。 % C( A: ?$ F( g0 _! D - x: ]4 n9 V0 I% y3 a% r 8 L* M0 c0 ^4 p0 J5 Z
伪码表达: , H( z# c2 T: v/ `; Q# P procedure tabu search; ) g' k7 p7 I4 M+ h0 a begin , Z- F8 M! J; q* i- B, {" D
initialize a string vc at random,clear up the tabu list; 3 d: d0 G- Z4 y+ J& q' r cur:=vc; 4 z+ V' C; p% |5 F3 b) k
repeat / _1 a0 p+ Q/ |6 E2 h' L. ]7 \ select a new string vn in the neighborhood of vc; 5 u9 d& _7 }5 n/ }% e& D
if va>best_to_far then {va is a string in the tabu list} 1 z7 E- X, A: P: F) G- g- U# D
begin : L9 A" B0 r6 n' G cur:=va; ' v9 w- R9 _! V6 } let va take place of the oldest string in the tabu list; 9 L- z% H2 K7 P5 W ^6 ] best_to_far:=va; ; O' s$ x+ z$ R5 f# [2 Z \ end else / \, r+ G+ E& t' [, H! ~ begin ' u7 g& F. q4 @( [
cur:=vn; : o8 l% o0 G2 M4 l let vn take place of the oldest string in the tabu list; : c; O! S. l" l$ t$ p) D end; 2 e( F! s/ w& B7 ]
until (termination-condition); % Y3 c; D' S7 {0 j( ~
end; ! ^( u8 ]6 w+ H! C * d8 M( {0 ~* H7 K
) @ o9 c- u# w* V6 r* i% u
以上程序中有关键的几点: . g X- }6 m Y+ b5 C (1)禁忌对象:可以选取当前的值(cur)作为禁忌对象放进tabu % ~' e9 U; n p ^& N. Q0 z list,也可以把和当然值在同一“等高线”上的都放进tabu % `* w. m: G% d6 l9 l1 K: i& w list。 ! \5 }* J; G# E" k. O (2)为了降低计算量,禁忌长度和禁忌表的集合不宜太大,但是禁忌长度太小容易循环搜索,禁忌表太小容易陷入“局部极优解”。: {; C7 @. b4 P- h* O" D# h8 k
. @/ a; q) a+ I% N" p 0 I) c G' T( F/ U0 z# u1 X
(3)上述程序段中对best_to_far的操作是直接赋值为最优的“解禁候选解”,但是有时候会出现没有大于best_to_far的,候选解也全部被禁的 “死锁”状态,这个时候,就应该对候选解中最佳的进行解禁,以能够继续下去。 # C( v+ C5 m9 o% d+ w- c ~ ! J5 D9 L& C9 J
2 q" z' Q( \# W
(4)终止准则:和模拟退火,遗传算法差不多,常用的有:给定一个迭代步数;设定与估计的最优解的距离小于某个范围时,就终止搜索;当与最优解的距离连续若干步 0 [! p6 l9 Y* o8 w! o8 \保持不变时,终止搜索; ! w/ w$ v' E& ~- I- g0 k ' n* X4 C0 L( W V9 A! d4 K
8 h/ p! ?1 D8 Z
禁忌搜索是对人类思维过程本身的一种模拟,它通过对一些局部最优解的禁忌(也可以说是记忆)达到接纳一部分较差解,从而跳出局部搜索的目的。 ; T; W7 Y' R+ F* p: ` 4 d! R$ q7 Y" z$ _0 Y4 n
( S$ c+ a4 k( Z5 f8 s/ z 人工神经网络(Artificial Neural Network,ANN) ( [. t8 @+ f$ i& O `4 y8 a h& Z ) g @* N, Q: g5 ?" `
; I- Y3 T3 I; @% }8 R0 Y
神经网络从名字就知道是对人脑的模拟。它的神经元结构,它的构成与作用方式都是在模仿人脑,但是也仅仅是粗糙的模仿,远没有达到完美的地步。和冯·诺依曼机不同7 H' y1 N4 }8 P! a
,神经网络计算非数字,非精确,高度并行,并且有自学习功能。 8 b4 t2 p$ y9 ]6 D; ` 5 h3 O/ I* R q: l$ }0 }* C