遗传算法(SGA)

2024-03-08 00:30
文章标签 遗传算法 sga

本文主要是介绍遗传算法(SGA),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写在前面

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

​ ——达尔文

遗传算法

本文参考资料:

伏猫侠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的正态分布的一个随机数来替换原有的基因值。

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

请添加图片描述

小结

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

这篇关于遗传算法(SGA)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/785344

相关文章

遗传算法Github初学

遗传算法的理论是根据达尔文进化论而设计出来的算法:人类是朝着好的方向(最优解)进化,进化过程中,会自动选择优良基因,淘汰劣等基因 遗传算法(genetic algorithm——GA)是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择、杂交等。 搜索算法的共同特征为: 首先组成一组候选解依据某些适应

零基础学启发式算法(5)-遗传算法 (Genetic Algorithm)

一、遗传算法 (Genetic Algorithm, GA)  源于达尔文的进化论,将问题的一个解当作种群中的一个个体。 gene:基因 chromosome: 染色体 population:种群 crossover:交叉 mutation:变异 selection:选择 通过多轮的“选择,交叉和变异”,选择适应度最好的个体作为问题的最优解。 选择:优胜劣汰,适者生存。

SGA和PGA浅析

--SGA和PGA浅析 --SGA SYS@PROD1> select pool,sum(bytes) from v$sgastat group by pool;POOL SUM(BYTES)------------ ----------384225152java pool 4194304streams pool 8388608shared pool 33

MATLAB智能优化算法-学习笔记(1)——遗传算法求解0-1背包问题【过程+代码】

一、问题描述 (1)数学模型 (2)模型总结 目标函数:最大化背包中的总价值 Z。约束条件:确保背包中的物品总重量不超过容量 W。决策变量:每个物品是否放入背包,用0或1表示。 这个数学模型是一个典型的0-1整数线性规划问题。由于其NP完全性,当问题规模较大时,求解此问题通常需要使用启发式算法(如遗传算法、动态规划、分支定界法等)来找到近似最优解。 (3)实例讲解:0-1 背包问题

遗传算法与深度学习实战(8)——使用遗传算法解决旅行商问题

遗传算法与深度学习实战(8)——使用遗传算法解决旅行商问题 0. 前言1. 旅行商问题2. NP 问题3. 构建 TSP 求解器小结系列链接 0. 前言 旅行商问题 (Traveling Salesman Problem, TSP) 是一个经典的优化问题,其目标是找到一条最短的路径,使得旅行商可以访问一系列给定的城市并且每个城市只访问一次,最终回到出发地点。在本节中,我们将学习

MATLAB遗传算法求解考虑碳排放的逆向物流快递产品回收处理中心选址问题实例代码

MATLAB遗传算法求解考虑碳排放的逆向物流快递产品回收处理中心选址问题实例代码 MATLAB遗传算法求解考虑碳排放的逆向物流快递产品回收处理中心选址问题实例代码

根据系统类型、DB版本和OS内存自动计算Oralce建议的memory_target、SGA和PGA大小

每当新建一个Oracle数据库的时候,memory_target、SGA和PGA大小如何设置是所有DBA首先要考虑的问题,对于新手来说,总是会被这几个参数的设置搞得摸不着头脑!!! 这里分享一个根据系统类型、DB版本和OS内存可以自动计算Oralce建议的memory_target、SGA和PGA大小的excel,虽然很LOW,但可以让大家有个参考依据。 下载链接:https://down

遗传算法(GA)的C语言实现

问题: 在下面的程序中将要运用遗传算法对一个多项式求最小值 要求在(-8,8)间寻找使表达式达到最小的x,误差为0.001 问题分析: 编码:采用常规码,即二进制码编码。构造简单,交叉、变异的实现非常容易,同时解的表达也很简洁、直观。可以每0.001取一个点,这样理论误差讲小于0.0005,可以满足题目中的误差要求。此事总的求解空间为: N = (8 - (-8)) * 10

用Python解决优化问题_多目标规划遗传算法模板

NSGA2,即非支配排序遗传算法II(Nondominated Sorting Genetic Algorithm II),是一种用于解决多目标优化问题的遗传算法。NSGA-II算法基于Pareto最优概念,通过快速非支配排序和精英策略,有效地维护种群多样性并提高优化精度 。 NSGA-II算法的流程主要包括: 1. 初始种群的生成。 2. 对种群进行非支配排序和拥挤度计算。 3. 根据非支配等

Genetic Algorithm遗传算法整理

文章目录 一、简介二、算法流程三、参数四、代码五、参考资料 一、简介 遗传算法(Genetic Algorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。 遗传算法以一种群体中的所有个体为对象,并利用随机化技术指导对一个被编码的参数空间进行高效搜索。其中,选择、交叉和变异构成了遗传算法的遗传