% J5 ~3 d" H7 z4 B/ T7 T Y, u遗传算法$ M @4 ^0 y0 |* O2 u& } m7 Z
遗传算法(Genetic Algorithm, GA)是近几年发展起来的一种崭新的全局优化算法。1962年霍兰德(Holland)教授首次提出了GA算法的思想,它借用了仿真生物遗传学和自然选择机理,通过自然选择、遗传、变异等作用机制,实现各个个体的适应性的提高。从某种程度上说遗传算法是对生物进化过程进行的数学方式仿真。 ) k! q& G# u3 s1 M这一点体现了自然界中"物竞天择、适者生存"进化过程。与自然界相似,遗传算法对求解问题的本身一无所知,它所需要的仅是对算法所产生的每个染色体进行评价,把问题的解表示成染色体,并基于适应值来选择染色体,使适应性好的染色体有更多的繁殖机会。在算法中也即是以二进制编码的串。并且,在执行遗传算法之前,给出一群染色体,也即是假设解。然后,把这些假设解置于问题的“环境”中,也即一个适应度函数中来评价。并按适者生存的原则,从中选择出较适应环境的染色体进行复制, 淘汰低适应度的个体,再通过交叉,变异过程产生更适应环境的新一代染色体群。对这个新种群进行下一轮进化,至到最适合环境的值。0 O$ C0 r0 d8 x D
遗传算法已用于求解带有应用前景的一些问题,例如遗传程序设计、函数优化、排序问题、人工神经网络、分类系统、计算机图像处理和机器人运动规划等。8 T( ?' G6 z" A 术语说明7 }5 s2 U' c3 o* h* a
由于遗传算法是由进化论和遗传学机理而产生的搜索算法,所以在这个算法中会用到很多生物遗传学知识,下面是我们将会用来的一些术语说明:6 j5 N( _' M, Z) r- y" i 一、染色体(Chronmosome) % t# f1 N1 N! c$ B9 H染色体又可以叫做基因型个体(individuals),一定数量的个体组成了群体(population),群体中个体的数量叫做群体大小。/ a( M8 @) r7 A& W. V2 W8 Y 二、基因(Gene)% v% S% b% b @, I
基因是串中的元素,基因用于表示个体的特征。例如有一个串S=1011,则其中的1,0,1,1这4个元素分别称为基因。它们的值称为等位基因(Alletes)。9 d' _, V3 y+ m3 N4 ?: F Y' ` 三、基因地点(Locus) $ Z5 }1 p: [( J/ c) f" M+ n& h基因地点在算法中表示一个基因在串中的位置称为基因位置(Gene Position),有时也简称基因位。基因位置由串的左向右计算,例如在串 S=1101 中,0的基因位置是3。& Y6 K8 H; @# v: X$ B Z* y 四、基因特征值(Gene Feature)* i( b0 j: f' q' Y( j4 E4 r
在用串表示整数时,基因的特征值与二进制数的权一致;例如在串 S=1011 中,基因位置3中的1,它的基因特征值为2;基因位置1中的1,它的基因特征值为8。 ( u/ p2 v. {, X; F$ M+ [6 h P五、适应度(Fitness) & Z/ |+ y0 q, Q" P4 p7 n* `& D各个个体对环境的适应程度叫做适应度(fitness)。为了体现染色体的适应能力,引入了对问题中的每一个染色体都能进行度量的函数,叫适应度函数. 这个函数是计算个体在群体中被使用的概率。' g$ ~( M( |( q 操作算法 V( O, [8 u, r3 O5 ?+ J0 ^+ d
霍兰德(Holland)教授最初提出的算法也叫简单遗传算法,简单遗传算法的遗传操作主要有三种:选择(selection)、交叉(crossover)、变异(mutation)这也是遗传算法中最常用的三种算法:5 w0 ?5 ^3 O6 P% u R2 z8 B 1.选择(selection)! H+ {6 k4 `2 Z' J8 i; n
选择操作也叫复制操作,从群体中按个体的适应度函数值选择出较适应环境的个体。一般地说,选择将使适应度高的个体繁殖下一代的数目较多,而适应度较小的个体,繁殖下一代的数目较少,甚至被淘汰。最通常的实现方法是轮盘赌(roulette wheel)模型。令Σfi表示群体的适应度值之总和,fi表示种群中第i个染色体的适应度值,它被选择的概率正好为其适应度值所占份额fi/Σfi。如下图表中的数据适应值总和Σfi=6650,适应度为2200变选择的可能为fi/Σfi=2200/6650=0.394.8 v6 ? L; f4 z& Y4 w
1 ~5 X( F# n# w8 g6 q6 I* u
[url=]图1. 轮盘赌模型[/url] ; n( C' c) v1 o5 d+ i" K. `. L+ {' u2 p" z6 O- B
Fitness 值:
2200
1800
1200
950
400
100
选择概率:
3331
0.271
0.18
0.143
0.06
0.015
2.交叉(Crossover)% i( g9 e6 h6 S! d" a. D7 g8 X
交叉算子将被选中的两个个体的基因链按一定概率pc进行交叉,从而生成两个新的个体,交叉位置pc是随机的。其中Pc是一个系统参数。根据问题的不同,交叉又为了单点交叉算子(Single Point Crossover)、双点交叉算子(Two Point Crossover)、均匀交叉算子 (Uniform Crossover),在此我们只讨论单点交叉的情况。! k1 f. @9 N: c# B' |$ c" ]
单点交叉操作的简单方式是将被选择出的两个个体S1和S2作为父母个体,将两者的部分基因码值进行交换。假设如下两个8位的个体: 3 q3 p0 O! r6 h8 N t
程序的停止条件最简单的有如下二种:完成了预先给定的进化代数则停止;种群中的最优个体在连续若干代没有改进或平均适应度在连续若干代基本没有改进时停止。 % M4 j9 E* R( o4 Y& [根据遗传算法思想可以画出如右图所示的简单遗传算法框图: ; {8 `$ M, k' s6 a 5 u6 r9 |5 e* N[url=]图3. 简单遗传算法框图[/url]8 m+ \# f9 E( t0 X b 9 x1 A( S a/ B7 e
下面伪代码简单说明了遗传算法操作过程: # G- A( Z/ T% f8 u
choose an intial population2 M1 T( `8 ~: R: X7 j7 }
For each h in population,compute Fitness(h); B6 o& H! t9 }/ G. |1 g" M
While(max Fitness(h) < Fitnessthreshold)' K" z! M; R2 W: c3 j9 Z
do selection " G; T+ s" x8 e# K" J4 g- D& B do crossover1 p" G3 H/ C$ S7 C$ c) H- \4 o( Z
do mutation 9 l; [. C: U9 S' R* C$ K7 `
update population4 X9 @4 U! d& L l: \
For each h in population,compute Fitness(h) $ S9 D7 ^7 b1 s, @" w" JReturn best Fitness1 w1 C) o; }0 g% I) D
' D W% c8 a. O" T
Robocode 说明 : P$ n8 Z0 x2 R# _: n能有效实现遗传算法的应用例子有很多,像西洋双陆棋、国际名模等等都是遗传程序设计学习的工具,但是 Robocode 有着其他几个无可比拟的优势:9 t" j. H! `( {1 J
下面是 doMove 移动方法中使用部分程序代码: * Y, l; F+ @" E% `Random: , Y% [2 m" K# [! h. G7 D% h
switch(Math.random()*2) { 2 [4 E8 N7 ^$ e! d# x" \0 h case 0: setTurnRight(Math.random()*90);( f8 I" _# P7 K% t
break;* j$ T; P9 a4 Z3 m+ {5 r& i% y
case 1: setTurnLeft(Math.random()*90);( [4 r3 l% |3 j5 [7 [# G- A5 h0 V
break; }, g; J8 s! ]# @5 _3 R& m
execute(); 2 E9 h0 K$ S9 n8 G
9 h: K9 c2 `* J! U F
Linear: 0 _) k; Y @3 N3 Y, w0 \4 G
ahead(200);4 [3 U/ g4 @, X- U. b0 n* ?7 M
setBack(200);. ]+ t% ~. I c6 j3 m2 M) T
3 y2 {( d( _5 _' K! p4 J1 {
Circular: 9 D c1 @4 _# F' ~# m
setTurnRight(1000); 7 J3 g5 g$ Q; D4 gsetMaxVelocity(4);! v7 G, G, u" l9 w
ahead(1000);$ M g+ _0 {( K/ {) C+ K
2 d0 P) M, A/ eanti gravity: # o. w1 ^' p6 Z7 D2 {
double forceX = 0;/ K* t! J( Z3 u' q* g
double forceY = 0; ' z+ z/ t0 e; n- s1 w3 N for (int i=0; i
4 D: W, v/ v# n0 e这里我们用遗传算法来控制机器人移动位置。这些策略是基于下面几点:机器人人自己的位置、速度和方位;对手的位置(x,y坐标)、速度、方位以及相对角;所有机器人和子弹位置,方位及速度;场地大小等参数。 - { T; V0 d& @当上面的信息在下一回移动中使用时,出输出一对坐标值,根据这对坐标在Robocode就能得到距离和角度。要想让移动实现遗传必须要让它实现在线学习:所以我们的代码必须做下面几件事:要有一个函数收集适应度值,在Robocode运行过程中要运用到遗传操作,遗传后代要在Robocode运行中产生,而不是事后由手写入代码。1 N/ s: E4 r. M) X/ z 遗传操作: l X# d: v' g3 W$ {+ l
本例中遗传算法为实现移动用到两个类GA和MovePattern。此处的GA比较简单主要完成数据和群体的定义,以及这些定义的读写文件操作。基中包括如下参数:群体大小、交叉概率、变异概率、精英概率(既告诉从当前群体到下一代中有多少移动不需要改变)、方程式中使用的加权系数大小,它通过一个主循环完成MovePattern的封装。MovePattern类中实现交叉、变异方法等方法,完成移动模式操作。而所有的输出保存在一个vector函数当中。Vector函数拥有一对实数数组,一个用于计算x坐标,另一个用于计算y坐标。通过对x,y坐标的计算,从而得到距离、角度等值,并产生相就在移动策略。如下,MovePattern包含三个参数,grad表示vector函数排列顺序,input即表示算法给出的输入编号,rang是加权的范围。 2 e- }8 }+ f4 i
public class MovePatteren implements Comparable { 1 B! t; e. p& f6 b private int grad, input;8 @( J) M2 N- F% I( C8 u. K4 e. m
private double range; 7 `8 D" s7 b7 y4 N protected double fitness=0;: r4 o' e; c9 ?1 n3 m* M. q
protected double[] weightsX, weightsY; * r9 y+ D; z3 h L; T
… }' X. a: ~4 g2 x