. W! c2 }4 g7 g" M遗传算法3 ^" j: I, D( @# P3 h! `
遗传算法(Genetic Algorithm, GA)是近几年发展起来的一种崭新的全局优化算法。1962年霍兰德(Holland)教授首次提出了GA算法的思想,它借用了仿真生物遗传学和自然选择机理,通过自然选择、遗传、变异等作用机制,实现各个个体的适应性的提高。从某种程度上说遗传算法是对生物进化过程进行的数学方式仿真。 $ A) {$ V ~5 z& h这一点体现了自然界中"物竞天择、适者生存"进化过程。与自然界相似,遗传算法对求解问题的本身一无所知,它所需要的仅是对算法所产生的每个染色体进行评价,把问题的解表示成染色体,并基于适应值来选择染色体,使适应性好的染色体有更多的繁殖机会。在算法中也即是以二进制编码的串。并且,在执行遗传算法之前,给出一群染色体,也即是假设解。然后,把这些假设解置于问题的“环境”中,也即一个适应度函数中来评价。并按适者生存的原则,从中选择出较适应环境的染色体进行复制, 淘汰低适应度的个体,再通过交叉,变异过程产生更适应环境的新一代染色体群。对这个新种群进行下一轮进化,至到最适合环境的值。 * c6 E# i# |. s" n/ C# d遗传算法已用于求解带有应用前景的一些问题,例如遗传程序设计、函数优化、排序问题、人工神经网络、分类系统、计算机图像处理和机器人运动规划等。; ~/ I$ f% J; I; s0 P6 i% B 术语说明 5 x4 `: [ G% B7 M* K: Z由于遗传算法是由进化论和遗传学机理而产生的搜索算法,所以在这个算法中会用到很多生物遗传学知识,下面是我们将会用来的一些术语说明:6 n$ {2 F* Z6 k( o, `# H! @ 一、染色体(Chronmosome). ~2 {3 C. p; f) @; o7 m* i
染色体又可以叫做基因型个体(individuals),一定数量的个体组成了群体(population),群体中个体的数量叫做群体大小。 ' @/ n. K m5 O! }1 q' r二、基因(Gene) : f; m8 _8 F C: |- z% ^基因是串中的元素,基因用于表示个体的特征。例如有一个串S=1011,则其中的1,0,1,1这4个元素分别称为基因。它们的值称为等位基因(Alletes)。 3 l7 G: C: O6 D4 `1 s三、基因地点(Locus) 0 [$ s% _( S# q& r8 e基因地点在算法中表示一个基因在串中的位置称为基因位置(Gene Position),有时也简称基因位。基因位置由串的左向右计算,例如在串 S=1101 中,0的基因位置是3。: b) g; ~2 `. P) e; [3 f 四、基因特征值(Gene Feature) 3 {# E' @* w% b7 S. O: E在用串表示整数时,基因的特征值与二进制数的权一致;例如在串 S=1011 中,基因位置3中的1,它的基因特征值为2;基因位置1中的1,它的基因特征值为8。/ ~2 k9 h9 ?; v9 I- m 五、适应度(Fitness) + [6 i" Y0 O* \+ l9 p5 M' s各个个体对环境的适应程度叫做适应度(fitness)。为了体现染色体的适应能力,引入了对问题中的每一个染色体都能进行度量的函数,叫适应度函数. 这个函数是计算个体在群体中被使用的概率。 2 y4 ? G1 E# R操作算法 # M" j8 y5 i! R霍兰德(Holland)教授最初提出的算法也叫简单遗传算法,简单遗传算法的遗传操作主要有三种:选择(selection)、交叉(crossover)、变异(mutation)这也是遗传算法中最常用的三种算法: 7 G! @0 a" C/ m% w8 d# p3 L+ S1.选择(selection) & O$ p4 M- p# z3 J7 ^选择操作也叫复制操作,从群体中按个体的适应度函数值选择出较适应环境的个体。一般地说,选择将使适应度高的个体繁殖下一代的数目较多,而适应度较小的个体,繁殖下一代的数目较少,甚至被淘汰。最通常的实现方法是轮盘赌(roulette wheel)模型。令Σfi表示群体的适应度值之总和,fi表示种群中第i个染色体的适应度值,它被选择的概率正好为其适应度值所占份额fi/Σfi。如下图表中的数据适应值总和Σfi=6650,适应度为2200变选择的可能为fi/Σfi=2200/6650=0.394.4 |: u6 a. G3 G: t3 M7 _
4 [4 |3 V$ g4 J$ C* i0 _" C: p, v
[url=]图1. 轮盘赌模型[/url]8 m, }2 w7 j2 b' ]! e ' X- A" s W6 Q8 X0 e/ t' ^! ~% p
Fitness 值:
2200
1800
1200
950
400
100
选择概率:
3331
0.271
0.18
0.143
0.06
0.015
2.交叉(Crossover)" z7 L f' `' s% v4 J; C1 r6 e
交叉算子将被选中的两个个体的基因链按一定概率pc进行交叉,从而生成两个新的个体,交叉位置pc是随机的。其中Pc是一个系统参数。根据问题的不同,交叉又为了单点交叉算子(Single Point Crossover)、双点交叉算子(Two Point Crossover)、均匀交叉算子 (Uniform Crossover),在此我们只讨论单点交叉的情况。5 q v$ F3 w1 j$ Z. ]4 F- G( s
单点交叉操作的简单方式是将被选择出的两个个体S1和S2作为父母个体,将两者的部分基因码值进行交换。假设如下两个8位的个体: r/ M& c0 y* g$ e( p! J6 z
0 u9 a) v- A* c' ~3 B0 Q[url=]图3. 简单遗传算法框图[/url]% k+ _& t# y! o ; {5 e/ _, U- R: I5 X0 A6 o& Y下面伪代码简单说明了遗传算法操作过程:. \: g( q9 b* _" R3 i1 G
choose an intial population : n( F5 W3 x$ g: \" r/ sFor each h in population,compute Fitness(h) B) z9 r( m! Q% }* [
While(max Fitness(h) < Fitnessthreshold)7 a, }! e, C( N2 D9 M8 H2 L" P
do selection# U* @5 |. l2 {
do crossover 4 j3 T# j4 V4 n2 K0 T, odo mutation 8 U# n0 C' P o
update population0 u- v: T/ p J, V, \
For each h in population,compute Fitness(h) 5 L: O' b; S0 R# x' J- WReturn best Fitness; r2 M% N1 ]4 P; T2 {
4 }4 p8 F! g" l CRobocode 说明9 I* N& y1 H3 L. L0 N' R" T
能有效实现遗传算法的应用例子有很多,像西洋双陆棋、国际名模等等都是遗传程序设计学习的工具,但是 Robocode 有着其他几个无可比拟的优势:' U% t/ M, ] G* N0 q0 P
下面是 doMove 移动方法中使用部分程序代码: : K1 R$ a5 i! V& C- W% ORandom:" N' k1 U! a* k
switch(Math.random()*2) {# ~! j$ y! p; }9 `9 s( M) S' e! c
case 0: setTurnRight(Math.random()*90); / W' H5 O% k( k2 l/ E+ Xbreak;$ }' L/ s: E e6 |" K
case 1: setTurnLeft(Math.random()*90); 6 G+ l' c. x9 w i1 s0 c break; } 8 @6 ]3 w% @6 m0 l* c2 ^* I execute(); ; Q. r/ g. ~5 f2 u$ ^- m7 A