遗传算法简介
一、遗传算法(GA)
相关流程:种群、适应度、选择函数、优胜劣汰、交叉算子、变异、逐代进化
1.1基因的编码方法
分为三大类:二进制编码法、浮点编码法、符号编码法。
1)二进制编码法
1001101,每位数为基因,简单易懂易操作。
2)符号编码法
{A,B,C…}更接近现代生物,ABC代表不同的性质。
3)浮点编码法
1.2-3.2-5.3-7.2-1.4-9.7
每个浮点数为一个基因,精度高,范围大。
1.2 基因到表现型的映射
基因到表现型的映射,即所谓的编码的方式。以二进制编码为例,我们将二进制数转化为十进制数一般是不可以直接用于表示个体的表现形式。例如基因序列为1000000001,转化为10进制为513. 如此转化后可能是一个巨大的数字,可能不适用于表示我们想要的表现型,而且该数为整数(不过我们可以约定后N位基因表示小数部分)。所以我们需要对基因序列进行编码,转换到适合的表现型。编码的方式同样也有很多种,可能随问题的变化而变化。最基本的可以用一下编码方式。
为转化后的十进制数,是表现型的最大值,a为常数,可以稍作调整。
1.3选择函数
1)轮盘赌选择
适应度越高,被选中的概率越高。
实现:设置一个(0,1)区间,每个个体占其中的,然后在(0,1)区间上撒一批豆子(生成一批随机数),豆子多的小区间就会被选择。显然,适应度fitness越大,小区间就越大,接到的豆子就越多,但是误差会随着个体数变小而变大。
2)随机竞争选择
每次按轮盘赌选择一对个体,然后让这两个个体进行竞争,适应度高的被选中,如此反复,直到选满为止。
3)最佳保留选择
首先按轮盘赌选择方法执行遗传算法的选择操作,然后将当前群体中适应度最高的个体结构完整地复制到下一代群体中。
4)无回放随机选择
根据每个个体在下一代群体中的生存期望来进行随机选择运算。
1.4 染色体交叉
1)单点交叉
指在个体编码串中只随机设置一个交叉点,然后再该点相互交换两个配对个体的部分染色体。二进制编码的话,就随机选一位数,两个基因就在这个随机数的位置进行交叉,100011和110111,在3的地方交叉,交叉后为100111和110011.
2)两点交叉与多点交叉
两点交叉:在个体编码串中随机设置了两个交叉点,然后再进行部分基因交换。
多点交叉。
3)均匀交叉
两个配对个体的每个基因座上的基因都以相同的交叉概率进行交换,从而形成两个新个体。
4)算术交叉
由两个个体的线性组合而产生出两个新的个体。该操作对象一般是由浮点数编码表示的个体。
1.5基因突变
1)基本位变异
对个体编码串中以变异概率、随机指定的某一位或某几位仅因座上的值做变异运算。二进制编码为例,100011,随机选择变异位置,第三位,则变异为101011.变异之前还要有个变异概率pm,控制变异的量。
2)均匀变异
分别用符合某一范围内均匀分布的随机数,以某一较小的概率来替换个体编码串中各个基因座上的原有基因值。
3)边界变异
随机的取基因座上的两个对应边界基因值之一去替代原有基因值。特别适用于最优点位于或接近于可行解的边界时的一类问题。
4)非均匀变异
对原有的基因值做一随机扰动,以扰动后的结果作为变异后的新基因值。对每个基因座都以相同的概率进行变异运算之后,相当于整个解向量在解空间中作了一次轻微的变动。
5)高斯近似变异
进行变异操作时用符号均值为P的平均值,方差为P**2的正态分布的一个随机数来替换原有的基因值。
二、非支配排序遗传算法(NSGA)
2.1 与GA区别
2.1.1选择机制
如何选择优质个体很关键。所以NSGA采用Pareto支配关系,来对个体进行分组(分层),采用共享小生境技术计算 共享适应度 后进行排序。选取方式与GA不同。
2.2新增关键技术
2.2.1非支配排序
例如,目标向量[f1(x1),f2(x1),f3(x1)]=[3,4,5]和[f1(x2),f2(x2),f3(x2)]=[1,2,5],则x2弱支配x1,弱支配允许有等于,但不能全是等于,如果其余的所有个体都弱支配支配x1,则x1称为非支配个体,即'没有人能够打赢他',这种个体就是优秀个体,在分层时被分到第一层。然后在总个体中去掉掉这一层的个体(去掉后就会有新的非支配个体),继续找下一批非支配个体。
查找完一层后时间复杂度为,在刚开始时一般会有N层,所以总复杂度为,该处为个人理解。
2.2.2共享小生境技术
该技术涉及非支配层、欧氏距离、虚拟适应度值、共享函数、共享适应度。对每个支配层计算共享适应度,共享适应度越高,就越容易被选中,则可知层数越低(第一层为优秀种子),虚拟适应度越高(同一层的虚拟适应度相同)。适应度越高的个体会被复制多次,适应度越高,复制次数越多。
2.3 算法流程
解释"根据虚拟适应度进行复制"这一步,算例:共享适应度为[[5,4,3],[2,2,1,1]]两个子列表表示两层。合并为y=[6,4,3,2,2,1,1],,则y=[2.2, 1.5, 1.1, 0.7, 0.7, 0.4, 0.4],然后对y取整,y=[2,1,1,0,0,0,0]。则第一个个体复制两次,对第二个个体复制1次,对第三个个体复制1次,其余暂时不作处理。然后发现总个数只有2+1+1=4个,小于原来的7个个体,还 至少 需要3个个体。接下来是从刚刚取整掉的小数部分入手去选取,此处不再赘述。
综上,NSGA和GA不同之处主要为选取个体的部分,。
三、非支配排序遗传算法2(NSGA-II)
3.1 与NSGA区别
3.1.1 进化数量
在传统NSGA中,个体数量不固定,在群体中进行相互交叉,原个体变成新个体。变异后产生子代,父代就消失了。
在NSGA中,父代保留下来,和子代一起进行筛选。例如,
1、父代有20个个体,每个个体产生一个新个体,即子代也有20个,加起来40个。
2、对40个进行筛选,留下20个,重复步骤1.
3.1.2 算法优化
在NSGA中非支配排序的时间复杂度为,在NSGA-ii非支配排序的时间复杂度为。
3.1.3 扩大采样空间
在NSGA中,采用共享小生境技术,计算出共享适应度后,对当个个体的侧重度非常高,以至于新生代的多样性不够好,在NSGA-II解决了这个问题。
3.2 新增关键技术
3.2.1 快速非支配排序
在NSGA中,非支配排序使用了两个for循环求出一层非支配层,在NSGA-II中两个for循环就将所有非支配层求出来了。实现方法:
在两个for循环中,将每个个体"打败"(被支配)过的对手记录下来,同时也记录下被"打败"(支配)的次数。跳出循环后,就可以针对以上两个信息,推导出每一层的成员。(按被打败次数分层)
3.2.2 拥挤度和拥挤度比较算子
拥挤度即拥挤距离,如下图所示,个体的拥挤度为长方形的长加宽。
拥挤度比较算子,为一个运算规则,个体i优于j,当且仅当i的非支配层小于等于j的非支配层且i的拥挤距离大于j的拥挤距离。由此规则来对每个非支配层进行排序,替代了NSGA的共享适应度排序。
使用该排序后,继3.1.1的例子,父子两代共40个,我们要从中选取出原种群数即20个,需要从低非支配层到高非支配群选取,当把整层(下图的Z3)加到已有种群中,超过了20个,该算法就对那一层进行拥挤度算子排序,从中选取,直到够20个个体为止。