粒子群优化算法是一种模拟鸟群社会行为的群体搜素算法。它分为全局最佳粒子优化和局部最佳粒子优化,对于全局最佳PSO,或者叫做gbest PSO,每个粒子的邻域都是整个群,其算法伪代码如下:
创建并初始化一个n维的粒子群
repeat
for 每个粒子i=1,2,…n do
//设置个体最佳位置
if f(i)<y then
y=f(i);
end
//设置全局最佳位置
if y<Y then
Y=y;
end
end
for 每个粒子i=1,2,…n do
用速度方程更新速度
用位置方程更新位置
end
until 满足终止条件
gbest PSO的matlab实现代码如下:
tic %该函数表示计时开始
%------初始格式化--------------------------------------------------
clear all;
clc;
format long;
%------给定初始化条件----------------------------------------------
c1=1.4962; %加速常数即学习因子1
c2=1.4962; %加速常数即学习因子2
w=0.7298; %惯性权重
MaxDT=10000; %最大迭代次数
D=10; %搜索空间维数(测试函数sphere中未知数个数)
N=40; %初始化群体个体数目
eps=10^(-7); %设置精度(在已知最小值时候用)
%------初始化种群的个体(可以在这里限定位置和速度的范围)------------
for i=1:N
for j=1:D
x(i,j)=randn; %产生一个服从正态分布的随机数作为初始化位置
v(i,j)=randn; %产生一个服从正态分布的随机数作为初始化速度
end
end
%------先计算各个粒子的适应度,并初始化个体最优位置y和全局最优位置Pg--------
for i=1:N
p(i)=sphere(x(i,:),D);%计算适应度,测试函数为sphere
y(i,:)=x(i,:); %初始化个体最优位置y为在时间步t=0时的粒子位置
end
Pg=x(1,:); %Pg为全局最优位置
for i=2:N
if sphere(x(i,:),D)<sphere(Pg,D)
Pg=x(i,:);%更新全局最优位置
end
end
%------进入主要循环,按照公式依次迭代,直到满足精度要求------------
for t=1:MaxDT
for i=1:N
v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(Pg-x(i,:));
x(i,:)=x(i,:)+v(i,:);
if sphere(x(i,:),D)<p(i)
p(i)=sphere(x(i,:),D);%更新适应度
y(i,:)=x(i,:);%更新个体最佳位置
end
if p(i)<sphere(Pg,D)
Pg=y(i,:);%更新群体最佳位置
end
end
Pbest(t)=sphere(Pg,D);%保存每一代的群体最佳位置
end
toc %该函数表示计时结束
%------最后给出计算结果
disp('*************************************************************')
disp('函数的全局最优位置为:')
for i=1:D
fprintf('x(%d)=%s\n',i,Pg(i));
end
fprintf('最后得到的优化极值为:%s\n',sphere(Pg,D));
disp('*************************************************************')
sphere函数如下:
%适应度函数源程序(sphere.m)
%参数x为变量名,参数D为维数
function result=sphere(x,D)
sum=0;
for i=1:D
sum=sum+x(i)^2;
end
result=sum;
程序运行结果:
Elapsed time is 2.943799 seconds.
*************************************************************
函数的全局最优位置为:
x(1)=6.654911e-009
x(2)=5.739281e-009
x(3)=-3.207077e-009
x(4)=-1.107863e-011
x(5)=9.756758e-009
x(6)=6.682152e-009
x(7)=-2.828295e-010
x(8)=2.533800e-009
x(9)=3.868910e-009
x(10)=1.740554e-009
最后得到的优化极值为:2.518562e-016
*************************************************************
从运行结果可以看出,程序运行时间约为3秒,找到的sphere函数的最小值点接近0,在坐标原点附近,符合预期结果。