粒子羣優化算法是一種模擬鳥羣社會行爲的羣體搜素算法。它分爲全局最佳粒子優化和局部最佳粒子優化,對於全局最佳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,在座標原點附近,符合預期結果。