遗传算法

遗传算法(Genetic Algorithm)是一类借鉴生物界的进化规律(适者生存,优胜劣汰遗 传机制)演化而来的随机化搜索方法。它是由美国的J.Holland教授1975年首先提出,其主要 特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和 更好的全局寻优能力;采用概率化的寻优方法,能自动获取和指导优化的搜索空间,自适应 地调整搜索方向,不需要确定的规则。

遗传算法也是计算机科学人工智能领域中用于解决最优化的一种搜索启发式算法,是进化算法的一种。这种启发式通常用来生成有用的解决方案来优化和搜索问题。

一、遗传算法的基本流程

这里写图片描述

遗传算法描述如下:

  1. 初始化:设置进化代数计数器 t=0 ,设置最大进化代数 T ,随机生成 M 个个体作为初始群体 S(0)
  2. 个体评价:计算群体 St 中各个个体的适应度。
  3. 选择运算:将选择算子作用于群体。选择的目的是把优化的个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。选择操作是建立在群体中个体的适应度评估基础上的。
  4. 交叉运算:将交叉算子作用于群体。遗传算法中起核心作用的就是交叉算子。
  5. 变异运算:将变异算子作用于群体。即是对群体中的个体串的某些基因座上的基因值作变动。
  6. 群体 St 经过选择、交叉、变异运算之后得到下一代群体 St+1
  7. 终止条件判断:若 t=T ,则以进化过程中所得到的具有最大适应度个体作为最优解输出,终止计算。

二、遗传算法的关键技术

遗传算法的关键技术包含以下五大块:编码问题;初始种群的产生;确定适应值函数;选择遗传操作算子;停机条件。

1. 编码问题 
由于遗传算法不能直接处理解空间的解数据,因此必须通过编码将它们表示成遗传空间的基因型串结构数据。

编码方法在很大程度上决定了如何进行群体的遗传进化运算以及遗传进化的效率。由于不同的编码方法具有不同的特点,为了提高遗传算法的效率,应根据不同的情况采用不同的编码方式。

主要的编码方法有二进制编码、浮点数编码、符号编码、多参数编码、可变长染色体编码等。在遗传算法中一般用二进制编码–二值(0,1)向量表示染色体。 

这里写图片描述

具体的编码规则如下:

  • 若属性为范畴型,定义属性段的宽度等于属性取值个数。对于每个属 性段,若第一位为‘*’,表示该属性取值可以为任意;否则,各位若取 值为1,表示取该属性值,0表示不取该属性值。例如,某条件属性 Ci 对应的染色体(编码二进制串)为011001,表示该属性取第二个属性值或第三个属性值或第六个属性值。
  • 若属性为数值型,假设某一参数的取值范围是[ μmin,μmax ],用长度为 λ 的二进制编码符号串来表示该参数,则它总共能够产生  2λ 种不同的编码,参数编码时的对应关系如下: 
    这里写图片描述

    参数解码时的对应关系如下:假设某一染色体的编码是 x:bλbλ1bλ2...b2b1 ,则对应的解码公式为 
    x=μmin+μmaxμmin2λ1i=λ1bi2i1.

2.初始种群的产生 
遗传算法以初始种群作为初始点开始迭代。初始种群大小表示群体中所含个体的数量。

  • 当个体数量取值较小时,可提高遗传算法的运算速度,但搜 索空间分布范围有限,降低了群体的多样性,有可能会引起 遗传算法的早熟现象;
  • 当个体数量取值较大时,一方面计算复杂,会使遗传算法的 运行效率降低,另一方面,部分高适应值的个体可能被淘汰, 影响交叉。
  • 初始种群的一般取值范围是20~100。

产生初始种群的方法通常有两种: 对问题的解无任何先验知识的情况,采用随机产生样本的方法;对于具有某些先验知识的情况,可首先将这些先验知识 转变为必须满足的一组要求,然后在满足这些要求的解中 随机地选取样本。这样选择初始种群可使遗传算法更快地达到最优解。

3.确定适应值函数 
遗传算法的设计要素之一是如何确定适应值函数,在遗传算法中,利用适应值来衡量个体的优劣,采用适者生存的原则决定哪些个体进行繁殖,哪些个体被淘汰。适应度函数值越大,解的质量越好。

4.选择遗传操作算子 
遗传算子包括三个基本算子:选择算子(Selection Operator)、 交叉算子(Crossover Operator)、 变异算子(Mutation Operator)。

  • 选择运算:选择的目的是把优化的个体(或解)直接遗传到下一代或通过配对交叉产 生新的个体再遗传到下一代。选择操作是建立在群体中个体的适应度评估基础上的, 目前常用的选择算子有以下几种:适应度比例方法、随机遍历抽样法、局部选择法。 其中轮盘赌选择法(roulette wheel selection)是最简单也是最常用的选择方法。在该 方法中,各个个体的选择概率和其适应度值成比例。
  • 交叉运算:根据交叉率将父代中的部分个体两两随机地交换某些基因,以产生新的基 因组合,期望将有益基因组合在一起。例如,设给定的 2个染色体为:10001001110010010 和 01010001001000011。沿着它们的长度随机选择一个位置作为交叉点,比如说10, 然后互换第10位之后所有位。这样两个染色体就变成了100010011 01000011 和 010100010 10010010。

  • 变异运算:根据变异率,对群体中部分个体的某些基因位作变动。常用的有实值变异和二进制变异。变异率通常都是很低的值,比如 0.001。基本位变异示例: 变异前:000001110000000010000,变异位置为12位,则变异后:000001110001000010000。

5.停机条件 
遗传算法是一种反复迭代的搜索算法,它通过多次进化逐渐逼近最优解,因此需要确定停机条件。最常用的停机条件是规定遗传的代数,即迭代次数。当遗传算法是用来产生新的规则时,停机条件不能简单地用遗传代数确定。

一次学习过程的结束是当目前工作规则已收敛,停机条件应该定义为:子代种群的规则与其父代完全相同,并且各规则的适应值 已连续M次保持不变。也就是说,当前工作种群已不再进化了。其中,M是根据不同的应用情况事先设置的一个参数。

三、遗传算法举例

已知 x 为整数,利用遗传算法求解区间[0, 31]上的二次函数 y=x2 的最大值。 
分析: (1) 设定种群规模,编码染色体,产生初始种群。将种群规模设定为4;用5位二进制数编码染色体;取下列个体组成初始种群 S1 s1=13(01101) s2=24(11000) s3=8(01000) s4=19(10011).  
(2) 定义适应度函数, 取适应度函数 

f(x)=x2

(3) 计算各代种群中的各个体的适应度, 并对其染色体进行遗传操作,直到适应度最高的个体,即31(11111)出现为止。

  • Step1:首先计算种群 S1 中各个体: s1=13(01101) ,  s2=24(11000) ,  s3=8(01000) s4=19(10011) 的适应度 f(si) ,容易求得 f(s1)=f(13)=132=169 ,  f(s2)=f(24)=242=576 ,  f(s3)=f(8)=82=64 ,  f(s4)=f(19)=192=361.
  • Step2:计算种群 S1 中各个体的选择概率: P(xi)=f(xi)Nj=1f(xj) ,即 P(s1)=P(13)=0.14 P(s2)=P(24)=0.49 P(s3)=P(8)=0.06 P(s4)=P(19)=0.31 。再计算种群 S1 中各个体的积累概率: q(xi)=ij=1P(xj) ,即 q(s1)=P(s1)=0.14 q(s2)=0.63 q(s3)=0.69 q(s4)=1 。 
    这里写图片描述
  • Step3:选择-复制。设从区间[0, 1]中产生4个随机数: r1=0.450126 r2=0.110347 r3=0.572496 r4=0.98503 。 
    这里写图片描述

    于是,经复制得群体: s1=1100024 s2=0110113 s3=1100024 s4=1001119 .
  • Step4:设交叉率 pc=100% ,即S1中的全体染色体都参加交叉运算。设 s1 s2 配对, s3 s4 配对。分别交换后两位基因,得新染色体: s′′1=1100125 s′′2=0110012 s′′3=1101127 s′′4=1000016 .
  • Step5:变异。设变异率 pm=0.001 。这样,群体 S1 中共有5×4×0.001=0.02位基因可以变异。0.02位显然不足1位,所以本轮遗传操作不做变异。
  • Step6:于是得到第二代种群 S2 s1=1100125 s2=0110012 s3=1101127 s4=1000016 。 
    这里写图片描述

    假设这一轮选择-复制操作中,种群 S2 中的4个染色体都被选中(上图最后一列只是估计选中次数,不代表真实运行时的选择结果),则得到群体:  s1=1100125 s2=0110012 s3=1101127 s4=1000016 。做交叉运算,让 s1 s2 s3 s4 分别交换后三位基因,即 s′′1=1110028 s′′2=010019 s′′3=1100024 , s′′4=1001119 。这一轮仍然不会发生变异。
  • Step7:于是得到第三代种群 S3 s1=1110028 s2=010019 s3=1100024 s4=1001119 。 
    这里写图片描述

    假设这一轮选择-复制操作中,种群 S3 中的3个染色体都被选中,其中 s1 被选中了两次,则得到群体:  s1=1110028 , s2=1110028 s3=1100024 s4=1001119 。做交叉运算,让 s1 s4 s2 s3 分别交换后两位基因,即 s′′1=1111131 s′′2=1110028 s′′3=1100024 s′′4=1000016 。这一轮仍然不会发生变异。
  • Step8:于是得到第四代种群 S4 s1=1111131 s2=1110028 s3=1100024 s4=1000016 。显然,在这一代种群中已经出现了适应度最高的染色体 s1=11111 。于是,遗传操作终止,将染色体(11111)作为最终结果输出。然后,将染色体“11111”解码为表现型,即得所求的最优解:31。将31代入函数 y=x2 中,即得原问题的解,即函数 y=x2 的最大值为961。

这里写图片描述

四、遗传算法实战

基于R实现。因第三章中的案例较简单,在实战中将优化目标函数定义为: minf(x1,x2,x3,x4,x5)=(x17)2+(x277)2+(x3777)2+(x47777)2+(x577777)2

library(mcga)
###定义适应度函数 
 f<-function(x){
    return ((x[1]-7)^2 + (x[2]-77)^2 +(x[3]-777)^2 +(x[4]-7777)^2 +(x[5]-77777)^2)
 }
##运行遗传算法
 m <- mcga(popsize=200, 
        chsize=5, 
        minval=0.0, 
        maxval=999999999.9, 
        maxiter=2500, 
        crossprob=1.0, 
        mutateprob=0.01, 
        evalFunc=f)         
 cat("Best chromosome:\n")
#最优化的个体结果
 print(m$population[1,])
##执行时间
 cat("Cost: ",m$costs[1],"\n")

你可能感兴趣的:(算法,算法)