粒子群算法与遗传算法的对比&串行混合优化仿真 - 基于Rastrigin测试函数

说明

    在之前的几篇博文[1][2][3][4]中,我分别对遗传算法和粒子群算法做了一些探讨。在找资料的过程中读到参考资料[5]时,发现我们其实可以把多种优化算法(不限于本文将要讨论的粒子群和遗传算法之间)结合起来使用,当然,结合使用的目标自然是希望能够吸收多种算法的优势以达到更高的优化效果(比如增加收敛速度、让优化结果更容易朝向全局最优解)。不过本博文的目的在于建立算法混合使用时的思路和框架,(要使得混合下的算法效果由于各算法单独使用下的效果,还需要进行参数优化)

    本文以Rastrigin测试函数为例,试图探讨粒子群和遗传两种算法的对比及其混合使用。需要说明的是:本文关于两算法的混合使用只能算是一个简单(浅显)的尝试,后续有机会我再更新丰富,希望本文的内容能给对优化算法感兴趣的读者一点参考。

Blog

2024.4.18  博文第一次撰写

目录

说明

目录

一、粒子群算法&遗传算法概述

二、Rastrigin测试函数说明

三、仿真方案&参数

四、仿真结果与探讨

五、总结

六、参考资料

七、代码


一、粒子群算法&遗传算法概述

    我在博文[1]: 粒子群算法及基于该算法的典型问题求解实践-CSDN博客 和[3]: 粒子群算法及基于该算法的典型问题求解实践-CSDN博客 中已经做了详细的说明,这里不再赘述。

二、Rastrigin测试函数说明

    在[1]中,我使用了Griewank测试函数来测试粒子群算法。用于优化算法测试的函数有很多,这些函数的共同点在于有诸多的极值点(凹凸不平),可以用来检测算法是否收敛、以及是否容易陷入局部最优解。本博文选择Rastrigin函数进行算法的测试。

首先对该函数做简单介绍:Rastrigin函数的通用表达式为:

                           (2-1)

    式中,A为常数,一般取10;d为x的维度。在二维下,该式可化为:

          (2-2)

    取x和y的范围都是[-10 10],画出该函数的二维曲面图如下:

图2.1  二维Griewank函数对应的曲面

    本博文将分别使用粒子群算法、遗传算法、以及粒子群与遗传算法的串行混合方法在x和y的限定范围内[-10 10]寻找二维Griewank函数最小值。注:Griewank函数的最小值位于[0 0]处。

    公式(2-2)便可作为三种方法的适应度函数,Z值越小表示适应度越好。

三、仿真方案&参数

    基于粒子群算法、遗传算法的优化问题求解思路和流程也已经在[1]和[3]中给出,这里不再重复。关于两种算法的混合使用,有所谓的并行混合、串行混合以及嵌入式混合(不过似乎网上相关的介绍比较少),在参考资料[5]中,作者给出了所谓的嵌入式混合的处理流程:

图3.1  嵌入式混合算法流程图

    该流程图给出的整体处理流程其实很好理解。图中,越界处理及之前的操作是完整的粒子群算法处理流程,这里所谓的嵌入式混合是将遗传算法中的交叉和变异两个操作放到了粒子群算法处理流程之后:也就是对粒子群算法获得的结果再做一些变化。我对所谓的并行、串行以及嵌入式混合做了些简单的思索后,觉得前面给出的嵌入式似乎和我理解的串行很像(只是该流程中丢掉了部分处理:比如遗传算法中的复制操作、以及在做交叉操作之前是否应该更新一次适应度?)本文后续仿真中的串行混合处理流程如下图所示:

图3.2  串行混合算法流程图

    图3.2提供的算法流程其实就是将两种算法进行叠加(所谓的串行应该也就是这个意思?),我这里将遗传算法放在了前面,读者也可以试试将粒子群算法放在前面。

    本博文的仿真所用参数列表如下:

表3.1  算法参数列表

参数

粒子群算法参数

粒子数量

15

粒子维度

2(对应二维坐标值)

粒子位置范围

[-10 10](两个维度一样)

粒子速度范围

[-1 1]

惯性权重

[0.4 1.2],随迭代线性递减。

个体学习因子

0.5(两个维度一样)

群体学习因子

0.8(两个维度一样)

迭代终止条件

迭代100次

遗传算法参数

染色体数

15

单条染色体基因数

2

基因数值范围

[-10 10]

从上一代直接复制染色体条数

3

变异率

0.1

选择父代染色体的方法

轮盘赌算法

交叉方法

父母染色体各拿一个基因

变异方法

随机选择基因,并在限定范围内随机突变

注:后续三种仿真下,使用相同的初始化解(初始化的染色体和初始化的粒子一样)。 诚然,因为两种算法各自涉及到的参数很多,这些参数都会影响算法的收敛效果,所以很难简单对比两种算法的优劣。

四、仿真结果与探讨

    在前文的基础上,本章分别给出:遗传算法、粒子群算法、以及两算法串行混合下的仿真结果:

图4.1  单独使用粒子群算法时,不同迭代次数下各粒子适应度值的变化

图4.2  单独使用遗传算法时,不同迭代次数下各染色体适应度值的变化

图4.3  串行混合算法下,不同迭代次数下各个解的适应度值变化

图4.4  三种算法下历次迭代下最优适应度值的变化

    从仿真结果来看,三种方法都有收敛的趋势,其中粒子群算法的效果更好(当然,这与参数设置有关)。三种方法的结果都验证了代码的可行性,我在串行混合算法中使用的参数是沿用两种算法单独使用时的参数,所以参数可能并不是最优的,感兴趣的读者可以在我提供的代码上做优化。

五、总结

    本博文基于Rastrigin测试函数探讨粒子群算法和遗传算法的混合使用,分别给出了嵌入式混合以及串行混合下的算法流程,并对串行混合进行了仿真验证,仿真的结果验证了算法流程的可行性。

    本文提供的仿真结果下,串行混合的效果不如粒子群或遗传算法单独使用时的效果,但优化混合算法参数以使得该算法的结果优于单独使用某种算法时的效果不是本文的核心目标(因为算法涉及的参数很多)。本博文的目的在于建立算法混合使用时的思路和框架。

六、参考资料

[1] 遗传算法及基于该算法的典型问题的求解实践-CSDN博客

[2] 基于遗传算法的波束形成优化-仿真实践-CSDN博客

[3] 粒子群算法及基于该算法的典型问题求解实践-CSDN博客

[4] 基于粒子群算法的波束形成优化 – 仿真实践-CSDN博客

[5] 超详细 | 遗传-粒子群自适应优化算法及其实现(Matlab) CSDN博客

七、代码

粒子群算法与遗传算法的对比&串行混合优化仿真-基于Rastrigin测试函数博文对应的代码资源-CSDN文库

  • 21
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
本框架提供了有关粒子群算法(PSO)和遗传算法(GA)的完整实现,以及一套关于改进、应用、测试、结果输出的完整框架。 本框架对粒子群算法遗传算法进行逻辑解耦,对其中的改进点予以封装,进行模块化,使用者可以采取自己对该模块的改进替换默认实现组成新的改进算法与已有算法进行对比试验。试验结果基于Excel文件输出,并可通过设定不同的迭代结束方式选择试验数据的输出方式,包括: 1. 输出随迭代次数变化的平均达优率数据(设定终止条件区间大于0)。 2. 输出随迭代次数变化的平均最优值数据(设定终止条件区间等于0)。 本框架了包含了常用基准函数的实现以及遗传算法粒子群算法对其的求解方案实现和对比,如TSP,01背包,Banana函数,Griewank函数等。并提供大量工具方法,如KMeans,随机序列生成与无效序列修补方法等等。 对遗传算法的二进制编码,整数编码,实数编码,整数序列编码(用于求解TSP等),粒子群算法的各种拓扑结构,以及两种算法的参数各种更新方式均有实现,并提供接口供使用者实现新的改进方式并整合入框架进行试验。 其中还包括对PSO进行离散化的支持接口,和自己的设计一种离散PSO方法及其用以求解01背包问题的实现样例。 欢迎参考并提出宝贵意见,特别欢迎愿意协同更新修补代码的朋友(邮箱starffly@foxmail.com)。 代码已作为lakeast项目托管在Google Code: http://code.google.com/p/lakeast http://code.google.com/p/lakeast/downloads/list 某些类的功能说明: org.lakest.common中: BoundaryType定义了一个枚举,表示变量超出约束范围时为恢复到约束范围所采用的处理方式,分别是NONE(不处理),WRAP(加减若干整数个区间长度),BOUNCE(超出部分向区间内部折叠),STICK(取超出方向的最大限定值)。 Constraint定义了一个代表变量约束范围的类。 Functions定义了一系列基准函数的具体实现以供其他类统一调用。 InitializeException定义了一个代表程序初始化出现错误的异常类。 Randoms类的各个静态方法用以产生各种类型的随机数以及随机序列的快速产生。 Range类的实现了用以判断变量是否超出约束范围以及将超出约束范围的变量根据一定原则修补到约束范围的方法。 ToStringBuffer是一个将数组转换为其字符串表示的类。 org.lakeast.ga.skeleton中: AbstractChromosome定义了染色体的公共方法。 AbstractDomain是定义问题域有关的计算与参数的抽象类。 AbstractFactorGenerator定义产生交叉概率和变异概率的共同方法。 BinaryChromosome是采用二进制编码的染色体的具体实现类。 ConstantFactorGenerator是一个把交叉概率和变异概率定义为常量的参数产生器。 ConstraintSet用于在计算过程中保存和获取应用问题的各个维度的约束。 Domain是遗传算法求解中所有问题域必须实现的接口。 EncodingType是一个表明染色体编码类型的枚举,包括BINARY(二进制),REAL(实数),INTEGER(整型)。 Factor是交叉概率和变异概率的封装。 IFactorGenerator参数产生器的公共接口。 Population定义了染色体种群的行为,包括种群的迭代,轮盘赌选择和交叉以及最优个体的保存。 org.lakeast.ga.chromosome中: BinaryChromosome二进制编码染色体实现。 IntegerChromosome整数编码染色体实现。 RealChromosome实数编码染色体实现。 SequenceIntegerChromosome整数序列染色体实现。 org.lakeast.pso.skeleton中: AbstractDomain提供一个接口,将粒子的位置向量解释到离散空间,同时不干扰粒子的更新方式。 AbstractFactorGenerator是PSO中参数产生器的公共抽象类。 AbstractParticle定义了PSO种群中粒子的基本行为,最主要是实现了如何根据现有位置计算得到下一代粒子的位置的合法值。 ConstraintSet用于在粒子迭代过程中保存和获取应用问题的各个维度的约束。 AbstractSwarm.java各种拓扑结构的PSO种群的抽象父类,主要实现了种群迭代过程中计算流程的定义以及中间数据被如何输出到测试工具类。 Domain是PSO算法求解中所有问题域必须实现的接口。 DynamicFatorGenerator若种群在迭代过程中,w,c1,c2随迭代次数发生变化,那么它们的产生器需要继承这个抽象类。 Factor封装了w,c1,c2三个参数的字面值。 Location用于保存和获取迭代中粒子的位置和速度向量的数值。 NeighborhoodBestParticle定义了采用邻域版本的PSO算法的具体实现。主要是实现了如何根据邻域版本的PSO算法计算下一迭代中的粒子速度。 RingTopoSwarm定义环拓扑结构的具体实现,主要是定义了如何获取粒子的邻域粒子的方法。 StaticTopoSwarm静态拓扑结构的PSO算法的抽象父类。 org.lakeast.pso.swarm中包含粒子群拓扑结构的各种实现,基本见名知意。 对各种问题的求解样例位于org.lakeast.main包中,以...TaskTest结尾,基本见名知意。 以ShafferF6DomainTaskTes对ShafferF6函数进行求解(采用的是PSO,遗传算法样例参见TSPValueTaskTest)为例说明求解过程如下: 1. 入口函数位于org.lakeast.main.ShafferF6DomainTaskTest中,go函数执行。 2. 在go函数中,首先指定迭代次数(numberOfIterations),测试多少轮(testCount,多次运行以得到平均达优值),种群大小(popSize),邻域大小(neighborhoodSize),迭代结束条件(exitCondition,由于制定了迭代次数,所以设定为[0,0],也就是只有达到指定迭代次数才退出)。 3. 以testCount,numberOfIterations以及迭代结束条件exitCondition为参数构建TestBatch类的实例batch。这个类用来进行管理参与测试的各种具体算法,且把数据结果按指定的格式输出为Excel文件。 4. 指定PSO中的因子产生方法,采用ExponentFactorGenerator和ConstrictFactorGenerator两种方式(实现位于org.lakeast.pso.gen包)。 5. Y表示参与测试的算法数目。 6. Testable是所有可以被TestBatch测试的类需要实现的接口,以提供TestBatch生成结果Excel文件所需要的数据。 7. Domain接口是所有可以被算法解决的问题所需要实现的接口,比如说明该问题所需要的粒子位置约束范围,速度约束范围,以及适值评估的公司等。这里的Domain被实例化为ShafferF6Domain,也就是按照ShafferF6函数评估适值。 8. RingTopoSwarm是用来封装环拓扑邻域结构的类,NeighboordBestParticle是配合该类来实现按邻域最优更新速度而不是全局最优来更新。 9. 各个测试算法都被加入到TestBatch以后,batch.run()开始执行算法比较过程并输出结果Excel文件到C盘根目录(输出路径可在Testable接口中配置,除了生成Excel文件外,还可以通过修改log4j.properties在制定的位置产生运行结果日志)。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨@#≯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值