粒子群算法原理及在函数优化中的应用(附程序)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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');

相关文档
最新文档