⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spso.m

📁 这个是用基本粒子群优化算法解两个测试函数的最小值问题。
💻 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 + -