第一次学习优化算法之遗传算法、粒子群算法

本文深入解析了遗传算法和粒子群算法的基本原理及应用。遗传算法通过模仿自然选择和遗传机制解决优化问题,而粒子群算法则通过模拟鸟群觅食行为实现寻优。文章详细介绍了算法的构成要素、流程、参数设置及停止准则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遗传算法

            基本思想:1、根据问题的目标函数构造适值函数(Fitness Function);

                              2、产生一个初始种群(100-1000);

                              3、根据适值函数的好坏,不断选择繁殖;

                              4、若干代后得到适值函数最好的个体即最优解。

              构成要素: 1、种群(Population),种群大小(Pop-size)

                               2、基因表达法——编码方法;

                               3、遗传算子(Genetic Operator)——交叉、变异

                               4、选择策略:一般为正比选择)——选择种群中适应值高的个体,适者生存,优胜劣汰。

                               5、停止准则(Stopping Rule/Criterion)

               算法流程图:

                           

               算法步骤:1、初始种群的产生:随机产生(依赖于选择的编码方法——二进制编码/实数编码);种群大小(依赖于计算机的计算机能力和计算复杂度)。

                                 2、编码方法——二进制编码(用0,1字符串表达)。二进制适用于三种情况:背包问题+实时优化+指派问题。二进制编码缺点:编码长不利于计算;二进制编码优点:便于位值计算,包括的实数范围大。

                                 3、适值函数——根据目标函数设计。用适值函数F(x)标定目标函数f(x)可采用方法:-minf(x)或maxf(x)

                                 4、遗传算法——交叉和变异。

                                 5、选择策略——最常用的是正比选择,选择概率的计算公式:,得到选择概率P后,采用轮转法,计算得到轮转法的元素:,随机产生,当,则选择个体i。

                         图例:

                                         

                                       6、停止准则  ——通常指定最大迭代次数。

   交叉不是所有点都交叉,设定一个交叉概率    ,一般选较大数,比如0.9

                         (一)单切点交叉

                                   随机产生一个断点(Cutting Point)[1,n-1]

                                   例题:

                         (二)双切点交叉

                                    例题:

变异:初始种群中没有需要的基因,在种群中按变异概率      任选若干位基因改变位值0→1或1→0,

有意想不到的结果,    一般设定得比较小,在5%以下。变异的可能是很小的,比如在陷入局部最优时

例题:NP:种群数量。

 

粒子群算法(Particle Swarm Optimization)

           优点:简单易行、收敛速度快、设置参数少

           算法介绍

                 每个寻优问题解都被想像成一只鸟,称为粒子。所有粒子都在一个D维空间进行搜索。

                 所有的粒子都由一个fitness function 确定适应值以判断目前的位置好坏。

                 每一个粒子必须赋予记忆功能,能记住所搜寻到的最佳位置。

                 每一个粒子还有个速度以决定飞行的距离和方向这个速度根据它本身的飞行经验以及同伴的飞行经验进行动态调整。

            求最优解的过程中的符号表达

                   D维空间中,有N个粒子;

                        粒子i位置:xi=(xi1,xi2,xiD),将xi代入适应函数f(xi)求适应值;

                       粒子i速度:vi=(vi1,vi2,viD)

                       粒子i个体经历过的最好位置:pbesti=(pi1,pi2,piD)

                       种群所经历过的最好位置:gbest=(g1,g2,gD)

                   通常,在第d(1≤d≤D)维的位置变化范围限定在内,速度变化范围限定在内(即在迭代中若Vid,Xid,超出了边界值,则该维的速度或位置被限制为该维最大速度或边界位置)

               q粒子i的第d维速度更新公式,

                       由三部分组成:粒子先前的速度(可理解为惯性速度)

                                                粒子本身的思考(粒子i当前位置与自己最好位置之间的距离)

                                                粒子间的社会经验(粒子i当前位置与群体最好位置之间的距离)

        图解:

                  

             q粒子i的第d维位置更新公式:

          —第k次迭代粒子i飞行速度矢量的第d维分量

          —第k次迭代粒子i位置矢量的第d维分量

              c1,c2—加速度常数,调节学习最大步长

              r1,r2—两个随机函数,取值范围[0,1],以增加搜索随机性

              w —惯性权重,非负数,调节对解空间的搜索范围

粒子群优化算法的算法流程图

         

粒子群算法的构成要素

       群体大小m:m是一个整型参数。m很小时陷入局部最优的可能性很大;m很大时,POS优化能力很好,当群体数目增长至一定水平时,再增加不再有显著的作用。

       权重因子:惯性因子w:w=1是基本粒子群算法;w=0表示失去对粒子本身的速度的记忆。

                         学习因子c1:c1=0——无私型粒子群算法。缺点:迅速丧失群体多样性,易陷入局部最优而无法跳出。

                         学习因子c2:c2=0——自我认知型粒子群算法。缺点:完全没有信息的社会共享,导致算法的收敛速度很慢。

       最大速度Vm:Vm较大时,探索能力增强,但是粒子容易飞过最优解;Vm较小时,开发能力增强,但容易陷入局部最优。Vm一般设为每维变量的变化范围的10%~20%。

       邻域的拓扑结构:分为两种:将群体内所有个体都作为粒子的领域、只将群体中的部分个体作为粒子的领域。领域拓扑结构决定群体历史最优位置。故将粒子群算法分为全局粒子算法和局部粒子算法。

       停止准则:最大迭代步数、可接受满意度。

              粒子空间初始化较好地选择粒子的初始化空间,将大大缩短收敛时间.初始化空间根据具体问题的不同而不同,也就是说,这是问题依赖的.    

             例子:

                   

 

 

本框架提供了有关粒子群算法(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在制定的位置产生运行结果日志)。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值