遗传算法(SGA)

本文详细介绍了遗传算法的起源、原理,以及其关键要素(种群、个体、染色体编码)的映射。通过对比不同的编码方法(二进制、浮点数、符号),讨论了选择算子如轮盘赌选择在算法中的应用,涵盖了交叉、变异等操作,最后概述了遗传算法的整体运行流程。
摘要由CSDN通过智能技术生成

写在前面

只有服从大自然,才能战胜大自然。

​ ——达尔文

遗传算法

本文参考资料:

伏猫侠blog-机器学习笔记-遗传算法

CSDN博主红烧肉不好吃:遗传算法原理及其matlab程序实现

CSDN博主重学CS:遗传算法详解 附python代码实现

CSDN博主Techblog of HaoWANG:遗传算法(Genetic Algorithm)

度娘:自然选择说

一、追本溯源,从自然选择讲起

我们都曾惊叹于大自然的鬼斧神工、精妙绝伦,经过数亿年漫长的进化,不同物种各得其所,在食物链中占据一隅,共同构成宏大而又稳定的生态系统。

针对生物进化机理,达尔文提出自然选择学说。他认为,在变化着的生活条件下,生物几乎都表现出个体差异,并有过度繁殖的倾向;在生存斗争过程中,具有有利变异的个体能生存下来并繁殖后代,具有不利变异的个体则逐渐被淘汰。此种汰劣留良适者生存的原理,达尔文称之为自然选择。他认为应用自然选择原理可以说明生物界的适应性、多样性和物种的起源。

既然能经受住自然考验、获得生存机会的大多是种群中的佼佼者,那我们何不借助相似的过程来获取某一问题的较优解呢?这便是进化算法的由来,而我们本期博客将要介绍的遗传算法(Genetic Algorithm,也称为SGA[Simple Genetic Algorithm]) 即是一种基于随机的经典进化算法。它受达尔文进化论的启发,通过对现有解做微小且缓慢的改变,直到得到更好的解。

二、刨根问底,向遗传算法进发

我们已经明白了遗传算法实际是对自然选择、进化论的一种模拟,那接下来我们要做的就是将后者的每一个要素和环节进行映射。

要素表示

(一)种群

种群是生物进化的基本单位,在遗传算法中,种群即是不同解的集合。初始化时我们可以随机生成一些解,使其构成我们的原始解集。

(二)个体

在遗传算法中,个体即为每个,也是我们后续进行进化的对象。

(三)染色体

染色体携带承载着个体所有的遗传信息,是每个个体的唯一标识。在生物学中,染色体由DNA和蛋白质组成,DNA上分布有决定各个性状的基因。而在遗传算法中,染色体不再是成对出现,而是进行了模糊化处理,由一串编码或数值表示。把这一表示称作是基因也未尝不可。下面我们来介绍几种表示基因的方法。

二进制编码

DNA有AGCT四种碱基对,它们的排列组合构成遗传信息各异的基因。对于计算机而言,最常见的信息存储方式就是二进制了。但与我们以往直接用二进制表示数值不同的是,此时二进制承载的更多的是映射精确度的作用。

比如我们需要表示区间1—100内的数字,直接用二进制描述则为0000001—1100100,这样只能精确到个位,如果我们想让结果精确到小数点后1位,应该怎么做呢?我们的需求从原来只需要表示0,1,2到现在还需要表示0.1,0.2,1.3,其实只要有编码与这些数字对应即可。
请添加图片描述

那我们不妨这样考虑,所要表示的数字总共为100/0.1=1000个,而210=1024>1000,我们可以用一个10位二进制编码表示这些数字。如此一来比如二进制编码0000100110对应的数字即为:
2 1 + 2 2 + 2 5 1024 ∗ 99 + 1 = 4.7 \frac{2^1+2^2+2^5}{1024}*99+1=4.7 102421+22+2599+1=4.7

由上例我们可以总结出二进制的编码规律:

  1. 首先计算需表示的数字个数,即:
    范围 精度 \frac{范围}{精度} 精度范围

  2. 求解需要的编码位数,即解不等式:
    位数 = ⌈ l o g 2 数字个数 ⌉ 位数=\lceil log_2数字个数 \rceil 位数=log2数字个数

  3. 某一个数a的编码即为:
    a − 范围下界 范围 ∗ 2 位数 \frac{a-范围下界}{范围}*2^{位数} 范围a范围下界2位数

解码规律则为:
二进制编码的十进制表示 2 位数 ∗ 范围 + 范围下界 \frac{二进制编码的十进制表示}{2^{位数}}*范围+范围下界 2位数二进制编码的十进制表示范围+范围下界

浮点数编码

这种编码方式比较好理解,即以一定范围内的数字进行表示即可,比如1.2,10990.5等。

符号编码

这种方法是指个体染色体编码串中的基因值取自一个无数值含义、而只有代码含义的符号,如{A,B,C…}。

由上文可以看到染色体的编码方法很多,一个好的表示方法能缩小整个搜索空间,减少搜索时间,从而提高算法的效率。我们在此给出上述三种方法的优缺点:

编码方式优点缺点
二进制编码便于交叉、变异等操作1)对于一些连续函数的优化问题,其随机性使得其局部搜索能力较差,对于一些高精度的问题,当解迫近于最优解后,由于其变异后数值变化很大,不连续,所以会远离最优解,达不到稳定;
2)编码长度较短时,达不到精度要求,而编码长度较长时,虽然能提高精度,但增加了解码的时间复杂度,使算法的搜索空间急剧扩大。
浮点数编码1) 适用于在遗传算法中表示范围较大的数;
2) 适用于精度要求较高的遗传算法;
3) 便于较大空间的遗传搜索;
4) 改善了遗传算法的计算复杂性,提高了运算交率。
不利于变异、交叉等操作。
符号编码1) 符合有意义积术块编码原则;
2)便于在遗传算法中利用所求解问题的专门知识。
1)表示较为复杂;
2)适应度计算较为复杂,需要进行数值映射。

环节表示

初始化种群

利用随机过程生成每一个个体后,选定一定数量个体作为种群。

选择

在自然界中,生物面对着食物、天敌、气候等多重因素的挑战,大多数情况下只有身强体壮、适应环境的个体可以生存,获得将自己的优良基因保留并遗传的机会。那为了模拟这一过程,我们需要引入一个适应度函数(Fitness Function) 以对我们的解决方法进行评价。

在初始化种群后,我们需要计算每一个体的适应度。理论上来说适应度越高,越容易存活,但如果只是武断地选取适应度最高的解法进行迭代,很容易陷入局部最优,往往需要注入一些 “新鲜血液” ,来取得突破。举一个不太恰当的例子,比如我们国家禁止近亲结婚(虽然这一政策的初衷是为了防止隐性遗传因子的累积但也在一定程度上体现了外界因子的重要性)。而且实际生活中也存在着一系列的变数,我们永远不知道明天和意外哪一个会先到来,适应度高并不意味着所向披靡,先天因素不足但逆袭成功的实例也不在少数,所以我们需要引入一个选择算子用于判断某一个体是否可以进行交配。

常见的选择算子有:

  1. 轮盘赌选择(Roulette Wheel Selection): 每个个体进入下一代的概率等于它的适应度值与整个种群个体适应度值和的比例。选择误差较大。

  2. 随机竞争选择(Stochastic Tournament): 每次按轮盘赌选择一对个体,然后让这两个个体进行竞争,适应度高的被选中,如此反复,直到选满为止。

  3. 最佳保留选择: 首先按轮盘赌选择方法执行遗传算法的选择操作,然后将当前群体中适应度最高的个体结构完整地复制到下一代群体中。

  4. 无回放随机选择(也叫期望值选择Expected Value Selection): 根据每个个体在下一代群体中的生存期望来进行随机选择。具体操作过程如下:

    (1) 计算群体中每个个体在下一代群体中的生存期望值N;

    (2) 若某一个体被选中参与交叉运算,则它在下一代中的生存期望值减去 0.5,若某一个体未被选中参与交叉运算,则它在下一代中的生存期望值减去1.0;

    (3) 随着选择过程的进行,若某一个体的生存期望值小于0时,则该个体就不再有机会被选中。

  5. 确定式选择: 按照一种确定的方式来进行选择操作。具体操作过程如下:

    (1) 计算群体中每个个体在下一代群体中的生存期望值N。

    (2) 用N的整数部分确定各个对应个体在下一代群体中的生存数目。

    (3) 用N的小数部分对个体进行降序排列,顺序取前M个个体加入到下一代群体中。至此可完全确定出下一代群体中M个个体。

  6. 无回放余数随机选择: 可确保适应度比平均适应度大的一些个体能够被遗传到下一代群体中,因而选择误差比较小。

  7. 均匀排序: 对群体中的所有个体按适应度大小进行排序,基于这个排序来分配各个个体被选中的概率。

  8. 最佳保存策略: 当前群体中适应度最高的个体不参与交叉运算和变异运算,而是用它来代替掉本代群体中经过交叉、变异等操作后所产生的适应度最低的个体。

  9. 随机选择: 每次选取个体中适应度最高的一个个体遗传到下一代群体中。

  10. 排挤选择: 新生成的子代将代替或排挤相似的旧父代个体,提高群体的多样性。

上述算子中,使用较多的是轮盘赌选择,且有很大一部分算子是建立在它的基础上的,下面我们就具体解释一下它的原理。

假设我们现在有一个种群,共有5个个体,每个个体的适应度分别为4,6,2,3,9。那么根据定义,每个个体进入下一代的概率依次为:
4 4 + 6 + 2 + 3 + 9 ∗ 100 % = 16.7 % 6 4 + 6 + 2 + 3 + 9 ∗ 100 % = 25.0 % 2 4 + 6 + 2 + 3 + 9 ∗ 100 % = 8.3 % 3 4 + 6 + 2 + 3 + 9 ∗ 100 % = 12.5 % 9 4 + 6 + 2 + 3 + 9 ∗ 100 % = 37.5 % \frac{4}{4+6+2+3+9}*100\%=16.7\%\\ \frac{6}{4+6+2+3+9}*100\%=25.0\%\\ \frac{2}{4+6+2+3+9}*100\%=8.3\%\\ \frac{3}{4+6+2+3+9}*100\%=12.5\%\\ \frac{9}{4+6+2+3+9}*100\%=37.5\%\\ 4+6+2+3+94100%=16.7%4+6+2+3+96100%=25.0%4+6+2+3+92100%=8.3%4+6+2+3+93100%=12.5%4+6+2+3+99100%=37.5%
如果作出概率分布饼图,则为:

请添加图片描述

看到这个图我们很容易联想到商超抽奖活动的转盘,实际上轮盘赌的命名方式正是出于此,它能较好地反映一个个体被选择的概率。

通过这种方式我们可选出一定数量的父辈进入交配池(Mating Pool),继续后续操作。

交叉

在生物学中,我们都知道四分体时期,在联会的过程中会发生染色体的交叉互换,这一现象发生于一个细胞的一对染色体之间,但正如我们在介绍染色体映射时所说,遗传算法中的染色体并未完全按照生物规律定义,此处的交叉发生于两个父辈染色体之间,我们需要随机选择交叉位点,完全交换对应片段。这种交叉又分为单点交换多点交换

如果我们用二进制方式进行编码,这一过程是很好理解的,图解如下:

请添加图片描述

变异

变异本身是一个概率事件,所以在每次操作过程中是否进行变异,我们需要进行判断。我们可以设定一个变异阈值,推荐的做法是这一阈值随着迭代次数的增加而变化,因为在我们的优化过程中,种群会朝着我们的目标不断演化,突变的优化空间理当越来越小。具体的变化规律可能要结合问题本身进行分析。

变异的具体操作在二进制编码中体现为选择一些点位进行0和1的变化。也分为一些类型:

  1. 基本位变异(Simple Mutation):对个体编码串借助变异概率,随机指定某一位或某几位上的值变异。
  2. 均匀变异(Uniform Mutation):分别用符合某一范围内均匀分布的随机数,以某一较小的概率来替换个体编码串中各个基因位置上的原有基因值。(特别适用于在算法的初级运行阶段)
  3. 边界变异(Boundary Mutation):随机地取基因位置上的两个对应边界基因值之一去替代原有基因值。(特别适用于最优点位于或接近于可行解的边界时的一类问题)
  4. 非均匀变异对原有的基因值做一随机扰动,以扰动后的结果作为变异后的新基因值。对每个基因位置都以相同的概率进行变异之后,相当于整个解向量在解空间中作了一次轻微的变动。
  5. 高斯近似变异:进行变异操作时用符号均值为P的平均值,方差为P2的正态分布的一个随机数来替换原有的基因值。

至此,遗传算法的所有要素和环节映射就介绍完毕了,接下来我们来复盘一下整个算法的运行流程:

请添加图片描述

小结

在这篇博客中,笔者主要介绍了遗传算法的有关知识,包括其原理、要素和环节映射、运行流程等,希望可以给各位提供力所能及的帮助。但遗传算法本身还有许多实现细节,由于笔者本身的知识水平限制,未尽其详之处还望多多谅解,也欢迎各位在评论区交流讨论,笔者看到后一定会及时更新相关问题的解答。再次感谢各位看到这里,如果觉得这篇文章尚有学习借鉴意义,不妨动动小手给笔者一个赞和关注,大家的支持就是笔者的最大动力!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值