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

📄 pso.m

📁 PSO应用于最小二乘估计
💻 M
字号:
%------------------------------主程序
%粒子群优化算法在参数最小二乘估计中的应用
%陈毓灵
%Post2Ling@hotmail.com
%function [Pgd,Fgd] = PSO(Pop,nIter,Wmax)
%function PSO
%points=50; %样本点数
clear;
vect=3; %待估参数向量维数

Pop=50; %种群大小
Vmax=20; %最大速度
Vmin=-20; %最小速度
nIter=150; %迭代次数
Wmax=1.2; %最大惯性因子
Wmin=0.0; %最小惯性因子
Wn=1.0; %惯性因子衰减指数
FaiI=1.2; %自身学习率
FaiG=1.2; %社会学习率
global Pgd;
global Fgd;
%输入样本 X Y
%X=51+rand(50,1)*50;
%Y = 100+(200./(1+exp(0.3.*(X-75))))+(rand(50,1)-0.5)*20;


%粒子群
%当前位置vec维 个体历史最优位置vec维 全局最优位置vec维 当前值 个体历史最优值 全局最优值
X = (rand(Pop,vect) - 0.5).*20;             %当前位置
%Pid = (rand(Pop,vect) - 0.5).*20;           %个体历史最优
Pid = X;
Pgd = Pid(1,:);                            %全局最优


% 更新适应值
F = Fitness(X); %当前值
Fid = F; %个体历史最优值
Fgd = F(1); %全局最优值
% 更新全局最优位置和适应值
for j=1:Pop
    if Fid(j)<Fgd
        Fgd=F(j);
        Pgd = Pid(j,:);
    end
end

%粒子群速度
V=(rand(Pop,vect)-0.5)*10;

for i=1:nIter

    % 更新惯性因子
    W=((nIter-i)^Wn)/(nIter^Wn)*(Wmax-Wmin)+Wmin;

    % 更新速度
    V=W.*V + FaiI.*rand.*ones(Pop,vect)*(Pid-X)+FaiG.*rand.*ones(Pop,vect)*(ones(Pop,1)*(Pgd-X));
    % 限制速度
    V(find(V>Vmax))=Vmax;
    V(find(V<Vmin))=Vmin;

    % 更新位置
    X=X + V;

    % 更新适应值
    F = Fitness(X);
    %P(:,vec*3+1)=Fitness(P(:,1:vec),X,Y);

    % 更新个体最优位置和适应值
    for j=1:Pop
        if F(j) < Fid(j);
            Fid(j)=F(j);
            Pid(j,:) = X(j,:);
        end
    end

    % 更新全局最优位置和适应值
    for j=1:Pop
        if Fid(j)<Fgd
            Fgd=Fid(j);
            Pgd = Pid(j,:);
        end
    end
Rec(i) = Fgd
end
plot(Rec);
%输出结果
% [P(1,vec*2+1:vec*3),P(1,vec*3+3)]
%[P(1,vec*2+1),P(1,vec*2+2),P(1,vec*2+3)/300,P(1,vec*2+4)]

%BP=51:100;
%HR = P(1,vec*2+1)+(P(1,vec*2+2)./(1+exp((P(1,vec*2+3)./300).*(BP-P(1,vec*2+4)))));%+(rand(1,50)-0.5)*10;

%h=plot(X,Y,'r*',BP,HR,'b');
%xlabel('x')
%ylabel('Logistic')
%title('4参数Logistic函数图像与样本比较 (p1=100;p2=200;p3=0.3;p4=75)')
%legend('样本','估计函数')



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -