遗传算法的改进——跳出局部最优机制的研究(选择算子、交叉算子、变异算子的改进)
0. 写在前面
没想到被最基础的遗传算法打败了˚‧º·(˚ ˃̣̣̥᷄⌓˂̣̣̥᷅ )‧º·˚
在编写遗传算法时我发现了一些问题:
-
优良基因很容易因为交叉、变异而遭到破坏,同时普通遗传算法也很容易陷入早熟(具体表现:1.群体中所有的个体都陷于同一极值而停止进化;2. 接近最优解的个体总是被淘汰,进化过程不收敛。)
-
对于轮盘赌的选择方式,早期的高适应度个体迅速占据种群、 后期的种群中因个体的适应度相差不大,都会导致种群停止进化。
遗传算法经常被应用于工业生产中的最优化问题当中, 但是在面对非线性、多极值、多变量的问题时容易在早期寻优过程中陷入局部最优解范围,通过大量的实验分析可得, 在解决具有多变量的最优化问题时, 遗传算法很容易因为遗传算法的特性造成“早熟”现象。(ps. 这次我研究的就是非线性且超多变量的问题,感觉被说中了T_T
1. 灾变操作
假设迭代次数为M,在第\(m(m<M)\)代之后,多数个体与最优个体相似度高(只有最优个体及最差个体相似度低),此时进行如下操作,以产生新种群:
-
将当前种群状态、最优个体及其适应度值进行保存
-
保留数量较少的适应度值较差的个体
-
将种群中大多数适应度优秀的个体进行删除
-
随机产生新个体进行补充
优点:
-
对保留之前的优秀种群特征组成新种群,进行新一轮搜索,可增大种群的多样性和搜索范围。
-
灾变之后保留的旧种群个体,由于本身处于较为优秀的寻优范围内会对新种群个体的搜索提供收敛趋势的引导。
2. 避免近亲繁殖的交叉算子
遗传算法中,在交叉之前需要进行配对。常用的方法是随机配对,但存在一个问题,当遗传过程进入局部最优时,群体中有很多几乎完全相同的串,我们称之为 “近亲”。当这些串进行交叉时,由很低的概率产生新的模式,类似于近亲繁殖,这样就无法跳出局部最优。
有学者提出了近亲交叉回避的思想,利用海明距离来判别亲缘关系的远近,参与交叉的两个串的海明距离过近,交换产生的新模式可能就会很少,容易陷入局部最优。
3. 避免局部收敛的动态变异率
基本思路为:当判断出种群出现“早熟”趋势时,以一个远大于通常变异概率的概率对所有个体执行一次变异操作,独立随机的产生许多新的个体,从而使整个群体脱离“早熟”。
4. 返回机制
为了提高算法的全局搜索性能,提高搜索的遍历性,可加入了返回操作。返回操作的概念是当交叉、变异操作失利时,即新生成的群体的平均(最优)适应度水平低于原先群体的平均(最优)适应度水平时,则否定此次操作,恢复到之前的种群状态。