📄 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 + -