$ S2 I# m3 s" c $ B& y' ?0 R) p, s 值得注意的是,当T为0时,模拟退火就成为局部搜索的一个特例。8 \! X2 q3 C3 v3 F9 L
4 Q" ?; i' M6 p7 \ ( X- S4 X5 X. M9 S% J7 F6 S! g
模拟退火的伪码表达: ' ]9 K4 d7 C9 M' H- D procedure simulated annealing - ?0 ~" |* L0 O& m2 A8 j/ b begin . T0 a" r6 e5 C) W# E8 m9 h
t:=0; . J8 u; ]" C* ^1 J8 h' B
initialize temperature T ! G4 L% I2 e, @ c. f& Z2 N N/ \ select a current string vc at random; ) T9 l y( i/ h% U: E# U, X
evaluate vc; / A; B4 x. D& s# g
repeat ) m0 u7 R8 p0 Z; r9 x0 ~
repeat ; R) J; i8 T6 z9 z/ Q/ D select a new string vn in the neighborhood of vc; (1) + V+ y' M G( f4 {( p if f(vc) then vc:=vn; 7 P C- m, p1 e
else if random [0,1] then vc:=vn; . t' a, U2 k" W; G% ]8 J
until (termination-condition) (3) / l/ t* D0 C' N* W: ~" i T:=g(T,t); (4) ! o6 S7 y* x* z
T:=t+1; : K& A0 W& D9 M' K
until (stop-criterion) (5) 9 P* x( `5 e1 H5 |* V8 }2 C2 Q end; + P) @! w* _ {$ e; I: E
, a. [( A1 L8 h8 j; Z . {) O8 }) @# H! n
上面的程序中,关键的是(1)新状态产生函数,(2)新状态接受函数,(3)抽样稳定准则,(4)退温函数,(5)退火结束准则 8 t) R: G3 \( ~9 e (简称三函数两准则)是直接影响优化结果的主要环节。虽然实验结果证明初始值对于最后的结果没有影响,但是初温越高,得到高质量解的概率越大。所以,应该尽量选! }' b# H" ?: u0 Y
取比较高的初温。 4 I0 ?1 I, L c" H1 O: u* u ; R' |) f7 G" z! D. ^, x1 T - v+ a x3 n' ]0 o
上面关键环节的选取策略: 5 t2 @# T( ^" e3 n5 e (1)状态产生函数:候选解由当前解的邻域函数决定,可以取互换,插入,逆序等操作产生,然后根据概率分布方式选取新的解,概率可以取均匀分布、正态分布、高斯 # v. J. z& t1 N3 G/ K4 e3 ^分布、柯西分布等。 ( d% Q5 j- _: S# z9 S 1 A* z9 V" b2 w3 H! k7 j
" U+ {6 W; S- h: ^ (2)状态接受函数:这个环节最关键,但是,实验表明,何种接受函数对于最后结果影响不大。所以,一般选取min ; `5 @: h* i3 I) \, U
[1, exp ((f (vn)-f (vc))/T)]。* R: j8 y" V" v4 u+ i
(3)抽样稳定准则:一般常用的有:检验目标函数的均值是否稳定;连续若干步的目标值变化较小;规定一定的步数;9 H" [/ R. Y1 _( l) |9 e. ?, j) c
( \; P K* |7 M , M% l+ u% d T* {. M4 v2 H/ i
(4)退温函数:如果要求温度必须按照一定的比率下降,SA算法可以采用 2 e0 _+ B( i4 s$ b, z+ X/ {# g3 ~' b ,但是温度下降很慢;快速SA中,一般采用 / a8 I+ V9 ]/ X W ` D 。目前,经常用的是 , 是一个不断变化的值。 % S" M+ W: W$ B! c+ j- G (5)退火结束准则:一般有:设置终止温度;设置迭代次数;搜索到的最优值连续多次保持不变;检验系统熵是否稳定。+ i5 x2 X( u R0 H
+ p% n2 v3 y) J0 Q% f v
: L& f8 l2 g' l: S1 u( P& J 为了保证有比较优的解,算法往往采取慢降温、多抽样、以及把“终止温度”设的比较低等方式,导致算法运行时间比较长,这也是模拟退火的最大缺点。人喝醉了酒办起+ u0 w( L/ K% L: f' y5 i8 o f
事来都不利索,何况兔子? L6 {/ t$ Q% X% p; G
2 x- S$ B' d2 S: C3 I6 X
. M7 p$ ]# a$ Y" D
遗传算法(Genetic Algorithm, GA) * G- J( M! L% ~0 P V1 a; k ' R5 M. q, g& ~4 q' n0 @/ f: M$ H5 d % [0 n' W! q' E1 Z2 d/ e
“物竞天择,适者生存”,是进化论的基本思想。遗传算法就是模拟自然界想做的事。遗传算法可以很好地用于优化问题,若把它看作对自然过程高度理想化的模拟,更能: E2 K# V! R! e: K5 b k5 b! z
显出它本身的优雅——虽然生存竞争是残酷的。) w3 u/ S8 O% P, m( F
/ b# c1 N4 D2 @8 T/ A/ V * u# w: G! |' O' C+ ~; `& Q- H, ] 遗传算法的伪码: ' _- i, W9 C8 b5 W$ Y) ^ ! [1 F9 l2 M5 y/ `% k 8 f. e n& ?# W; d) N procedure genetic algorithm + m8 ~# B2 M6 R3 U8 F# E4 Q u begin ^" e) R0 J) x7 s9 Y2 E! J4 j
initialize a group and evaluate the fitness value ; (1) 9 H o+ q( ]. z# z9 M e3 w' c4 t while not convergent (2) ; b: m# W7 {" `/ i0 F+ Y; Z begin % h3 u3 e% M2 Q( i* d select; (3) - M: V7 m* W% e3 `& u8 M! g if random[0,1] crossover; (4)4 ^' k6 N# k3 v' j0 B/ N. x# Z( v
if random (0,1) mutation; (5)6 N. {( X- U) C' S: |6 k6 v
end; 2 o* {7 R! U o" }+ ~1 Z2 U# i
end * ~* l0 W( _# z5 m
上述程序中有五个重要的环节:2 A' }% s1 T5 p2 W% R
(1)编码和初始群体的生成:GA在进行搜索之前先将解空间的解数据表示成遗传空间的基因型串结构数据,这些串结构数据的不同组合便构成了不同的点。然后随机产( q6 ^5 v; D$ g3 \+ H* W7 k
生N个初始串结构数据,每个串结构数据称为一个个体, 6 U* ]; P; n& g7 j& y) S% ` N个体构成了一个群体。GA以这N个串结构数据作为初始点开始迭代。+ h, [$ Z# _9 C2 F. i- V; I
6 k. a3 g% y4 S" ]$ A" J$ y( ^
5 U( W' t: i1 j4 [- F# S9 P+ b1 T
比如,旅行商问题中,可以把商人走过的路径进行编码,也可以对整个图矩阵进行编码。编码方式依赖于问题怎样描述比较好解决。初始群体也应该选取适当,如果选取的 2 \7 V! I9 X; j, u* M过小则杂交优势不明显,算法性能很差(数量上占了优势的老鼠进化能力比老虎强),群体选取太大则计算量太大。1 @6 @* S; V! H% E$ P
7 f8 V, l4 M0 ]- }0 {$ r
9 a' z; f! f; B: f9 M (2)检查算法收敛准则是否满足,控制算法是否结束。可以采用判断与最优解的适配度或者定一个迭代次数来达到。 6 j$ N3 i6 ?7 k6 w% d, V* Y5 ]9 f2 O0 | 5 `) z3 |4 p* d+ z
% U/ X* ~, s) o+ ]/ W (3)适应性值评估检测和选择:适应性函数表明个体或解的优劣性,在程序的开始也应该评价适应性,以便和以后的做比较。不同的问题,适应性函数的定义方式也不同 5 Y- E4 o: t7 ]) i. Y。根据适应性的好坏,进行选择。选择的目的是为了从当前群体中选出优良的个体,使它们有机会作为父代为下一代繁殖子孙。遗传算法通过选择过程体现这一思想,进行 3 K5 A# R e3 Q w5 r3 z1 |8 s选择的原则是适应性强的个体为下一代贡献一个或多个后代的概率大。选择实现了达尔文的适者生存原则。( O @1 Z8 @3 L' M/ } P; z
4 u- S6 ~5 s( C. J' a
7 L, ]7 q" l; g
(4)杂交:按照杂交概率(pc)进行杂交。杂交操作是遗传算法中最主要的遗传操作。通过杂交操作可以得到新一代个体,新个体组合了其父辈个体的特性。杂交体现8 p1 P# n$ F4 J
了信息交换的思想。6 a! `1 I# l% b* c- o( r8 I
1 |( _8 i5 n& _: {" {6 K
4 N2 A" i5 w$ c0 x 可以选定一个点对染色体串进行互换,插入,逆序等杂交,也可以随机选取几个点杂交。杂交概率如果太大,种群更新快,但是高适应性的个体很容易被淹没,概率小了搜# z& ^- X5 |, T1 L
索会停滞。 5 p6 y0 u9 M) e- }( X- ] 7 N3 g5 W* ~& e9 f 8 T% O, G& n* ]# F3 O" p$ L9 g2 o (5)变异:按照变异概率(pm)进行变异。变异首先在群体中随机选择一个个体,对于选中的个体以一定的概率随机地改变串结构数据中某个串的值。同生物界一样, GA中变异发生的概率很低。变异为新个体的产生提供了机会。- x# ]4 ?- E$ P6 ^" c' S# M V5 M
0 o, N* z0 p! M3 T! c 0 c) I! s( H' T9 N
变异可以防止有效基因的缺损造成的进化停滞。比较低的变异概率就已经可以让基因不断变更,太大了会陷入随机搜索。想一下,生物界每一代都和上一代差距很大,会是# P6 Z( p5 B4 Q8 {( k. a0 d. |
怎样的可怕情形。 + a" T3 e a8 t: V" Y& \( l ! w! N& `. `& ]1 ^. l+ o4 V- L
, [) i0 V3 d. r8 z- l9 D$ d4 b
就像自然界的变异适和任何物种一样,对变量进行了编码的遗传算法没有考虑函数本身是否可导,是否连续等性质,所以适用性很强;并且,它开始就对一个种群进行操作6 P) f& [1 C0 x0 h
,隐含了并行性,也容易找到“全局最优解”。 . a2 T3 r" z5 K . l8 n0 P4 b- c2 ^: N6 C1 K3 `& w : Z# q9 ]' k1 u4 }+ D" z6 @ 禁忌搜索算法(Tabu Search,TS) 8 Y" {# n. H8 e, ]9 R/ f 8 A; J& H5 K9 S- Z3 A; Q/ G4 J {* ? 3 K0 p! v; q/ z0 R- K
为了找到“全局最优解”,就不应该执着于某一个特定的区域。局部搜索的缺点就是太贪婪地对某一个局部区域以及其邻域搜索,导致一叶障目,不见泰山。禁忌搜索就是1 n) M2 U4 n/ w. q( F+ n7 E
对于找到的一部分局部最优解,有意识地避开它(但不是完全隔绝),从而获得更多的搜索区间。兔子们找到了泰山,它们之中的一只就会留守在这里,其他的再去别的地6 [9 I. H7 ^3 w
方寻找。就这样,一大圈后,把找到的几个山峰一比较,珠穆朗玛峰脱颖而出。 " X/ z1 h% m( L) s* [" O . E7 X( P2 F- l2 R* ~ ! b2 E9 M) O! I1 Q1 \8 b2 B
当兔子们再寻找的时候,一般地会有意识地避开泰山,因为他们知道,这里已经找过,并且有一只兔子在那里看着了。这就是禁忌搜索中“禁忌表(tabu ! s/ u: I# l7 C7 z" D) A6 X list)”的含义。那只留在泰山的兔子一般不会就安家在那里了,它会在一定时间后重新回到找最高峰的大军,因为这个时候已经有了许多新的消息,泰山毕竟也有一1 B& k1 s7 U: P9 x X
个不错的高度,需要重新考虑,这个归队时间,在禁忌搜索里面叫做“禁忌长度(tabu 3 k- _& g- [2 k' y
length)”;如果在搜索的过程中,留守泰山的兔子还没有归队,但是找到的地方全是华北平原等比较低的地方,兔子们就不得不再次考虑选中泰山,也就是说,当 , @$ a: k+ n/ N, U. T一个有兔子留守的地方优越性太突出,超过了“best . K' n3 i2 s% c, s4 N to 0 K3 k' O1 G: T: t& ?
far”的状态,就可以不顾及有没有兔子留守,都把这个地方考虑进来,这就叫“特赦准则(aspiration ) H! @& K/ A' q0 b* S
criterion)”。这三个概念是禁忌搜索和一般搜索准则最不同的地方,算法的优化也关键在这里。3 L5 s/ b, r& m2 d
" k b. `8 P( Y2 @& J+ q
: d3 X# H+ X# y6 H. y3 R 伪码表达: 2 X4 d$ ^! y/ N$ O; Y- h7 F% d( ~ procedure tabu search; 2 z5 k* |& U. h3 o; c3 A- r
begin : p1 D' }9 R- g/ { initialize a string vc at random,clear up the tabu list; / h Q4 }7 b8 O. I1 g
cur:=vc; - P) M/ Q& p( T* Z, c. r
repeat k5 E8 T) t) T3 V: K$ ?% ], c
select a new string vn in the neighborhood of vc; # e+ f% P5 H4 M: `4 H! }6 v
if va>best_to_far then {va is a string in the tabu list} 5 v2 i a* {4 t/ [, {
begin / g/ H9 p. A, O: J! v$ r8 a$ H* }: g
cur:=va; 4 y* _2 _* z) p0 N/ n t g, y+ _
let va take place of the oldest string in the tabu list; : l0 F0 X# Z. t. Y- O% l5 W best_to_far:=va; 3 ~/ g o5 z' d: i end else " o, x' l4 { V* e begin ) n0 R. {1 k$ U _ cur:=vn; 9 g6 }* T* I1 m let vn take place of the oldest string in the tabu list; ( T7 v0 }5 Z' G- `; {
end; 5 a0 C9 v/ j* L
until (termination-condition); : e) x, N* n/ ^7 I1 d; f/ L9 N end; m/ B6 z2 x+ i$ e+ a7 g3 v6 y# z
; a- N6 A: P( K" P' w! J5 r
+ r- T7 x) t8 T 以上程序中有关键的几点: , M' x5 a1 `0 H) K. a" ]2 H g+ W. ^' V (1)禁忌对象:可以选取当前的值(cur)作为禁忌对象放进tabu - ]6 }: U7 T6 z- W' ]- E1 X
list,也可以把和当然值在同一“等高线”上的都放进tabu 6 |2 L: H) h) r/ V; N list。 ) u& w, a/ S0 q6 ~ (2)为了降低计算量,禁忌长度和禁忌表的集合不宜太大,但是禁忌长度太小容易循环搜索,禁忌表太小容易陷入“局部极优解”。/ W f! k) D) l( f
( p3 N9 I3 u7 d4 g8 J" V
! ^, }: |( f8 |" G3 g' ^! q3 T (3)上述程序段中对best_to_far的操作是直接赋值为最优的“解禁候选解”,但是有时候会出现没有大于best_to_far的,候选解也全部被禁的 “死锁”状态,这个时候,就应该对候选解中最佳的进行解禁,以能够继续下去。 % r0 C7 W, [: J! k2 d P - B4 s2 J5 J/ S. Z & D+ Q7 q+ N; @& r4 p P (4)终止准则:和模拟退火,遗传算法差不多,常用的有:给定一个迭代步数;设定与估计的最优解的距离小于某个范围时,就终止搜索;当与最优解的距离连续若干步 0 d0 f- l- `! m; ]1 `/ v保持不变时,终止搜索; 4 `- I$ W, I% I9 w) m 0 R) R* a! c v7 }0 b * b7 h. f* ?, z/ w: T" Y
禁忌搜索是对人类思维过程本身的一种模拟,它通过对一些局部最优解的禁忌(也可以说是记忆)达到接纳一部分较差解,从而跳出局部搜索的目的。$ F4 X9 _0 t% q/ W2 z/ E
& T9 q; E4 r" F% ]! ~
8 H. c7 V$ S0 ~$ E- {# z- } 人工神经网络(Artificial Neural Network,ANN), Y1 Q) H( c; L7 ?
, v! Z9 j2 R1 }
' b' \8 J* p5 m$ ~/ u" W; Z
神经网络从名字就知道是对人脑的模拟。它的神经元结构,它的构成与作用方式都是在模仿人脑,但是也仅仅是粗糙的模仿,远没有达到完美的地步。和冯·诺依曼机不同 - F; i& G6 B4 m G2 B5 ~" Z2 w" x,神经网络计算非数字,非精确,高度并行,并且有自学习功能。- f( J+ f |* r& V R" ]; A
, I8 Q2 T/ K Y& O. p% w 1 n4 }; h0 J1 ^! e 生命科学中,神经细胞一般称作神经元,它是整个神经结构的最基本单位。每个神经细胞就像一条胳膊,其中像手掌的地方含有细胞核,称作细胞体,像手指的称作树突, F" U! _, w) J是信息的输入通路,像手臂的称作轴突,是信息的输出通路;神经元之间错综复杂地连在一起,互相之间传递信号,而传递的信号可以导致神经元电位的变化,一旦电位高4 `2 Y: _. {' a: ] l) S
出一定值,就会引起神经元的激发,此神经元就会通过轴突传出电信号。 1 q4 u |' E2 R6 l& z3 Y( x / _9 O7 g$ \# m# A: d" U0 N2 i T7 D, A + K4 r3 ~, ]" s: q$ x 而如果要用计算机模仿生物神经,就需要人工的神经网络有三个要素:(1)形式定义人工神经元;(2)给出人工神经元的连接方式,或者说给出网络结构;(3)给出 / ?/ a* b, M; F8 a6 w, T人工神经元之间信号强度的定义。3 {( A, J7 [ C0 ~+ C5 ~ P4 x
% w" f4 ~) P3 e* O% w* ]& ~
9 t0 Z2 Z- z) l, A/ d; ^( H
历史上第一个人工神经网络模型称作M-P模型,非常简单:' n! J0 m# G! V0 @- ?* e- \: i