天天看點

粒子群優化算法(Particle Swarm Optimization)的 Matlab(R2018b)代碼實作

這裡以 2D Michalewicz function 為對象來示範粒子群算法。

1、Michalewicz function

粒子群優化算法(Particle Swarm Optimization)的 Matlab(R2018b)代碼實作

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的網格圖

粒子群優化算法(Particle Swarm Optimization)的 Matlab(R2018b)代碼實作

粒子群初始化圖,‘點’表示粒子,‘星’表示群中最小的粒子

粒子群優化算法(Particle Swarm Optimization)的 Matlab(R2018b)代碼實作

 粒子群運動結束圖,最後粒子都運動到了 '星' 點處

粒子群優化算法(Particle Swarm Optimization)的 Matlab(R2018b)代碼實作

4 粒子群優化算法的優缺點

粒子群優化算法應用範圍廣,不要求目标函數可導。如果粒子群不夠大(比如把粒子數設為2),疊代次數不夠多(疊代次數設為5),最後可能無法得到最優解。由于算法初始化時随機生成粒子群,多次運作,粒子群不一樣,最終的結果也可能會不一樣(進入不同的局部最優解)。

繼續閱讀