pg下载 用最简单的例子让零基础的你轻松理解遗传算法

频道:生活应用 日期: 浏览:34

遗传算法

概     述

遗传算法,也就是Genetic Algorithm,GA,最早是被美国的John holland在20世纪70年代提出来的,这个算法是依照大自然中生物体进化规律设计并提出来的,它是模拟达尔文生物进化论的自然选择以及遗传学机理的生物进化过程的计算模型,它是一种借助模拟自然进化过程来搜索最优解的方法,该算法借助数学的方式,运用计算机仿真运算,把问题的求解过程转变为类似生物进化中的染色体基因的交叉、变异等过程。在对较为复杂的组合优化问题进行求解的情形下,相较于一些常规的优化算法而言,一般能够较为迅速地获取到比较好的优化结果。遗传算法现已被人们广泛地运用在了组合优化、机器学习、信号处理、自适应控制以及人工生命等诸多领域。

01

大致了解

种属于启发式算法的遗传算法,大家在理解启发式算法之际能够把它跟枚举法作类比,举个简易的例子,我们于求解某一函数f(x)的最大值之时,一般的办法是借助求导,找出极值点,然而大家肯定也晓得另外一种最为笨拙的办法,那便是枚举法。倘若x的可行范围处于[0,1]这个区间之内,x最大值的精确程度是0.01,那么能够将[0,1]这个区间里所有的可行解(0.01, 0.02, 0.03,... 0.98, 0.99, 1.00)都提取出来代入f(x),通过计算并比较它们的大小,找出最大值所对应的x',此x'即为最优解,而f(x')就是最大值。[id_12[id_1191582033]872389]

总而言之,要想更易于理解遗传算法,大家首先能够有一个大概的思维,遗传算法乃是枚举法的提升版本 。

02

简单算例

面临的疑惑是:要去找出这么一个函数,它是f(x) ,这个函数的表达式为x + 10*sin(5*x) + 7*cos(4*x) ,然后要在一个特定的区间,也就是[0,9] ,去求解这个函数所能达到的最大值 。

p.s.  f(x) 函数大致图像如上图

按照这样的流程:有一种算法,它被称作遗传算法,也就是Genetic Algorithm,此算法遵循被称为也就是所谓的适者生存、优胜劣汰这样的原则,它属于是一类借鉴生物界自然选择以及自然遗传机制的具有随机性并且进行搜索的算法 。遗传算法对人工种群的进化过程予以模拟,借助选择、交叉以及变异等机制,每次迭代之时都留存一组候选个体,重复这般过程,等种群历经若干代进化后,在理想情形下其适应度会达成大致最优的状态。

p.s.  遗传算法流程图如上图

组成:

编码 -> 创造染色体

个体 -> 种群

适应度函数

遗传算子

• 选择

• 交叉

• 变异

运行参数

• 是否选择精英操作

• 种群大小

• 染色体长度

• 最大迭代次数

• 交叉概率

• 变异概率

编码与解码:

实现遗传算法的第一步就是明确对求解问题的编码和解码方式。

对于函数优化问题,一般有两种编码方式,各具优缺点。

其中一种为实数编码,它是指直接运用实数的方式来表示基因,该方式具备容易被理解的特性,并且不需要借助解码过程,然而它存在容易过早收敛的情况,进而导致陷入局部最优的结果,。

二进制编码,其稳定性是比较高的,种群多样性方面也是比较大的,然而它所需的存储空间是比较大的,它是需要进行解码的,并且是难以被理解的。

对于求解函数最大值问题,我一般选择二进制编码:

举个例子哈,目标函数是f(x) ,它等于x ,再加上10sin(5x) ,还要加上7cos(4x) ,这里的x是属于[0,9]这个范围的 。

假如把求解时所设定的精度确定为小数点后面4位,那么能够将x的解空间划分成pg下载渠道,(9减去0)乘以(1乘以10的正4次方),其结果等于90000个等分 。

对于满足2^16小于90000且90000小于2^17的情况,其解需要用17位二进制数进行表示,进一步说的话,即是一个解的编码是一个17位类型为二进制的串 。

一开始,这些二进制串是随机生成的。

代表一条染色体串的是一个这样的二进制串,这条染色体串在此处长度为17 。

像这样的任何一条染色体chromosome,要把它复原,也就是解码,使其处于[0,9]这个区间内的数值,该怎么做呢?

对于本问题,我们可以采用以下公式来解码:

x等于0加上,将二进制数转化为十进制数后的chromosome,乘以9减去0的差,再除以2的17次方减去1的商,。

一般化解码公式:

函数f(x),其中x属于下限到上限这个范围,对于x而言,它等于下限加上将染色体转换成十进制数后与上限减去下限的乘积再除以2的染色体大小次方减1的结果,函数f(x),其x同样还是属于下限到上限这个范围,而下限表示的是函数定义域的下限 。 再次强调,函数f(x),在x属于下限起至上限止这么个范围里,x等于下限加上借助染色体转换为十进制数后与上限减去下限的乘积再除以2的染色体大小次幂减1的得数,函数f(x),x依旧是处于下限到上限这个范围,并且下限是函数定义域的下限 。 还有函数f(x),当x处于下限直至上限的范围时,x等于下限加上把染色体转化成十进制数后与上限减去下限的乘积再除以2的染色体大小次方减1的数值,又有函数f(x),其x仍然位于下限到上限这个范围,而这里所说的下限是函数定义域的下限 。

upper_bound: 函数定义域的上限

chromosome_size: 染色体的长度

依靠上述公式,我们能够顺利地把二进制染色体串,解码成为处于[0,9]区间里的十进制实数解 。

个体与种群:

『染色体』表达了某种特征,这种特征的载体,称为『个体』。

本次实验要解决一元函数最大值求解问题,个体能够用前一节所构造的染色体来表示,而且一个个体内部存在一条染色体。

一个种群是由许多这样的个体所构成的,它所代表的含义是,这是一个一维点集,该点集处于x轴上,呈现为那条[0,9]的线段。

适应度函数:

在遗传算法里,存在着这样一种情况,即要对一个个体也就是解的好坏程度,借助适应度函数值予以评价,而在当下所面临的这个问题当中,f(x)它就是那个适应度函数。

适应度函数值越大,解的质量越高。

遗传算法,有着进化的驱动力,那便是适应度函数,它还是自然选择的唯一标准,适应度函数的设计,要结合求解问题本身需求来确定。

遗传算子:

咱们期望存在这样的一个种群,这个种群之内所涵盖的个体,这些个体所对应的函数值全都极为逼近于f(x)在[0,9]这一区间之上的最大值,然而呢,这个种群从起始的时候或许并非那般出色,这是由于个体的染色体串是通过随机方式生成的。

如何让种群变得优秀呢?

不断地进化

于每一回进化历程当中,皆尽可能去留存种群之内的优秀个体,将那些并不理想的个体予以淘汰,而且于诸多优秀个体彼此之间展开染色体交叉,存在一些个体它还有可能会出现变异。。

每一次种群的进化,都会产生一个最优个体,种群所有世代的最优个体,有可能就是处于函数f(x)最大值所对应的定义域里的点,。

倘若种群不间断地持续进化,那么总归能够寻觅到最优的答案。然而事实上,我们所拥有的时间是有限的,一般而言,当获取到一个看起来还算挺好的答案之际,就停止了进化。

对于给定的种群,如何赋予它进化的能力呢?

首先是选择(selection)

在选择操作里,从前代种群之内,挑选出多对相对而言较为优良的个体,其中,一对较为优良的个体被称作是一对父母,促使父母们把它们自身饱含的基因传递至下一代,一直持续到下一代个体的数量达到种群数量所设定的上限 。

在选择操作前,将种群中个体按照适应度从小到大进行排列

运用轮盘赌选择方式(当然存在着诸多其他选择方式,例如锦标赛法),各个个体被选中的几率与其适应其适应度函数值的大小呈现出正比关系 。

轮盘赌选择办法存有随机性,于选择之际很有可能会遗失较好的个体,因而能够运用精英机制,把前代最优个体径直选择 。

其次是交叉(crossover)

有两个不同的染色体,这两个染色体分别来自父母,它们处于待交叉的状态,依据交叉概率(cross_rate),会按照某种方式,去交换自身的部分基因 。

采用单点交叉法,也可以使用其他交叉方法

最后是变异(mutation)

染色体依据变异概率,也就是mutate_rate,来进行遗传物质排列顺序的改变,从而实现染色体的变异 。

采用单点变异法,也可以使用其他变异方法

一般来讲,交叉概率,也就是cross_rate比较大,而变异概率pg下载麻将胡了,即mutate_rate极低。诸如求解函数最大值这类问题,我所设置的交叉概率,也就是cross_rate为0.6,变异概率,即mutate_rate是0.01。

基于遗传算法的理念可知,它认为两条具备优秀特质的父母染色体进行交叉操作,相较于单纯变异而言,更大程度存在诞生高素质后代的可能性,即便变异也有产生相当出色后代的可能,只是这种可能性微乎其微,不过也并非完全没有,这一观念与自然界生物进化的特性相契合。

03

算例代码

以上所讲的算例,是我于学习遗传算法那个时候的算例pg下载,相对而言比较易于理解,要是还有存在不懂的情况,能够采取后台联系我们的方式,在此处附上算例对应的代码(matlab版本):

存在这样一个链接,其具体为https://pan.baidu.com/s/1rvhtA4kaxQuJTmndiVS71Q ,同时还存在与之对应的提取码,此提取码是bfrr 。

网友留言(0)

评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。