粒子群算法原理及在函数优化中的应用(附程序)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
粒子群算法原理及其在函数优化中的应用
1 粒子群优化(PSO )算法基本原理
1.1 标准粒子群算法
假设在一个D 维的目标搜索空间中,有m 个代表问题潜在解的粒子组成一个种群12[,,...,]m =x x x x ,第i 个粒子的信息可用D 维向量表示为
12[,,...,]T i i i iD x x x =x ,其速度为12[,,...,]T i i i iD v v v =v 。算法首先初始化m 个随机粒
子,然后通过迭代找到最优解。每一次迭代中,粒子通过跟踪2个极值进行信息交流,一个是第i 个粒子本身找到的最优解,称之为个体极值,即
12[,,...,]T i i i iD p p p =p ;另一个是所有粒子目前找到的最优解,称之为群体极值,
即12[,,...,]T g g g gD p p p =p 。粒子在更新上述2个极值后,根据式(1)和式(2)更新自己的速度和位置。
11122()()t t t t t t i i i i g i w c r c r +=+-+-v v p x p x
(1)
11t t t i i i ++=+x x v (2)
式中,t 代表当前迭代次数,12,r r 是在[0,1]之间服从均匀分布的随机数,12
,c c 称为学习因子,分别调节粒子向个体极值和群体极值方向飞行的步长,w 为惯性权重,一般在0.1~0.9之间取值。在标准的PSO 算法中,惯性权重w 被设为常数,通常取0.5w =。在实际应用中,x 需保证在一定的范围内,即x 的每一维的变化范围均为min max [,]X X ,这在函数优化问题中相当于自变量的定义域。
1.2 算法实现步骤
步骤1:表示出PSO 算法中的适应度函数()fitness x ;(编程时最好以函数的形式保存,便于多次调用。)
步骤2:初始化PSO 算法中各个参数(如粒子个数,惯性权重,学习因子,最大迭代次数等),在自变量x 定义域内随机初始化x ,代入()fitness x 求得适应度值,通过比较确定起始个体极值i p 和全局极值g p 。
步骤3:通过循环迭代更新x 、i p 和g p : ①确定惯性权重w 的取值(当w 不是常数时)。
②根据式(1)更新粒子的速度1k i v ,若速度中的某一维超过了max V ,则取为
max
V 。
③根据式(2)更新自变量x ,若x 的取值超过其定义域,则在其定义域内重新
初始化。
④代入()fitness x 求得适应度值,通过比较更新个体极值i p 和全局极值g p 。 步骤4:判断是否满足终止条件(通常设为达到最大迭代次数或达到估计精度要求),若不满足,则转入步骤(3),若满足,则输出估计结果,算法结束。
2 程序实现
2.1 各种测试函数(适应度函数)
测试函数是用来测试算法性能的一些通用函数,下面先给出一些测试函数的三维图(自变量为两维,加上函数值共三维)如图1-图17所示。
z2 = x 2-cos(18*x)+y 2-cos(18*y)
图1 测试函数1
z4 = 4*x2-2.1*x4+x6/3+x*y-4*y2+y4
图2 测试函数2
z5 = (y-5.1*x2/4/π/π+5*x/π-6)2+10*(1-1/8/π)*cos(x)+10
图3 测试函数3
z7 = x*exp(-x2-y2)
图4 测试函数4
z8
图5 测试函数5
r=sqrt(x2+y2)+eps; z9=sin(r)/r;
图6 测试函数6
f6
图7 测试函数7
-10
图8 测试函数8
图9 测试函数9
图10 测试函数10
NDparabola
图11 测试函数11
f6
图12 测试函数12
Rosenbrock
图13 测试函数13
ackley
图14 测试函数14
tripod
-10
图15 测试函数15
Rastrigin
图16 测试函数16
Griewank
图17 测试函数17
2.2 程序实现
首先给出绘制测试函数的程序:
%% 绘图测试函数draw_fitness.m
clear;clc;close all;
%%
[x,y]=meshgrid(-10:0.5:10);
z2 = x.^2-cos(18*x)+y.^2-cos(18*y);
figure(1); surf(x,y,z2); minz2=min(min(z2));title('z2 = x^2-cos(18*x)+y^2-cos(18*y)');
%%
z4 = 4*x.^2-2.1*x.^4+x.^6/3+x.*y-4*y.^2+y.^4;
figure(2); surf(x,y,z4); minz4=min(min(z4));title('z4 = 4*x^2-2.1*x^4+x^6/3+x*y-4*y^2+y^4'); %%
z5 = (y-5.1*x.^2/4/pi/pi+5*x/pi-6).^2+10*(1-1/8/pi)*cos(x)+10;
figure(3); surf(x,y,z5); minz5=min(min(z5));title('z5 =
(y-5.1*x^2/4/\pi/\pi+5*x/\pi-6)^2+10*(1-1/8/\pi)*cos(x)+10');