老师布置的作业,仿照B站上的PSO教学视频,完成PSO算法。
这里是借助matlab,用PSO算法对内置的peaks函数进行了一个函数优化,并进行了粒子群的仿真。
下面是收敛动画和代码。
clc
clear all
%% Parameter
varmax=3;
varmin=-3;
epoches=100;
w=1;
wdamp=0.99;
c1=2;
c2=2;
cost=@(x)3*(1-x(1)).^2.*exp(-(x(1).^2) - (x(2)+1).^2) ...
- 10*(x(1)/5 - x(1).^3 - x(2).^5).*exp(-x(1).^2-x(2).^2) ...
- 1/3*exp(-(x(1)+1).^2 - x(2).^2);
n=50;
%% Initialize
gcost=inf;
gbest=zeros([1 2]);
for i=1:n
swarm(i).pos=unifrnd(varmin,varmax,[1 2]);
swarm(i).v=zeros([1 2]);
swarm(i).cost=cost(swarm(i).pos);
swarm(i).ibest=swarm(i).pos;
swarm(i).icost=swarm(i).cost;
if swarm(i).cost<gcost
gbest=swarm(i).pos;
gcost=swarm(i).cost;
end
end
%% Alogrithm
for i=1:epoches
% update
pos=zeros([n 2]);
for j=1:n
swarm(j).v=w*swarm(j).v+c1*rand([1,2]).*(gbest-swarm(j).pos)+c2*rand([1 2]).*(swarm(j).ibest-swarm(j).pos);
swarm(j).pos=swarm(j).pos+swarm(j).v;
swarm(j).pos=min(swarm(j).pos,varmax);
swarm(j).pos=max(swarm(j).pos,varmin);
pos(j,:)=swarm(j).pos;
swarm(j).cost=cost(swarm(j).pos);
if swarm(j).icost>swarm(j).cost
swarm(j).icost=swarm(j).cost;
swarm(j).ibest=swarm(j).pos;
if gcost>swarm(j).cost
gcost=swarm(j).cost;
gbest=swarm(j).pos;
end
end
end
w=w*wdamp;
figure(1)
plot(pos(:,1),pos(:,2),'ro');
hold on
contour(linspace(-3,3,100),linspace(-3,3,100),peaks(100))
colorbar
hold off
disp(['the ' num2str(i) 'th iterator''s cost is ' num2str(gcost)])
loss(i)=gcost;
pause(0.1);
end
figure(2)
plot(loss,'b')
title('best cost changes with time')
disp(['best coefficient is ' num2str(gbest(1)) ' ' num2str(gbest(2)) ' ,and cost is ' num2str(gcost)])