q: F2 p3 I* C2 X+ b 8 W( j: p% j$ }3 G; q6 D
“物竞天择,适者生存”,是进化论的基本思想。遗传算法就是模拟自然界想做的事。遗传算法可以很好地用于优化问题,若把它看作对自然过程高度理想化的模拟,更能) k; H5 k' f, S1 Y6 I
显出它本身的优雅——虽然生存竞争是残酷的。 / O) M) m: W+ f8 |8 q9 \4 v; K - ~0 o2 w V4 m% y3 A# r 4 } \0 h1 N! K# p" |$ E1 F: _! C' X* z 遗传算法以一种群体中的所有个体为对象,并利用随机化技术指导对一个被编码的参数空间进行高效搜索。其中,选择、交叉和变异构成了遗传算法的遗传操作;参数编码 ; n& n% ]& c% r2 K) C+ x* \# {、初始群体的设定、适应度函数的设计、遗传操作设计、控制参数设定五个要素组成了遗传算法的核心内容。 " Q, e7 e7 M3 A7 q: D! k 作为一种新的全局优化搜索算法,遗传算法以其简单通用、健壮性强、适于并行处理以及高效、实用等显著特点,在各个领域得到了广泛应用,取得了良好效果,并逐渐成 G# t4 U! s. Z; g$ c4 {+ U为重要的智能算法之一。. x8 K7 C# G- {+ R& q0 Y5 Q& p
: p) c: z! Q. O- V
) c( b3 p* Y# T; p2 h3 c! r
遗传算法的伪码:7 C7 s" i$ e6 E4 o) ~
8 G. l- R. y4 e) Q. e
# n6 n$ t4 \ A6 i procedure genetic algorithm , Q. {& [ }5 b" U1 r8 X: s begin $ D" j/ N2 C: ? initialize a group and evaluate the fitness value ; (1)$ W+ j+ X% g! u, s3 {2 p/ y
while not convergent (2) % a( [6 [, ?. ~4 \; z, ?* b$ K begin 0 ]6 v; }! r0 W- N z. i+ Y
select; (3)4 [+ v3 U( h: y; a
if random[0,1] crossover; (4) - t2 Q+ Z5 ^4 U0 R if random (0,1) mutation; (5) - p4 ~ _# O+ _2 G8 V end; , O" k6 [" ^5 h end + o2 |' E# H. N/ J
上述程序中有五个重要的环节: . B! c& n2 |' T( j (1)编码和初始群体的生成:GA在进行搜索之前先将解空间的解数据表示成遗传空间的基因型串结构数据,这些串结构数据的不同组合便构成了不同的点。然后随机产 2 F$ u6 r9 ~: T4 Z4 N0 G生N个初始串结构数据,每个串结构数据称为一个个体, 9 H+ q1 J q3 W1 x" Z N个体构成了一个群体。GA以这N个串结构数据作为初始点开始迭代。 % M! N+ S5 T8 u" L. x i 6 X/ p" W+ v+ o1 M: E) i* y. E; b
: a6 T6 P2 e; e* U8 Y
比如,旅行商问题中,可以把商人走过的路径进行编码,也可以对整个图矩阵进行编码。编码方式依赖于问题怎样描述比较好解决。初始群体也应该选取适当,如果选取的 # l0 n' m0 \' Z8 t过小则杂交优势不明显,算法性能很差(数量上占了优势的老鼠进化能力比老虎强),群体选取太大则计算量太大。 % ^% V& b9 F* b2 M/ h, W( \, Y& B 4 D$ s$ Z) V2 L! v2 Y( T" e9 H
) m4 Y' [1 n1 h( \) x3 x: p
(2)检查算法收敛准则是否满足,控制算法是否结束。可以采用判断与最优解的适配度或者定一个迭代次数来达到。* W9 x; q/ y% N( n2 O& z& d
: `* U9 G1 t) e8 r) I * g- G! ?5 q4 T
(3)适应性值评估检测和选择:适应性函数表明个体或解的优劣性,在程序的开始也应该评价适应性,以便和以后的做比较。不同的问题,适应性函数的定义方式也不同 # k3 ]' O* \* l! n+ g7 l。根据适应性的好坏,进行选择。选择的目的是为了从当前群体中选出优良的个体,使它们有机会作为父代为下一代繁殖子孙。遗传算法通过选择过程体现这一思想,进行# {6 H- I2 y* S0 h0 k
选择的原则是适应性强的个体为下一代贡献一个或多个后代的概率大。选择实现了达尔文的适者生存原则。# [, I w9 X9 B* L
7 Z7 x7 j; D7 X6 r4 U7 V
4 K" S7 }5 T: C
(4)杂交:按照杂交概率(pc)进行杂交。杂交操作是遗传算法中最主要的遗传操作。通过杂交操作可以得到新一代个体,新个体组合了其父辈个体的特性。杂交体现 3 D: l" o, X& t9 i9 x. k1 Q了信息交换的思想。, Z, V5 o) x" g: y( {+ v$ V, u
4 p* y# l4 j7 f' r8 v6 L+ n( C # `. m- m- i" J: {" b7 \8 t9 i3 I 可以选定一个点对染色体串进行互换,插入,逆序等杂交,也可以随机选取几个点杂交。杂交概率如果太大,种群更新快,但是高适应性的个体很容易被淹没,概率小了搜+ }- d! G( y7 Z4 S# u/ q
索会停滞。 - O# N. C% h* V0 b/ } , p; i4 y. f5 o0 Z) ^ 7 t5 O3 G- |. u4 S (5)变异:按照变异概率(pm)进行变异。变异首先在群体中随机选择一个个体,对于选中的个体以一定的概率随机地改变串结构数据中某个串的值。同生物界一样, GA中变异发生的概率很低。变异为新个体的产生提供了机会。& ~" U/ e5 l* j& b. o _; D
5 G% `, D/ }" c: S S6 n9 G9 L
& u+ j; C$ i( _% Z
变异可以防止有效基因的缺损造成的进化停滞。比较低的变异概率就已经可以让基因不断变更,太大了会陷入随机搜索。想一下,生物界每一代都和上一代差距很大,会是" T4 b5 t q* x
怎样的可怕情形。 9 e3 f3 c( D. b! x8 K; ? # s) M( q9 n1 s$ N1 K- M" L- O - M8 t0 R1 X% N% ]8 Q6 z, G 就像自然界的变异适和任何物种一样,对变量进行了编码的遗传算法没有考虑函数本身是否可导,是否连续等性质,所以适用性很强;并且,它开始就对一个种群进行操作 9 Q: u! q6 d7 D( _1 X,隐含了并行性,也容易找到“全局最优解”。 9 B' C: K, s7 E1 v' ?$ U$ m! h 3 a" E3 R R1 T
7 J" O, E- L: z6 V 禁忌搜索算法(Tabu Search,TS) 8 `. j4 _# S7 X6 ^2 T. Z 6 d: b6 b( q* O$ [% g
# v2 A+ [& I# W" v8 X6 }
为了找到“全局最优解”,就不应该执着于某一个特定的区域。局部搜索的缺点就是太贪婪地对某一个局部区域以及其邻域搜索,导致一叶障目,不见泰山。禁忌搜索就是4 {) J; i+ X) Z- |5 l3 F
对于找到的一部分局部最优解,有意识地避开它(但不是完全隔绝),从而获得更多的搜索区间。兔子们找到了泰山,它们之中的一只就会留守在这里,其他的再去别的地3 m& P& ^- A/ {* k+ R
方寻找。就这样,一大圈后,把找到的几个山峰一比较,珠穆朗玛峰脱颖而出。 / Q$ x: l. _0 s* m {% u" R* s, f # A; g6 w- K! {3 U/ u7 ?0 c
' t) P, j4 q7 S 当兔子们再寻找的时候,一般地会有意识地避开泰山,因为他们知道,这里已经找过,并且有一只兔子在那里看着了。这就是禁忌搜索中“禁忌表(tabu ) _+ a+ t X5 g7 M0 a. ~. Y4 k
list)”的含义。那只留在泰山的兔子一般不会就安家在那里了,它会在一定时间后重新回到找最高峰的大军,因为这个时候已经有了许多新的消息,泰山毕竟也有一+ D* T7 R$ g6 k
个不错的高度,需要重新考虑,这个归队时间,在禁忌搜索里面叫做“禁忌长度(tabu 2 ? z+ b/ @7 I+ x# O& D! T2 U [ length)”;如果在搜索的过程中,留守泰山的兔子还没有归队,但是找到的地方全是华北平原等比较低的地方,兔子们就不得不再次考虑选中泰山,也就是说,当6 U3 U: _3 `( f6 L5 e: d3 V6 y6 e
一个有兔子留守的地方优越性太突出,超过了“best - f. P' f; U/ N0 S. |! L- ] to " {' o' |6 v5 ]3 Y
far”的状态,就可以不顾及有没有兔子留守,都把这个地方考虑进来,这就叫“特赦准则(aspiration $ s0 _/ ?6 U/ N w
criterion)”。这三个概念是禁忌搜索和一般搜索准则最不同的地方,算法的优化也关键在这里。 1 Y1 k0 L5 W+ O+ i; ~6 Q' b ; j, D6 V; B$ j- @ _& F, V 7 `2 L+ O {) R' z2 Y( K 伪码表达: , k4 n7 U5 I' b: u6 I# U1 h4 v; g7 m procedure tabu search; 0 z7 E% v e1 E f% E$ I, i begin 2 R; ^- i8 o' [/ [- V0 g* v7 q
initialize a string vc at random,clear up the tabu list; / V2 U" |9 P' M. u8 T! R# v, c- P8 e
cur:=vc; 1 L; ~8 ~- k% ?- V. x repeat * i2 J/ H/ ~; H) b
select a new string vn in the neighborhood of vc; 7 J- f+ R0 b4 B7 A9 L4 J
if va>best_to_far then {va is a string in the tabu list} 6 o3 |: ~8 K1 F6 ~7 ]
begin $ A7 ?% s/ \+ V4 n! I2 F- Y
cur:=va; 3 t& u& x* H# [4 B7 x let va take place of the oldest string in the tabu list; 5 h1 }( K2 N3 o( k" }- z
best_to_far:=va; 9 o' c: e$ y" h) x! E4 G end else 2 K' H/ r0 b" u: Y+ A
begin 5 X: ] O# N; ] cur:=vn; / P5 T1 s9 g {. `) a4 b let vn take place of the oldest string in the tabu list; 3 v: B! d$ G: f* Z1 G: q end; 2 C2 a. w0 r" ]# x" l until (termination-condition); W) `: U2 `& C' e* A- N
end; ( o3 R4 Y! r' N' |5 L
% @) s: ?- ? q, q* V- _( _8 U- w. z ( i' B& ?4 B! S& T0 c) e 以上程序中有关键的几点:' s' F4 G, V7 c+ r4 I N
(1)禁忌对象:可以选取当前的值(cur)作为禁忌对象放进tabu ! G" @4 y. {( g$ U4 G list,也可以把和当然值在同一“等高线”上的都放进tabu * `3 q7 J4 {1 u/ q; c& _" L; b7 h
list。 # _0 P& d1 q1 p7 \# _ (2)为了降低计算量,禁忌长度和禁忌表的集合不宜太大,但是禁忌长度太小容易循环搜索,禁忌表太小容易陷入“局部极优解”。: A" f. I S+ M
% V% Z+ Y( ?- b# f0 l' t ]
: N1 L9 G& ~* y0 B; c3 i1 y (3)上述程序段中对best_to_far的操作是直接赋值为最优的“解禁候选解”,但是有时候会出现没有大于best_to_far的,候选解也全部被禁的 “死锁”状态,这个时候,就应该对候选解中最佳的进行解禁,以能够继续下去。 1 F x, T; m) ], M- X + p; ~2 s1 W; `4 D4 Q1 o4 f4 A
' h. t ]* F8 o- |; n/ l (4)终止准则:和模拟退火,遗传算法差不多,常用的有:给定一个迭代步数;设定与估计的最优解的距离小于某个范围时,就终止搜索;当与最优解的距离连续若干步5 s( Q) f5 a9 ]+ A
保持不变时,终止搜索;( P e$ w7 l7 Q7 E: F
* G5 h6 D! F1 O0 \4 s, K4 n5 t% r" q
% v, Q/ J% A6 n7 r; z+ |
禁忌搜索是对人类思维过程本身的一种模拟,它通过对一些局部最优解的禁忌(也可以说是记忆)达到接纳一部分较差解,从而跳出局部搜索的目的。 2 f; Z) l: l' ~9 Q Q/ I+ W5 c! c: B : W- I4 \9 t2 U! P
人工神经网络(Artificial Neural Network,ANN) ' B; s3 \' W% B+ z' g% F6 G 1 C: y* j( _$ \# f4 Y
+ E* x+ t# c( y& S0 j& B 神经网络从名字就知道是对人脑的模拟。它的神经元结构,它的构成与作用方式都是在模仿人脑,但是也仅仅是粗糙的模仿,远没有达到完美的地步。和冯·诺依曼机不同 / i( d6 N+ i# i: |3 R+ a& G( N* P4 K,神经网络计算非数字,非精确,高度并行,并且有自学习功能。 - |/ X- `+ j5 _6 a" p ) G! b: D$ O5 c- l- G
. E H5 H6 s- Q1 O" L! i
生命科学中,神经细胞一般称作神经元,它是整个神经结构的最基本单位。每个神经细胞就像一条胳膊,其中像手掌的地方含有细胞核,称作细胞体,像手指的称作树突,! {+ \$ v; G h/ b
是信息的输入通路,像手臂的称作轴突,是信息的输出通路;神经元之间错综复杂地连在一起,互相之间传递信号,而传递的信号可以导致神经元电位的变化,一旦电位高 ! i2 ]6 L- h! a: B( t出一定值,就会引起神经元的激发,此神经元就会通过轴突传出电信号。 / ~8 H+ o( j1 p H" J- I; E+ E7 r" R) }" o
. x- ^9 S- [6 r% n5 e8 t1 i
而如果要用计算机模仿生物神经,就需要人工的神经网络有三个要素:(1)形式定义人工神经元;(2)给出人工神经元的连接方式,或者说给出网络结构;(3)给出 % Y! c8 K$ K$ B5 ` [人工神经元之间信号强度的定义。4 R) ]) F1 H! k, [
6 B- X' K' B; w3 \6 l2 { Q; E
' g7 W/ @/ w; I' T* v
历史上第一个人工神经网络模型称作M-P模型,非常简单: ' ] W- d6 A+ R. ?8 r* d + n* R2 @7 C0 b1 z$ ~. _
- C& h. i: Q8 Y$ t3 s. \ S
其中,1 t6 y( \8 X9 `; m
表示神经元i在t时刻的状态,为1表示激发态,为0表示抑制态; I$ b6 [0 G# i4 [6 F, G9 Q7 [! H 是神经元i和j之间的连接强度;4 H" ?% F; F. r/ l
表示神经元i的阈值,超过这个值神经元才能激发。( ~! A4 N0 G: o; h/ C; Z
这个模型是最简单的神经元模型。但是功能已经非常强大:此模型的发明人McCulloch和Pitts已经证明,不考虑速度和实现的复杂性,它可以完成当前数字 2 ]9 b1 k9 |& d0 ?2 I% z# x计算机的任何工作。/ `* X+ n5 }$ |: } [9 T% e
+ Q( e. u C; V0 {' ~$ q, R
7 j$ D5 q+ O' K 以上这个M-P模型仅仅是一层的网络,如果从对一个平面进行分割的方面来考虑的话,M-P网络只能把一个平面分成个半平面,却不能够选取特定的一部分。而解决的* w- m# H6 @( c, `) m( {$ |
办法就是“多层前向网路”。9 z' X" w% v6 u* y+ r# b
8 F+ o3 k$ g O4 M5 l ) |( I( g# p% t3 N z
图2 / t4 E: x! H. I2 W+ Y" V) D 图2是多层前向网络的示意图。最下面的 2 V* \( b+ {1 R6 g" h( C 称作输入层,最上面一层称作输出层,任何一个中间层都接受来自前一层的所有输入,加工后传入后一层。每一层的神经元之间没有联系,输入输出层之间也没有直接联系' I; E. T) z+ C% H8 N
,并且仅仅是单向联系,没有反馈。这样的网络被称作“多层前向网络”。数据在输入后,经过每一层的加权,最后输出结果。 + K# E1 ` [* N, @ A 3 t9 \5 l" P" D) [. m3 u" K3 c
& d% _$ X3 e# ~9 C9 p- ? 图3 & n* i+ y& M! i4 Z0 j- Z) D: q 如图3,用可覆盖面来说明多层网络的功能:单层网络只能把平面分成两部分,双层网络就可以分割任意凸域,多层网络则可以分割任意区域。 " `5 P& V( h$ ~; j 为了让这种网络有合适的权值,必须给网络一定的激励,让它自己学习,调整。一种方法称作“向后传播算法(Back & z! T. ~6 O: V2 m2 y- H Propagation,BP)”,其基本思想是考察最后输出解和理想解的差异,调整权值,并把这种调整从输出层开始向后推演,经过中间层,达到输入层。 / V u0 U7 t5 G; G & q, c( i. o: q ? 0 G* c' H: A3 U; b. L/ i 可见,神经网络是通过学习来达到解决问题的目的,学习没有改变单个神经元的结构和工作方式,单个神经元的特性和要解决的问题之间也没有直接联系,这里学习的作用: n) j ?( ?' V! \
是根据神经元之间激励与抑制的关系,改变它们的作用强度。学习样本中的任何样品的信息都包含在网络的每个权值之中。* K) b+ H( o) r1 ~
6 ^, O# J$ x+ C5 m, S