這裡以 2D Michalewicz function 為對象來示範粒子群算法。
1、Michalewicz function
2、代碼詳解
2.1 畫Michalewicz函數的網格圖形
[email protected](x,y)(-sin(x).*(sin(x.^2/3.1415926)).^(2*m)...
-sin(y).*(sin(2*y.^2/3.1415926)).^(2*m));
range=[0 4 0 4];
Ngrid=100;
dx=(range(2)-range(1))/Ngrid;
dy=(range(4)-range(3))/Ngrid;
xgrid=range(1):dx:range(2);
ygrid=range(3):dy:range(4);
[x,y]=meshgrid(xgrid,ygrid);
z=f(x,y);
figure(1);
%subplot(1,2,1);
surfc(x,y,z);
hold on;
2.2 粒子群優化算法的子函數
粒子群初始化
function [xn,yn]=init_pso(n,range)
xrange=range(2)-range(1);
yrange=range(4)-range(3);
xn=rand(1,n)*xrange+range(1);
yn=rand(1,n)*yrange+range(3);
end
粒子群的移動
function [xn,yn]=pso_move(xn,yn,xo,yo,a,b,range)
nn=size(yn,2);
xn=xn.*(1-b)+xo.*b+a.*(rand(1,nn)-0.5);
yn=yn.*(1-b)+yo.*b+a.*(rand(1,nn)-0.5);
[xn,yn]=findrange(xn,yn,range);
end
確定粒子群不會出界
function [xn,yn]=findrange(xn,yn,range)
nn=length(yn);
for i=1:nn
if xn(i)<=range(1)
xn(i)=range(1);
end
if xn(i)>=range(2)
xn(i)=range(2);
end
if xn(i)<=range(3)
xn(i)=range(3);
end
if xn(i)>=range(4)
xn(i)=range(4);
end
end
end
2.3 粒子群算法的主體函數
%n = number of particles
% Num_iterations = number of iterations
n=10;
Num_iterations =50;
best=zeros(Num_iterations,3);
[xn, yn]=init_pso(n,range);
figure(2);
for i = 1:Num_iterations
contour(x,y,z,15); %show the contour of the objectvie function
hold on;
%find the current best location(xo,yo)
zn=f(xn,yn);
zn_min=min(zn);
xo=min(xn(zn==zn_min));
yo=min(yn(zn==zn_min));
zo=min(zn(zn==zn_min));
plot(xn,yn,'.',xo,yo,'*');
axis(range);
beta=0.5;
gamma=0.7;
alpha=gamma.^i;
[xn,yn]=pso_move(xn,yn,xo,yo,alpha,beta,range);
drawnow;
hold off;
best(i,1)=xo;
best(i,2)=yo;
best(i,3)=zo;
end
3 圖形展示,粒子數設為10,疊代次數設為50
Michalewicz function的網格圖
粒子群初始化圖,‘點’表示粒子,‘星’表示群中最小的粒子
粒子群運動結束圖,最後粒子都運動到了 '星' 點處
4 粒子群優化算法的優缺點
粒子群優化算法應用範圍廣,不要求目标函數可導。如果粒子群不夠大(比如把粒子數設為2),疊代次數不夠多(疊代次數設為5),最後可能無法得到最優解。由于算法初始化時随機生成粒子群,多次運作,粒子群不一樣,最終的結果也可能會不一樣(進入不同的局部最優解)。