遗传算法(GA)

遗传算法

遗传算法是模拟自然界优胜劣汰法则而出现的一种进化算法,也是一种邻域搜索算法,其核心的思想就是通过不断的在解空间进化,然后通过选择算子选择出适应度高的子代,然后对适应度高的子代进行遗传操作,通过迭代一定的次数或者当个体达到要求的适应度值时即可停止算法。

算法组成

遗传算法主要由编码、计算适应度值、选择、遗传运算等步骤组成

总体过程

首先给出遗传算法的伪代码,然后再详细讲解每一个步骤
遗传算法伪代码

编码

编码是遗传算法中最基础也是最重要的一步,因为编码会决定搜索空间的大小,编码设计的合理,可以有效的减少计算量。对于不同的问题,往往有不同的编码方式,二进制编码是较为常用的一种编码方式,二进制编码的搜索能力比较强,但是其缺点是存在汉明悬崖;在设计编码方式的时候,需要根据实际情况进行编码,编码要能够完善的表达所需要的信息,同时考虑到在设计遗传运算时是否会出现非法解以及非法解的修复,同时还要考虑到解码的方式等,总之,没有普适的编码方式,如何实现编码,是一个需要经验积累的过程。
除了二进制编码,十进制编码、格雷编码、浮点数编码等也是常用的编码方式。

计算适应度

适应度往往是可以与目标函数关联起来的,如果目标是最大化问题,可以用目标函数作为适应度函数;如果目标是最小化问题,只需要加一个“-”即可实现最小化到最大化的转化。
计算适应度是为了计算出每一个个体存活下来的概率,就像自然界中适应度高的个体总是可以更好的活下去是一样的。

选择

选择是遗传算法中真正实现优胜劣汰的过程。在这一步,适应度高的个体往往会有更大的概率被挑选出来参与到下一代的繁殖中,这与自然界的规则是一样的。
常用的选择的方法是轮盘赌,这种方式是比较成熟应用也非常广泛的一种选择方式。主要是通过适应度得到每一个个体的存活概率,具体步骤如下:
轮盘赌实现选择
之前看到由同学问,为什么要计算累计概率,个人认为,算累积概率实际上就是为了在产生随机数的时候做选择。

遗传运算

遗传运算包括交叉和变异,这是产生新子代的途径。交叉一般都会设置一个比较大的概率,用于产生更多的子代,是主要的解搜索方式;而变异的概率则设置的很小,主要是为了避免解陷入局部最优,是一种局部搜索策略。

交叉:

交叉包括单点交叉和多点交叉。单点交叉是指从交叉点开始,交换两条染色体之后的片段;多点交叉中最常用的就是两点交叉,也就是两点之间的染色体片段进行交叉。
如果有两条染色体如下:
原始染色体

单点交叉:

单点交叉
交叉结果:
交叉结果

两点交叉:

两点交叉
交叉结果在此就不再赘述,是一种比较简单操作了。

变异

变异是借鉴自然界的变异而来,变异的概率一般设置在0.05左右,都比较小,防止陷入局部最优即可,如果变异的概率设置的过大,那么算法就会退化成为随机搜索的算法,没有任何意义。

非法解的处理

在遗传运算中,最容易出现的问题就是非法解。非法解的处理方式有三种,第一种是直接删除,第二种是修复,第三种是加惩罚因子

第一种直接删除操作,如果初始种群比较大,可以删除,但是如果初始种群就比较小,删除之后种群就会更小,而且,直接删除的话,会降低解的多样性,因此删除不是一种经常使用的方式。
第二种方法是修复,修复当然是一种非常好的处理方式,但是修复的难度是比较大的,如何根据约束条件对非法解进行修复,需要根据自己的实际问题进行考虑,但是根本的核心就是约束条件,之所以非法就是因为违背了约束条件,所以,修复和编码一样,没有放之四海而皆准的方法。
第三种方式就是加惩罚因子,很直接的一种方式,既然非法,就惩罚一下,让这个个体的适应度变小,这样就会逐渐淡化这个个体的影响,同时保证了解的多样性,但是这种方式同样存在一个难点就是这个惩罚因子的大小到底要设置为多大会比较合适,也是需要探索才能得出的。

实际操作中,如何实现交叉和变异在一开始的伪代码中就有说明。

综上,遗传算法的主要步骤基本上就完成了,不得不佩服自然界的伟大,人类的所有灵感都来源于自然界,最后才用于人类。

  • 4
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值