【遗传算法】基于实数编码(离散杂交+自适应变异),线性排名选择的遗传算法

文章转自:https://www.cnblogs.com/liyuwang/p/6012712.html

原文有代码,此处不再给出。

我们来看一个很简单的小问题f=x1+x2+x3+x4,x1、x2、x3、x4是大于等于10小于等于100的实数,求f的最大值。

这个小学生就能解决的问题我今天打算用遗传算法来解决,你可能说这不是智障吗?但是其实这只是一个小例子,因为用同样的方法,你可以解决f=x1^x2*x3^x4/x2^x1*x4^x3甚至是更复杂的问题,下面就来详细讲一讲。

基于对遗传算法的一般性了解,我就不再赘述详细过程(其实是因为上一篇写过了懒得再写一遍),只谈谈实数编码和线性排名选择策略。

实数编码顾名思义就是用实数进行编码,实数来做染色体的基因,实数构成染色体,他的本质其实是用问题的一个解空间来做一个染色体,比如{20.5658.15.2385,89.0000,56.4400},就是上面小问题的一个解空间,就可以把它作为一个染色体用于进化,其中的每一个x1,x2都是一个基因,那些交叉,变异都是基于这样的设定的。

在这里插一句,实数编码和整数编码的思想是极为类似的,但是实数编码的解空间更大更复杂。

现在来讲讲实数编码的交叉和变异

1、交叉

实数编码的杂交方式有离散杂交,算数杂交等等,本例只讲解离散杂交。

离散杂交和二进制的杂交是十分类似的,(可以)选定一个基因位,然后将选定的两个染色体在这个位置之后的基因进行交换(注意基因的定义区间是不变的)。

注意,在实数编码中,交叉的作用不是很大。

2、变异

实数编码的变异包括均匀性变异、正态性变异、非一致性变异、自适应变异、多级变异等,本例只讲解自适应变异和非一致性变异。

(1)非一致性变异

在传统的遗传算法中,突变的情况是与代数无关的。但是进化刚开始时,就是需要向各个方向大步发展进行尝试,进化到了后期,解已经相对较优了,进行局部搜索可能更有利于找到更好的解。显然传统的方法是不行的,必须找到一种将变异幅度和代数相联系的策略。

所以给出如下方法:s={v1,v2,v3,v4……},vk被选中进行变异,它的定义区间为{ak,bk},

vk1=vk+h(t,bk-vk);  vk2=vk-h(t,vk-ak);

(t为代数,h(t,y)=y*(1-r^(1-t/T)^p),r是0~1的随机数,T为最大代数,p式一个参数,一般取值为2~5)

新的vk随机在vk1和vk2中进行选取,这样就实现了之前提出要求。

(2)自适应性变异

非一致性变异加强了局部搜索能力,但是与解的好坏无关,但是我们可能希望的是好的解搜索范围较小,坏的解搜索范围较大这样,所以在非一致性变异上进行一些修正。

我们只需要将h(t,y)中的t换为T,T是一个与解的质量有关的数,

T=1-f(s)/fmax

f(s)是某个体的适应值,fmax是所解问题的最优结果,当然fmax不太好确定,所以找一个近似替代就可以了,比如当代最优解或是历史最优解。

3、线性排名选择策略

基于适应值比例的算法(轮盘赌、繁殖池)比较容易陷入过早收敛和停滞现象,排名选择策略可以避免这个问题。

我们只介绍线性排名选择策略。

顾名思义,排名策略嘛,就是要所有的解按照适应值进行排排坐,各自都有一个排名,然后我们按照大家的排名制定一个被选中的概率(然后根据这个概率进行轮盘赌),这就避免了某些个体很多就可以在轮盘赌中获得很大优势,变成了强的更有机会,但是弱者的生存机会也没被剥夺。

被选中的概率为pi=(a-b/(n+1))/n,n为排名,a,b有个一般取值,1≤a≤2,一般取1.1,b=2a-2.


  • 7
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值