📄 spso.m
字号:
%标准的PSO解决函数优化问题
%-------------------------------init
clear all
close all
clc
iter_max=150; %最大迭代次数
Xmax= 2;%100;% %位置最大值
Vmax= 0.5;%25;% %最大速度
N=20; %种群规模
p=2; %粒子维数
C1=2; %加速度常数
C2=2;
X=Xmax*(2*rand(p,N)-1); %粒子位置
V=Vmax*(2*rand(p,N)-1); %粒子速度
Xpbest=X; %个体最佳位置
Xgbest=Xmax*(2*rand(p,1)-1);;%种群最佳位置
fpbest=inf*ones(1,N); %个体最佳适应度值
fgbest=inf; %种群最佳适应度值
w=linspace(0.9,0.4,iter_max);%惯性权重
%------------------------------main
k=1;
for iter=1:iter_max
%w=0.9-0.5/iter_max*iter;
for i=1:N
fitness(i)=f1(X(:,i)); %Goldstein-Price函数 x=[0;-1], f=3
% fitness(i)=f2(X(:,i)); %Schaffer函数 x=[0;0], f=-1
if (fitness(i)<fpbest(i))
fpbest(i)=fitness(i);
Xpbest(:,i)=X(:,i);
end
end
[fitnessmin,index]=min(fpbest);
if fitnessmin<fgbest
fgbest=fitnessmin;
Xgbest=X(:,index);
end
for i=1:N
V(:,i)=w(iter)*V(:,i)+C1*rand(1)*(Xpbest(:,i)-X(:,i))+C2*rand(1)*(Xgbest(:,1)-X(:,i));
for j=1:p
if abs(V(j,i))>Vmax
V(j,i)=V(j,i)/abs(V(j,i))*Vmax;
end
end
X(:,i)=X(:,i)+V(:,i);
for j=1:p
if abs(X(j,i))>Xmax
X(j,i)=X(j,i)/abs(X(j,i))*Xmax;
end
end
end
fgbest_fig(k)=fgbest;
Xgbest_fig(:,k)=Xgbest;
k=k+1;
end
%----------------------------disp
disp('-----------理论最优值');
fgbest0= 3%-1%
fgbest0_fig=fgbest0*ones(iter_max);
disp('-----------估计值');
fgbest
disp('-----------误差');
fgbest-fgbest0
disp('-----------理论最优值时的变量取值');
Xgbest0= [0;-1]% [0;0]%
Xgbest0_fig=diag(Xgbest0)*ones(p,iter_max);
disp('-----------估计值');
Xgbest
subplot(2,1,1):plot(1:iter_max,fgbest_fig,'r',1:iter_max,fgbest0_fig,'-.k');
ylabel('最优值跟踪');
legend('估计值','真值');
subplot(2,1,2):plot(1:iter_max,Xgbest_fig(1,:),'b',1:iter_max,Xgbest_fig(2,:),'g',1:iter_max,Xgbest0_fig(1,:),'-.k',1:iter_max,Xgbest0_fig(2,:),'-.k');
ylabel('自变量跟踪');
xlabel('迭代次数');
legend('x1','x2');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -