# N. Y* b* O, [! [8 r# c 9 y; O9 h" [/ n& k! C1 H4 y遗传算法 4 e. [4 E4 G7 `2 i( n遗传算法(Genetic Algorithm, GA)是近几年发展起来的一种崭新的全局优化算法。1962年霍兰德(Holland)教授首次提出了GA算法的思想,它借用了仿真生物遗传学和自然选择机理,通过自然选择、遗传、变异等作用机制,实现各个个体的适应性的提高。从某种程度上说遗传算法是对生物进化过程进行的数学方式仿真。 ) l; w, X) @4 [, r- \) c这一点体现了自然界中"物竞天择、适者生存"进化过程。与自然界相似,遗传算法对求解问题的本身一无所知,它所需要的仅是对算法所产生的每个染色体进行评价,把问题的解表示成染色体,并基于适应值来选择染色体,使适应性好的染色体有更多的繁殖机会。在算法中也即是以二进制编码的串。并且,在执行遗传算法之前,给出一群染色体,也即是假设解。然后,把这些假设解置于问题的“环境”中,也即一个适应度函数中来评价。并按适者生存的原则,从中选择出较适应环境的染色体进行复制, 淘汰低适应度的个体,再通过交叉,变异过程产生更适应环境的新一代染色体群。对这个新种群进行下一轮进化,至到最适合环境的值。 1 C: R2 o' ~& I! u( ]2 y/ K5 C* ^遗传算法已用于求解带有应用前景的一些问题,例如遗传程序设计、函数优化、排序问题、人工神经网络、分类系统、计算机图像处理和机器人运动规划等。 * C* |- v4 M; Z1 g% R" G- K' g n C术语说明' f3 Q8 g, n& j
由于遗传算法是由进化论和遗传学机理而产生的搜索算法,所以在这个算法中会用到很多生物遗传学知识,下面是我们将会用来的一些术语说明:8 J% r% @# R2 h4 Y. A 一、染色体(Chronmosome) : X) c$ ?! p, |6 o染色体又可以叫做基因型个体(individuals),一定数量的个体组成了群体(population),群体中个体的数量叫做群体大小。! ^, T; B- A' Z* @ 二、基因(Gene)8 x, n, ~& U& }
基因是串中的元素,基因用于表示个体的特征。例如有一个串S=1011,则其中的1,0,1,1这4个元素分别称为基因。它们的值称为等位基因(Alletes)。$ s& _- g# K* a" P7 b 三、基因地点(Locus)! X- H; e; S; x" k! g
基因地点在算法中表示一个基因在串中的位置称为基因位置(Gene Position),有时也简称基因位。基因位置由串的左向右计算,例如在串 S=1101 中,0的基因位置是3。8 A% ^; I5 B$ S6 g" Z/ s 四、基因特征值(Gene Feature)7 t3 H! V7 J3 Z9 V7 U4 x. T
在用串表示整数时,基因的特征值与二进制数的权一致;例如在串 S=1011 中,基因位置3中的1,它的基因特征值为2;基因位置1中的1,它的基因特征值为8。& S& w8 I, A E9 @$ A% [ 五、适应度(Fitness) 9 J) e# }6 q0 m' \4 O: ?; `( K# |各个个体对环境的适应程度叫做适应度(fitness)。为了体现染色体的适应能力,引入了对问题中的每一个染色体都能进行度量的函数,叫适应度函数. 这个函数是计算个体在群体中被使用的概率。 ( d6 L$ t4 w. k! ^操作算法 x3 y* ]6 [" ?" M霍兰德(Holland)教授最初提出的算法也叫简单遗传算法,简单遗传算法的遗传操作主要有三种:选择(selection)、交叉(crossover)、变异(mutation)这也是遗传算法中最常用的三种算法: E7 B( R3 z- I! z# G) b7 G 1.选择(selection)' F) Q# @) Z2 l% D8 f
选择操作也叫复制操作,从群体中按个体的适应度函数值选择出较适应环境的个体。一般地说,选择将使适应度高的个体繁殖下一代的数目较多,而适应度较小的个体,繁殖下一代的数目较少,甚至被淘汰。最通常的实现方法是轮盘赌(roulette wheel)模型。令Σfi表示群体的适应度值之总和,fi表示种群中第i个染色体的适应度值,它被选择的概率正好为其适应度值所占份额fi/Σfi。如下图表中的数据适应值总和Σfi=6650,适应度为2200变选择的可能为fi/Σfi=2200/6650=0.394. * ]! E3 }" B7 _6 d. Y2 S. C% ?9 p# ~; F; s- m9 `
[url=]图1. 轮盘赌模型[/url]7 |/ ] P! O7 U# h% R! m: ` * \! Q3 V. g" C2 |. I- j
Fitness 值:
2200
1800
1200
950
400
100
选择概率:
3331
0.271
0.18
0.143
0.06
0.015
2.交叉(Crossover); H0 y8 c D4 Q( X9 ^
交叉算子将被选中的两个个体的基因链按一定概率pc进行交叉,从而生成两个新的个体,交叉位置pc是随机的。其中Pc是一个系统参数。根据问题的不同,交叉又为了单点交叉算子(Single Point Crossover)、双点交叉算子(Two Point Crossover)、均匀交叉算子 (Uniform Crossover),在此我们只讨论单点交叉的情况。 6 f8 C0 f: B ?! g单点交叉操作的简单方式是将被选择出的两个个体S1和S2作为父母个体,将两者的部分基因码值进行交换。假设如下两个8位的个体:. v1 G) I8 C; ~
S1 1000 1111 S2 1110 1100
* H$ W* f+ \6 p' b产生一个在1到7之间的随机数c,假如现在产生的是2,将S1和S2的低二位交换:S1的高六位与S2的低六位组成数串10001100,这就是S1和S2 的一个后代P1个体;S2的高六位与S1的低二位组成数串11101111,这就是S1和S2的一个后代P2个体。其交换过程如下图所示: 3 S6 R8 E, f. p+ f
输出种群中适应度值最优的个体7 E% x7 `% l8 L' {* _& v. J, O% B" F
程序的停止条件最简单的有如下二种:完成了预先给定的进化代数则停止;种群中的最优个体在连续若干代没有改进或平均适应度在连续若干代基本没有改进时停止。3 K( g z/ R4 k& J- X, n* y* i$ X
根据遗传算法思想可以画出如右图所示的简单遗传算法框图: * m3 X6 T3 p/ c1 j' T& n
8 ?+ Y8 X N1 i' ~2 M$ L7 H
[url=]图3. 简单遗传算法框图[/url]* z1 J- J8 g2 ?+ E* L0 d+ ^ , |( r4 _- M* O" |# n1 }& B下面伪代码简单说明了遗传算法操作过程: d8 @$ \+ C' t/ R
choose an intial population " b3 Y. W' N2 hFor each h in population,compute Fitness(h)# N+ k% C( E7 v
While(max Fitness(h) < Fitnessthreshold)2 R. o, H- ?/ M0 V% `# v/ Y
do selection ; V0 w, C/ G* B" [7 ]- o( x0 \" f" E do crossover; d7 c! `1 n" T8 N. z% u& L- G
do mutation $ |8 K6 }& q1 T" h0 f; N/ I2 E update population / k9 \' ?) P$ a; ^/ u4 UFor each h in population,compute Fitness(h)( b7 V. |& I. q/ k* ^
Return best Fitness / J: [/ m8 y$ }3 d1 E( T8 s
Robocode 行为事件- U+ l( C% g' ~8 w+ o
坦克的主要都定义在一个主循环中,我们在程序中定义为上面四个策略定义四种战略如Move,Radar,Power,Target,当某一事件发生,基于这个事件而定的行为就会触发。而每个战略中都有不同的行为处理方式。这些行为通过遗传算法触发,遗传算法将调用这些基本动作并搜索这些策略的最佳组合。基于这些基本动作将有4224 (=4*11*4*3*8)种可能发生。在Robocode AdvancedRobot 类下有如下的移动函数:, W, O4 z! E' t) s1 k! G& r: ^4 b
setAhead和ahead:让机器人向前移动一定距离.
setBack和back:让机器人向后移动一定距离
setMaxTurnRate:设置机器人最大的旋转速度
setMaxVelocity:设置机器人最大的运动速度
setStop和stop:停止移动或暂停机器人,并记住停止的位置
setResume和resume:重新开始移动停止的机器人
setTurnLeft和turnLeft:向左旋转机器人
setTurnRight和turnRight:向右旋转机器人 # Y- l' e3 I9 z% J/ X- ?2 S: K2 i
下面是 doMove 移动方法中使用部分程序代码: ~5 b3 l& N0 K1 f/ `3 w( E' C
Random:' e) w6 o! K; j: p y7 I7 I7 S+ b
switch(Math.random()*2) {$ F7 A8 C9 t" u9 c' q
case 0: setTurnRight(Math.random()*90);/ g+ u2 N1 D N7 k! k/ h
break;2 c- ^$ f2 N) e7 g* ^
case 1: setTurnLeft(Math.random()*90);' U+ O+ X4 C C: n8 E
break; }7 J3 q6 t3 J9 F: M
execute();( S9 F- c2 m; Y
t, @! @5 r/ M- [3 U' D
Linear:" d6 n& f3 d- p
ahead(200);# z- s% c. \# R x
setBack(200);: k. ^# a% ^9 T4 z# T# ^