* c: s# K ^& y8 T i[url=]图1. 轮盘赌模型[/url] 9 w- k2 y1 f4 A0 H3 L2 r! k' b, N4 u: s3 O
Fitness 值:
2200
1800
1200
950
400
100
选择概率:
3331
0.271
0.18
0.143
0.06
0.015
2.交叉(Crossover)* p& b; N9 }8 l% x
交叉算子将被选中的两个个体的基因链按一定概率pc进行交叉,从而生成两个新的个体,交叉位置pc是随机的。其中Pc是一个系统参数。根据问题的不同,交叉又为了单点交叉算子(Single Point Crossover)、双点交叉算子(Two Point Crossover)、均匀交叉算子 (Uniform Crossover),在此我们只讨论单点交叉的情况。: z2 Q! G- y- s0 c" W( |8 K
单点交叉操作的简单方式是将被选择出的两个个体S1和S2作为父母个体,将两者的部分基因码值进行交换。假设如下两个8位的个体: / p+ e8 e2 q5 i2 U+ n" X/ |
S1 1000 1111 S2 1110 1100
. \6 U. `1 ]9 x
产生一个在1到7之间的随机数c,假如现在产生的是2,将S1和S2的低二位交换:S1的高六位与S2的低六位组成数串10001100,这就是S1和S2 的一个后代P1个体;S2的高六位与S1的低二位组成数串11101111,这就是S1和S2的一个后代P2个体。其交换过程如下图所示:" b: H' Q+ |7 |1 A
Crossover
11110000
Crossover
11110000
S1
1000 1111
S2
1110 1100
P1
1000 1100
P2
1110 1111
3.变异(Mutation)* _8 v1 b3 i( @* w& ~' O( \8 n
这是在选中的个体中,将新个体的基因链的各位按概率pm进行异向转化,最简单方式是改变串上某个位置数值。对二进制编码来说将0与1互换:0变异为1,1变异为0。 5 N+ {8 G. n( ^1 h6 R+ _/ `如下8位二进制编码: 6 m4 J9 O; V+ l W
1 1 1 0 1 1 0 0
; g X( [" h' j; J
随机产生一个1至8之间的数i,假如现在k=6,对从右往左的第6位进行变异操作,将原来的1变为0,得到如下串:5 C+ h1 q2 F5 p4 Q0 T3 m6 R, @. O
1 1 0 0 1 1 0 0
7 n) A J4 T& x T! I6 g% x整个交叉变异过程如下图: ( Z& Y- K- f* ]& ^9 i1 h [+ D, S6 O; e0 R9 i4 I! d' c8 ~6 V
[url=]图2. 交叉变异过程[/url] 3 u! ~9 K4 S& [# c! K4 T) l 9 _# t9 W, W: s7 Y5 ]8 G 2 e: r. V$ M- Q 4.精英主义 (Elitism) 2 k: [8 n; E. z仅仅从产生的子代中选择基因去构造新的种群可能会丢失掉上一代种群中的很多信息。也就是说当利用交叉和变异产生新的一代时,我们有很大的可能把在某个中间步骤中得到的最优解丢失。在此我们使用精英主义(Elitism)方法,在每一次产生新的一代时,我们首先把当前最优解原封不动的复制到新的一代中,其他步骤不变。这样任何时刻产生的一个最优解都可以存活到遗传算法结束。 * R3 ?9 j( z) Q1 F8 t! ^7 m9 F上述各种算子的实现是多种多样的,而且许多新的算子正在不断地提出,以改进GA某些性能。比如选择算法还有分级均衡选择等等。" B7 f/ _: T$ K% B, N 遗传算法的所需参数7 Q) r5 [' h1 M: A5 _) Z
说简单点遗传算法就是遍历搜索空间或连接池,从中找出最优的解。搜索空间中全部都是个体,而群体为搜索空间的一个子集。并不是所有被选择了的染色体都要进行交叉操作和变异操作,而是以一定的概率进行,一般在程序设计中交叉发生的概率要比变异发生的概率选取得大若干个数量级。大部分遗传算法的步骤都很类似,常使用如下参数:5 ?0 u6 ]3 i* }4 K. e/ P" V# v
Fitness函数:见上文介绍。 . Z5 \* {, v) Q5 x3 }0 _Fitnessthreshold(适应度阀值):适合度中的设定的阀值,当最优个体的适应度达到给定的阀值,或者最优个体的适应度和群体适应度不再上升时(变化率为零),则算法的迭代过程收敛、算法结束。否则,用经过选择、交叉、变异所得到的新一代群体取代上一代群体,并返回到选择操作处继续循环执行。 ! K1 m4 }( B% FP:种群的染色体总数叫种群规模,它对算法的效率有明显的影响,其长度等于它包含的个体数量。太小时难以求出最优解,太大则增长收敛时间导致程序运行时间长。对不同的问题可能有各自适合的种群规模,通常种群规模为 30 至 160。 1 H: T9 m4 R' s" C+ qpc:在循环中进行交叉操作所用到的概率。交叉概率(Pc)一般取0.6至0.95之间的值,Pc太小时难以向前搜索,太大则容易破坏高适应值的结构。 ( {1 z! @9 [, S x) D* L6 y+ VPm:变异概率,从个体群中产生变异的概率,变异概率一般取0.01至0.03之间的值变异概率Pm太小时难以产生新的基因结构,太大使遗传算法成了单纯的随机搜索。 j. H1 B% S9 O. G5 j8 e. T I" I" G另一个系统参数是个体的长度,有定长和变长两种。它对算法的性能也有影响。由于GA是一个概率过程,所以每次迭代的情况是不一样的,系统参数不同,迭代情况也不同。 7 X8 s+ F( t) k遗传步骤) A0 _5 k: n2 ^. R' w C5 }
了解了上面的基本参数,下面我们来看看遗传算法的基本步骤。 2 s V7 x; w o% J5 p* ~' Z基本过程为: # q9 \9 H9 ?" {- c6 f' ^: }! n
程序的停止条件最简单的有如下二种:完成了预先给定的进化代数则停止;种群中的最优个体在连续若干代没有改进或平均适应度在连续若干代基本没有改进时停止。) S1 ?# @; X/ w, t [4 R, \
根据遗传算法思想可以画出如右图所示的简单遗传算法框图: " E+ ~3 N/ q$ Z8 \1 m9 b# K 6 p$ J& X: Q8 ?# e[url=]图3. 简单遗传算法框图[/url]0 g0 N' S! U: Z# A4 E 7 f" B/ p& b4 T1 s' O下面伪代码简单说明了遗传算法操作过程:' R, `0 W% p8 w/ X( |; r7 S
choose an intial population0 A y8 L- O }5 U" M" M
For each h in population,compute Fitness(h)0 g* k5 q4 {8 b2 p' ?4 z4 X. z( D
While(max Fitness(h) < Fitnessthreshold)) u' z" [1 P" c5 z: k5 f+ s% x
do selection ' \5 `# a4 p% \( Z1 A! }" Y$ Y do crossover% H* a' n* C3 k# o
do mutation , i1 n- N. E4 e
update population1 S u7 v2 C6 m, m# U
For each h in population,compute Fitness(h)1 j: ^- m! \9 g. W- M( a$ Y1 \2 C
Return best Fitness . c9 B" C, N6 g9 |, [2 s0 a