作为一个算法的初学者,最近看了一下计算智能(人工智能的一个重要领域)的相关内容。。。在这里简单介绍一下进化计算中的遗传算法吧大概吧。。。这种综述性的暂且看看吧。。。
遗传算法(Genetic Algorithm, GA)是一种随机自适应的全局搜索算法,这种算法正是通过模拟自然界中生物的遗传进化过程,对优化问题的最优解进行搜索。 这种搜索全局最优解的过程是一个不断迭代的过程(每次迭代相当于生物进化中的一次循环),直到满足算法的终止条件为止。
基本思想:从一初始化的群体出发,通过一系列的遗传操作,包括随机的选择(使群体中优秀的个体有更多的机会传给下一代),交叉(群体内个体之间的信息交换),和变异(引入新的变种来确保信息的多样性),使最具有生存能力的染色体以最大可能生存,群体一代一代地进化到搜索空间中越来越好的区域。(”人的好多灵感真的是来自大自然耶。。。“)
生物遗传进化的基本生物要素和遗传算法的基本要素定义的对照关系:
生物遗传进化 | 遗传算法 |
---|---|
群体 | 问题搜索空间的一组有效解(表现为群体规模N) |
种群 | 经过选择产生的新群体(规模同样为N) |
染色体 | 问题有效解的编码串 |
基因 | 染色体的一个编码单元 |
适应能力 | 染色体的适应值 |
交配 | 两个染色体交换部分基因得到两个新的子代染色体 |
变异 | 染色体某些基因的数值发生变化 |
进化结束 | 算法满足终止条件时结束,输出全局最优解 |
遗传算法的流程结构:
1. 染色体编码
两种常用的较简单的编码方法:二进制编码方法和浮点数编码方法。
二进制编码方法中,产生的染色体是一个二进制符号序列,染色体的每一个基因只能取值0或1。例如,假设 [Umin,Umax] 为 [1,64] ,采用6位二进制符号串进行编码,则二进制符号串000000代表数值1,符号串111111代表数值64,符号串010001代表数值18等等。
浮点数编码方法中,染色体的长度等于问题定义的解的变量个数,染色体的每一个基因等于解的每一维变量。例如,待求解问题的一个有效解为 (x1i,x2i,x3i,...,xD−1i,xDi) ,D为维数。则该解对应的染色体编码为 (x1i,x2i,x3i,...,xD−1i,xDi) 。这种编码方法适用于取值范围比较大的数值。
2. 群体的初始化
一般情况下,遗传算法在群体初始化阶段采用的是随机数初始方法。采用生成随机数的方法,对染色体的每一维变量进行初始化赋值。初始化染色体时必须注意是否满足优化问题对有效解的定义。
3. 适应值评价
评估函数用于评估各个染色体的的适应值,进而区分优劣。评估函数常常根据问题的优化目标来确定。
4. 选择算子
轮盘赌选择算法是遗传算法最经常使用的选择算法,其基本思想是基于概率的随机选择。轮盘赌选择算法首先根据群体中每个染色体的适应值得到群体所有染色体的适应值总和,并分别计算每个染色体适应值与群体适应值总和的比 Pi ;其次假设一个具有N个扇区的轮盘,每个扇区对应群体中的一个染色体,扇区的大小与对应染色体的 Pi 值成正比关系。每选择转动一次轮盘,轮盘转动停止时指针停留的扇区对应的染色体即将被选中进入种群。依次进行N次选择即可得到规模同样为N的种群。
5. 交配算子
在染色体交配阶段,每个染色体能否进行交配由交配概率 Pc (一般取值为0.4~0.99之间)决定,其具体过程为:对于每个染色体,如果 Random(0,1) 小于 Pc 则表示该染色体可进行交配操作(其中 Random(0,1) 为[0,1]间均匀分布的随机数产生器),否则染色体不参与交配直接复制到新种群中。
交配的具体操作是随机产生一个有效的交配位置,染色体交换位于交配位置后的所有基因。
交配操作应该注意产生的子代染色体应满足问题对有效解的定义。同时,参与交配的父代染色体个数与产生的子代染色体个数一样,因此新种群的规模依然为N。
6. 变异算子
对于交配后新种群中染色体的每一位基因,根据变异概率 Pm 判断该基因是否进行变异。如果 Random(0,1) 小于 Pm ,则改变该基因的取值,否则该基因不发生变异,保持不变。一般地, Pm 可设定在0.001~0.1之间。
7. 算法流程
流程图:
Created with Raphaël 2.1.0 Start 初始化群体 适应值评价,保存最优染色体 选择 交配 变异 重新评价适应值,更新最优染色体 满足终止条件? End yes no
伪代码:
/*
P(t)表示某一代的群体,t为当前进化代数
Best表示目前已找到的最优解
*/
Procedure GA
begin
t=0;
initialize(P(t)); //初始化群体
evaluate(P(t)); //适应值评价
keep_best(P(t)); //保存最优染色体
while(不满足终止条件)do
begin
P(t)=selection(P(t)); //选择算子
P(t)=crossover(P(t)); //交配算子
P(t)=mutation(P(t)); //变异算子
t=t+1;
P(t)=P(t-1);
evaluate(P(t));
if(P(t)的最优适应值大于Best的适应值)
//以P(t)的最优染色体替代Best
replace(Best);
end if
end
end
基本遗传算法
现在用一个简单的函数优化的例子,来说明遗传算法的执行过程。。。
例如:用遗传算法求在 [0,31] 上 f(x)=x2 函数的最大值。
1. 编码
将变量x编码为5位长的二进制无符号整数表示形式:以 00000 表示 x=0 , 00001 表示 x=1 ,…, 11111 表示 x=31 。
2. 初始群体的生成
为了简化,可取群体大小为4。初始群体称作为进化的初始代,即第1代。初始群体的每个个体都是通过随机方法产生的,例如,产生的初始种群为01101(13)、11000(24)、01000(8)和10011(19)。
3. 适应度函数
这里可简单地根据 f(x)=x2 来评估群体中各个体。
4. 选择
首先计算群体中所有个体适应度的总和: 132+242+82+192=1170 ,再计算每个适应度所占的比例,如第1个个体适应度所占比例为 132/1170=169/1170=0.14 ,并以此作为相应的选择概率 Ps 。个体的选择概率越大,被选择的机会就越大。则第2、3、4个个体所占的比例为0.49,0.06,0.31,并根据累积概率,即可划分四个区间: [0,0.14),[0.14,0.63),[0.63,0.69),[0.69,1.00)。
为了从初始种群中选择4个个体进行下一步的选择操作,产生4个 [0,1] 区间的随机数,假设产生的4个随机数依次为0.12,0.49,0.32和0.75。由于0.12位于累计概率区间 [0,0.14) ,因此个体1被选中,0.49位于累计概率区间 [0.14,0.63) ,因此个体2被选中。以此类推,另外被选中的两个个体为个体2和个体4。个体2被选择了两次,个体1和4都被选择了一次,个体3未被选择,这时我们期望的结果:最优秀的个体(个体2,适应度为576)获得最多的生存繁殖机会;最差的个体(个体3,适应度为64)被淘汰。
5. 交叉操作
交叉操作(交配操作)可以说是遗传算法中最主要的遗传操作。由于交叉概率 Pc 通常都预设为较大的值,这里我们可假设为0.8左右。接着产生一个 [0,1] 的随机数,若随机数小于 Pc ,则进行交叉操作,反之不进行。
在上述的选择操作中选择的4个个体{1,2,2,4}形成两对个体{(1,2),(2,4)}来进行交叉操作。由于交配方式是交换指定位置后的全部基因,故对于长度为L的个体,存在长度为L-1种交叉位置。
在这里,L=5,故有4种交叉位置。交叉位置也是随机产生的。假设上述两对个体的交叉位置分别为4和2,则:
(1)个体1(0110|1)与个体2(1100|0)交叉后得到新一代个体1(01100)与新一代个体2(11001);
(2)个体2(11|000)与个体2(10|011)交叉后得到新一代个体1(11011)与新一代个体2(10000)。
可以看出,新群体中个体适应度的平均值和最大值都有了明显提高,新群体的个体的确朝着我们所期望的方向进化了。
计算流程:
编号 | 初始群体 | x | 适应度 f(x)=x2 | 选择概率 Ps | 累计概率 | 实际计数 | 交叉位置 | 新一代种群 | x | f(x)=x2 |
---|---|---|---|---|---|---|---|---|---|---|
1 | 01101 | 13 | 169 | 0.14 | 0.14 | 1 | 4 | 01100 | 12 | 144 |
2 | 11000 | 24 | 576 | 0.49 | 0.63 | 2 | 4 | 11001 | 25 | 625 |
3 | 01000 | 8 | 64 | 0.06 | 0.69 | 0 | 2 | 11011 | 27 | 729 |
4 | 10011 | 19 | 361 | 0.31 | 1.00 | 1 | 2 | 10000 | 16 | 256 |
总和 | 1170 | 1.00 | 4.00 | 4.0 | ||||||
平均 | 293 | 0.25 | 1.00 | 1.0 | ||||||
最大 | 24 | 576 | 0.49 | 1.97 | 2.0 | 27 |
然而,这只是个简单的单变量函数,不足以说明遗传算法的优点。。。其实对于由几十个到几百个变量组成的函数,遗传算法照样能够不依靠任何搜索空间的外部知识而仅用适应度函数来指导和优化搜索的方向。
6. 变异
变异操作是按位进行的,即把某一位的内容进行变异,这也是随机进行的。对于二进制编码的个体来说,个体的每一位按变异概率 Pm 执行反转操作。一般地,变异概率 Pm 都取得非常小。假设在这里我们取 Pm=0.001 ,由于群体中共有 20∗0.001=0.02 位可以变异,说明几乎没有一位可以变异。
变异操作是非常微妙的遗传操作,需要与交叉操作妥善配合使用,目的是挖掘群体中个体的多样性,克服有可能限于局部解的弊病。
在这里只讲了一些很基础的东西,之后有机会的话可以再谈谈遗传算法的数学理论基础(模式理论)和遗传算法的实现技术(对于技术层面的东西。。额。。我要花多点工夫才行。。)
参考文献:
【1】计算智能. 夏定纯 徐涛. 科学出版社
【2】计算智能导论. Andries.P.Engelbrecht. 清华大学出版社
【3】计算智能. 张军 詹志辉. 清华大学出版社