遗传算法 差分进化算法 粒子群优化算法区别

一 遗传算法

 遗传算法(GA)作为一种经典的进化算法,自 Holland提出之后在国际上已经形成了一个比较活跃的研究领域. 人们对 GA 进行了大量的研究,提出了各种改进算法用于提高算法的收敛速度和精确性. 遗传算法采用选择,交叉,变异操作,在问题空间搜索最优解.经典遗传算法首先对参数进行编码,生成一定数目的个体,形成初始种群其中每个个体可以是一维或多维矢量,以二进制数串表示,称为染色体.染色体的每一位二进制数称为基因.根据自然界生物优胜劣汰的选择思想,算法中设计适应度函数作为评判每个个体性能优劣的标准,性能好的个体以一定概率被选择出来作为父代个体参加以后的遗传操作以生成新一代种群.算法中基本的遗传算子为染色体选择,染色体上基因杂交和基因变异.生成新一代种群后算法循环进行适应度评价、遗传操作等步骤,逐代优化,直至满足结束条件.

标准遗传算法的流程如下:

Stepl:初始化群体.

Step2:计算群体上每个个体的适应度值.

Step3:按由个体适应度值所决定的某个规则选择将进入下一代的个体.

Step4:按概率cp 进行杂交操作.

Step5:按概率mp 进行变异操作.

Step6:若满足某种停止条件,则执行 Step7,否则执行 Step2.

Step7:输出种群中适应度值最优的染色体作为问题的满意解.

一般情况下,算法的终止条件包括:1、完成了预先给定的进化代数;2、种群中的最优个体在连续若干代没有改进或平均适应度在连续若干代基本没有改进;3、所求问题最优值小于给定的阈值.

粒子群(PSO)算法是近几年来最为流行的进化算法,最早是由Kenned和Eberhart于1995年提出.PSO 算法和其他进化算法类似,也采用“群体”和“进化”的概念,通过个体间的协作与竞争,实现复杂空间中最优解的搜索.PSO 先生成初始种群,即在可行解空间中随机初始化一群粒子,每个粒子都为优化问题的一个可行解,并由目标函数为之确定一个适应值(fitness value).PSO 不像其他进化算法那样对于个体使用进化算子,而是将每个个体看作是在n 维搜索空间中的一个没有体积和重量的粒子,每个粒子将在解空间中运动,并由一个速度决定其方向和距离.通常粒子将追随当前的最优粒子而运动,并经逐代搜索最后得到最优解.在每一代中,粒子将跟踪两个极值,一为粒子本身迄今找到的最优解 pbest ,另一为全种群迄今找到的最优解 gbest.由于认识到 PSO 在函数优化等领域所蕴含的广阔的应用前景,在 Kenned 和 Eberhart 之后很多学者都进行了这方面的研究.目前已提出了多种 PSO改进算法,并广泛应用到许多领域.

二、差分进化算法

差分进化算法在 1997 年日本召开的第一届国际进化优化计算竞赛(ICEO)]表现突出,已成为进化算法(EA)的一个重要分支,很多学者开始研究 DE 算法,并取得了大量成果.2006年 CEC 国际会议将其作为专题讨论,由此可见 DE 算法已成为学者的研究热点,具有很大的发展空间.

DE算法的基本原理:

DE 算法主要用于求解连续变量的全局优化问题,其主要工作步骤与其他进化算法基本一致,主要包括变异(Mutation)、交叉(Crossover)、选择(Selection)三种操作。算法的基本思想是从某一随机产生的初始群体开始,利用从种群中随机选取的两个个体的差向量作为第三个个体的随机变化源,将差向量加权后按照一定的规则与第三个个体求和而产生变异个体,该操作称为变异。然后,变异个体与某个预先决定的目标个体进行参数混合,生成试验个体,这一过程称之为交叉。如果试验个体的适应度值优于目标个体的适应度值,则在下一代中试验个体取代目标个体,否则目标个体仍保存下来,该操作称为选择。在每一代的进化过程中,每一个体矢量作为目标个体一次,算法通过不断地迭代计算,保留优良个体,淘汰劣质个体,引导搜索过程向全局最优解逼近。

DE算法的求解步骤:
(1)基本参数的设置,包括NP, F, CR
(2)初始化种群
(3)计算种群适应度值
(4)终止条件不满足时,进行循环,依次执行变异、交叉、选择运算,直到终止运算。


 图2.1给出了算法的具体流程:

控制参数对一个全局优化算法的影响是很大的,DE的控制变量选择也有一些经验规则.

(1)种群数量.根据经验,种群数量 NP 的合理选择在5 D   10D之间,必须满足 NP ≥4以确保DE具有足够的不同的变异向量.

(2)变异算子.变异算子 F ∈ [0,2]是一个实常数因数,它决定偏差向量的放大比例.迄今为止的研究表明,小于0.4和大于1的 F 值仅偶尔有效, F = 0.5通常是一个较好的初始选择.若种群过早收敛,那么 F 或 NP 应该增加.

(3)交叉算子.交叉算子CR 是一个范围在[0,1]的实数,它是控制一个试验向量来自随机选择的变异向量而不是原来向量的概率的参数.CR 的一个较好的选择是0.1,但较大的CR 通常加速收敛,为了看是否可能获得一个快速解,可以首先尝试 CR = 0.9或 CR = 1.0.

(4)最大进化代数.它表示DE算法运行到指定的进化代数之后就停止运行,并将当前群体中的最佳个体作为所求问题的最优解输出.一般取值范围为100-200,当然根据问题的需要,可以增大最大进化代数以提高算法的求解精度,不过这样往往使得算法的运行时间过长.

(5)终止条件.除最大进化代数可作为DE的终止条件,还需要其它判定准则.一般当适应度值小于阀值时程序终止,阀值常选为610 .

上述参数中,F ,CR 与 NP 一样,在搜索过程中是常数,一般 F 和CR 影响搜索过程的收敛速度和鲁棒性,它们的优化值不仅依赖于目标函数的特性,还与 NP 有关.通常可通过在对不同值做一些试验之后利用试验和结果误差找到 F ,CR 和 NP 合适值。

参数设置

种群规模NP:多样性,NP大,增加搜索到最优解的概率,但是计算量加大。

缩放因子F:对基向量扰动程度,F大,扰动大,能够在更大范围寻找解。0.4~1

交叉概率CR:种群多样性,CR大,更多个体改变,利于寻找最优解。0.6~1

区别:不同之处在于遗传算法是根据适应度值来控制父代杂交,变异后产生的子代被选择的概率值,在最大化问题中适应值大的个体被选择的概率相应也会大一些。而差分进化算法变异向量是由父代差分向量生成,并与父代个体向量交叉生成新个体向量,直接与其父代个体进行选择。显然差分进化算法相对遗传算法的逼近效果更加显著。

遗传算法,粒子群算法,差分进化算法都属于进化算法的分枝,很多学者对这些算法进行了研究,通过不断的改进,提高了算法的性能,扩大了应用领域因此很有必要讨论这些算法的特点,针对不同应用领域和算法的适应能力,推荐不同的算法供使用将是十分有意义的工作.在文献中,作者针对广泛使用的 34 个基准函数分别对 DE,EA,PSO 进行了系列实验分析,对各种算法求解最优解问题进行了讨论.通过实验分析,DE 算法获得了最优性能,而且算法比较稳定,反复运算都能收敛到同一个解;PSO 算法收敛速度次之,但是算法不稳定,最终收敛结果容易受参数大小和初始种群的影响;EA 算法收敛速度相对比较慢,但在处理噪声问题方面,EA 能够很好的解决而 DE 算法很难处理这种噪声问题.

通过实验和文献分析,我们对遗传算法、粒子群算法、差分进化算法的一些指标分别进行分析现归纳如下:

(1)编码标准     GA 采用二进制编码,PSO、DE 都采用浮点实数编码,近年来许多学者通过整数编码将GA 算法、PSO 算法应用与求解离散型问题,特别是 0-1 非线性优化为题,整数规划问题、混合整数规划问题,而离散的 DE 算法则研究的比较少,而采用混合编码技术的 DE 算法则研究更少.

(2)参数设置问题    DE 算法主要有三个参数(种群大小NP、缩放因子F、交叉概率CR)要调整,而且参数设置对结果影响不太明显,因此更容易使用.相对于 GA 和 PSO 算法的参数过多,不同的参数设置对最终结果影响也比较大,因此在实际使用中,要不断调整,加大了算法的使用难度.高维问题在实际问题中,由于转化为个体的向量维数非常高,因此算法对高维问题的处理,将是很重要的.只有很好的处理高维问题,算法才能很好的应用于实际问题.

(3)高维问题     GA 对高维问题收敛速度很慢甚至很难收敛,但是 PSO 和 DE 则能很好解决.尤其是DE 算法,收敛速度很快而且结果很精确.

(4)收敛性能      对于优化问题,相对 GA,DE 和 PSO 算法收敛速度比较快,但是 PSO 容易陷入局部最优解,而且算法不稳定.

(5)应用广泛性       由于 GA 算法发明比较早,因此应用领域比较广泛,PSO 算法自从发明以来,已成为研究热点问题,这方面应用也比较多,而 DE 算法近几年才引起人们的关注而且算法性能好,因此应用领域将会增多.

DE缺点

1、搜索停滞:种群个体较少,且生成新一代个体的适应值比原种群个体适应值差,导致个体难以更新,没有收敛到极值点。

2、早熟收敛:参数设置不当,收敛过快,局部最优问题。

原文网址 点击打开链接
  • 13
    点赞
  • 121
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
本框架提供了有关粒子群算法(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在制定的位置产生运行结果日志)。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值