写在前面


本文对于普通自适应遗传算法的Pm和Pc的公式进行了解读,此公式为M.Srinivas 和 L .M. Patnaik在1994年的《Adaptive Probabilities of Crossover》(点击这里下载论文)论文提出。

动机,出于怎样的目的把Pc和Pm的值设置成动态变化的(自适应)


在GA中有两个特征是必要的。

  • 第一个特征是在找出包含最优解的范围之后,收敛到最佳效果的能力。(收敛能力)
  • 第二个特征是探索解空间的新区域以寻找全局最优的能力。(寻优能力)

经过经验验证,适当的Pc值(0.5~1.0)和较小的Pm值(0.001~0.005)在GA实践中被普遍采用。

传统的遗传算法(SGA/GAS)存在着严重的缺点,在GAS中Pc和Pm的值是固定的,不管是优良个体还是劣质个体都经过了相同概率的交叉和变异操作。

  • 相同的概率,这可以说是不公平,因为对于优良个体,我们应该减小交叉变异概率,使之能够尽量保存 ; 而对于劣质个体,我们应该增大交叉变异概率,使之能够尽可能的改变劣质的状况 。所以,一成不变的交叉变异概率影响了算法的效率。
  • 另外,相同的概率总不能很好的满足种群进化过程中的需要,比如在迭代初期,种群需要较高的交叉和变异概率,已达到快速寻找最优解的目的,而在收敛后期,种群需要较小的交叉和变异概率,以帮助种群在寻找完最优解后快速收敛。所以,一成不变的交叉变异概率影响了算法的效率。

基于上述SGA存在的种种问题,M.Srinivas 和 L .M. Patnaik在1994年的《Adaptive Probabilities of Crossover》论文提出了自适应的遗传算法(AGA)

关于自适应遗传算法(AGA),Pm和Pc的自适应设计


一、AGA

AGA,旨在通过以不同的方式实现搜索和随机性之间的权衡,根据适合度值自适应地改变Pc和Pm的值 ,当群体倾向于停留在局部最优时(也就是群体适应度集中,多样性比较差时)Pc和Pm的值 增加,并且当群体在解空间中散布时(也就是群体适应度分散,多样性比较高时)减小。所以需要一个针对Pc和Pm的计算公式,让其符合动态变化。

二、Pc与Pm公式的推导与解析

一种检测收敛的方法是: 观察种群的最大适应度值(Fmax)与种群的平均适应度值(Favg )的关系,也就是Fmax-Favg的大小情况。这个值越小,即Favg逐渐向Fmax靠拢,表明种群逐渐进化,可能解向最优解靠拢。当然,通过上图,我们也可以发现对于收敛到一个最佳解的种群 比 一个分散在解空间的种群的Fmax-Favg 可能会更小(如上图中A点比B点还要低)。

我们注意上图中,(我们从整个种群的进化角度来看。)当GA收敛到适应度值为0.5的局部最优值时(全局最优解具有1.0的适应度值),Fmax-Favg减小了。Fmax-Favg作为GA检测收敛的标准,Pc和Pm值会根据Fmax-Favg的值进行变化。因为GA收敛到局部最优时,Pc和Pm的值必须增加,也就说,当Fmax-Favg减小的时候,Pc和Pm要增加(与Fmax-Favg的相反),也就说Fmax-Favg的值与Pc和Pm的值成反比。

表达式为:

Pc=k1 / ( Fmax - Favg )

Pm=k2 / ( Fmax - Favg ) ,k1 , k2 <= 1.0

从上述表达式中,我们可以观察到Pc和Pm的值的确是根据种群的适应度而变化了,即,当种群适应度集中时候(Favg向Fmax靠拢,Fmax-Favg变小),Pc和Pm变大,相反的,变小。

但是 还存在两个问题:

  1. Pc和Pm的值并不是依赖于特定个体的适应值,而是整个种群的平均和种群最大适应值 。因此优良个体和劣质个体都进行了相同水平的交叉和变异。 ,所以这对优良个体和劣质个体而言不公平,毕竟我们的初衷是想要保存优良个体,让交叉和变异小一点 ; 而改变劣质个体,让交叉和变异大一点。
  2. 当一个种群收敛到全局最优解的时候(甚至是局部最优解的时候),Pc和Pm增加,并且可能导致接近最优个体的损坏。种群可能永远不会收敛到全局最优解。即使我们能够阻止GA陷入局部最优解,但是GA的性能(根据收敛所需要的代数)肯定会恶化。

为了克服上述问题,我们需要保存种群中优良的个体和改变劣质个体,可以通过以下方式实现 (我们从某一代种群内部各个体的角度来看) :

  • 对于高适应度个体给予较低的Pc和Pm值,这有利于进行保存; 对于第适应度的个体给予高的Pc和Pm,这有利于劣质个体的改变。
  • Pm的值不仅仅取决于Fmax-Favg,还取决于个体的适应值F。 F越接近与Fmax,Pm的值应该越小,即 Pm应该直接等于(Fmax-F ),相似的,Pc的值应该也直接等于(Fmax-F ’ ) (F‘ 是两个要交叉个体中适应度较大的那个适应度值)。

现在对于Pc和Pm的表达式应该改为:

Pc = k1 ( Fmax - F' ) / ( Fmax - Favg )

Pm = k2 ( Fmax - F ) / ( Fmax - Favg ) , k1, k2 < = 1.0

注意: 对最大适应度个体而言,Pc和Pm是0 。 如果一个个体的 F‘ = Favg 的话,Pc=k1,如果一个个体的 F = Favg 的话,Pm=k2 。对于一个适应度非常低(即F <<Favg)的个体而言, Pc和Pm的值可能会 >1.0 。为了防止Pc和Pm的值超过1.0,我们设置了以下约束:

Pc = K3 , F ' <= Favg

Pm = K4 , F <= Favg , k3,k4 <=1.0

所以,对于Pm和Pc的公式,总结为:

    Pc:
                  Pc = k1 ( Fmax - F' ) / ( Fmax - Favg )   ,                   F ' >= Favg
                  Pc = K3                                   ,                   F ' <= Favg
    Pm:
                 Pm = k2 ( Fmax - F ) / ( Fmax - Favg )    ,                 F >= Favg
                 Pm =K4 ,                                                     F <= Favg

                k1,k2, k3,k4 <=1.0 

三、k1,k2,k3,k4实际考虑和选择的值

在上一节中,我们看到了一个适应度最高的个体,它的Pc和Pm都是0 。这个最好的个体被不停的复制到下一代。与选择机制一起循环,这可能导致这个最好个体在种群中以指数的增长形式快速增长,这会引起过早收敛。为了克服这个问题,我们为AGA(自适应遗传算法)的每一个个体都引进了一个默认的突变概率值(0.005)。

在现有文献中已经阐明了Pc应该取适当的值,最好为 0.5<Pc<1.0,Pm应该取小一点的值,最好为0.001<Pm<0.005,这是普通遗传算法(GAS)成功的必要措施。Pc的取值能够促进广泛的交叉,Pm的取值为了防止个体被破坏。然而,当Pc和Pm的值不变化时,这个方法是有效的和有意义的。

我们的方法的目标之一就是为了防止GA陷入局部最优解。为了实现这一个目标,我们采用低于平均适应度的个体去搜索空间中查找包含最优解的范围。像这种个体,需要被完全打乱,并且处于这种目的,我们让k4的值为0.5 。因为Favg的一个适应值的个体也应该被完全打乱,所以我们让K2的值也取0.5 。

基于类似的推论,我们让K1和K2的值取1.0 。这确保了所有适应度小于或者等于Favg的个体都要进行交叉操作。交叉的概率会随着适应度(父代个体中适应度最大的那个)趋向于Fmax而降低,并且这个概率对于适应度等于Fmax的个体为0.0 。

总结


通过自适应调节公式:

从种群整体来看:

随着种群的进化、可能解向着最优解靠拢,Favg逐渐接近Fmax,Fmax-Favg逐渐变小,Pc和Pm的值变大,这符合“ 随着种群迭代,适应度越来越集中,距离(局部)极值越来越近,为了增加种群多样性和跳出极值,Pc和Pm的值应该增大” 这一要求。

从某一代种群内部各个个体来看:

不同个体的交叉和变异概率随着自身适应度呈线性变化。适应度(F 或 F)越高的个体,Fmax-F或者Fmax-F'的值越小,这符合“ 保存优良个体”这一要求; 而适应度(F 或 F)越低的个体,Fmax-F或者Fmax-F'的值越大,这符合“ 改变劣质个体”这一要求。

特别的:

当个体的适应度等于当前当代种群中的最佳适应度(F'=Fmax或者F=Fmax)时,经过公式的计算可知,Pc和Pm都为0, 这也符合“把最佳个体保存下来”这一要求。

参数问题选择:

但是上述为0的情况虽然能把最佳个体保存,但是交叉和变异概率直接0,会导致那些保存下来的优良个体在种群中呈指数快速繁殖,导致早熟,所以让k2=0.5,k4=0.5,以利用种群中适应值低于平均值的个体来搜索全局最优解。同时推荐k1=1.0,k3=1.0

普通自适应遗传算法AGA的PC和PM公式解读的更多相关文章

  1. tsp问题——遗传算法解决

    TSP问题最简单的求解方法是枚举法. 它的解是多维的.多局部极值的.趋于无穷大的复杂解的空间.搜索空间是n个点的全部排列的集合.大小为(n-1)! .能够形象地把解空间看成是一个无穷大的丘陵地带,各山 ...

  2. 遗传算法求解旅行商(TSP)问题 -- python

    参考资料: 遗传算法解决TSP旅行商问题(附:Python实现) 遗传算法详解(GA)(个人觉得很形象,很适合初学者) from itertools import permutations impor ...

  3. 基础遗传算法的TSP问题

    一.简介 旅行商问题是一个经典的组合优化问题.一个经典的旅行商问题可以描述为:一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要经过所有城市后,回到出发地.应如何选择行进路线,以使总的 ...

  4. 基于GA遗传算法的TSP旅行商问题求解

    import random import math import matplotlib.pyplot as plt import city class no: #该类表示每个点的坐标 def __in ...

  5. python遗传算法实现数据拟合

    python据说功能强大,触角伸到各个领域,网上搜了一下其科学计算和工程计算能力也相当强,具备各种第三方包,除了性能软肋外,其他无可指摘,甚至可以同matlab等专业工具一较高下. 从网上找了一个使用 ...

  6. python遗传算法实现数据拟合(转)

    python据说功能强大,触角伸到各个领域,网上搜了一下其科学计算和工程计算能力也相当强,具备各种第三方包,除了性能软肋外,其他无可指摘,甚至可以同matlab等专业工具一较高下. 从网上找了一个使用 ...

  7. PC网站转换成手机版

    博客地址:https://www.cnblogs.com/zxtceq/p/5714606.html 一天完成把PC网站改为自适应!原来这么简单! http://www.webkaka.com/blo ...

  8. PC浏览器播放m3u8

    HLS(HTTP Live Streaming)是苹果公司针对iPhone.iPod.iTouch和iPad等移动设备而开发的基于HTTP协议的流媒体解决方案.在 HLS 技术中 Web 服务器向客户 ...

  9. Turn.js 实现翻书效果(自适应单双页)

    来源:https://www.cnblogs.com/hellman/p/10683492.html在上面的来源基础上增加页码显示,自适应单双页PC端效果: 移动端展示: 源码下载地址:http:// ...

随机推荐

  1. Jmeter的逻辑控制器——Controller

    逻辑控制器(Logic Controller) --贯穿整个Test Plan中,与各组件执行顺序没关系:目的是用于控制采样器的执行顺序. Simple Controller Simple Contr ...

  2. js中字符串转换为日期型

    简介:字符串转日期型函数 传入一个字符串格式的日期,如何转换为日期型的.以下为转换方案. //字符串转换为日期函数,返回日期型(传入的日期格式2014-04-22) function StringTo ...

  3. Ubuntu搭建ssh连接(连接方式:桥接网卡、网络地址转换(NAT))

    操作系统:Ubuntu Server 16.04.2 SSH软件:Putty(远程连接工具,视本机操作系统选择对应版本的putty) --------------------------------- ...

  4. 单Js 的重力游戏开发

    最近在用看cocos的时候萌生的想法,单纯js实现重力原理.然后就做了一个这样的小游戏.姑且命名为<超级玛丽>! 因为之前有人要我做超级玛丽.哈哈哈哈哈哈!这也算完成任务了吧. 先说一下原 ...

  5. sql server 2008 数据库管理系统使用SQL语句创建登录用户详细步骤

    --服务器角色:--固定服务器角色具有一组固定的权限,并且适用于整个服务器范围. 它们专门用于管理 SQL Server,且不能更改分配给它们的权限. --可以在数据库中不存在用户帐户的情况下向固定服 ...

  6. OpenMP 入门教程

    前两天(其实是几个月以前了)看到了代码中有 #pragma omp parallel for 一段,感觉好像是 OpenMP,以前看到并行化的东西都是直接躲开,既然躲不开了,不妨研究一下: OpenM ...

  7. 01背包Bone Collector

    好几天没写博客了,整天忙着打比赛,希望能有参加省赛的资格,不容易啊. 今天复习背包,之前集训讲过,现在又忘了,昨天杭电校赛刚好有一题背包,居然不会做了,好尴尬,重新复习一下. https://vjud ...

  8. JS判断当前手机类型

    window.onload = function () { var u = navigator.userAgent; if (u.indexOf('Android') > -1 || u.ind ...

  9. nodejs环境的搭建(linux环境centos6.5)

    更新yum # yum update 新建用户 # adduser user设置密码 # passwd user 允许用户通过ssl远程访问 # vi /etc/ssh/sshd_config 在文末 ...

  10. C++ 元编程 —— 让编译器帮你写程序

    目录 1 C++ 中的元编程 1.1 什么是元编程 1.2 元编程在 C++ 中的位置 1.3 C++ 元编程的历史 2 元编程的语言支持 2.1 C++ 中的模板类型 2.2 C++ 中的模板参数 ...