版权声明:分享才能获得最大的价值 https://blog.csdn.net/qq_32252957/article/details/83479994
github: 智能算法的课件和参考资料以及实验代码
粒子群算法的原理:
粒子群算法是一种群体智能算法,通过追随当前搜索到的最优值来寻找全局最优。该算法实现容易、精度高、收敛快,在解决实际问题中具有很大的优越性。主要步骤可描述如下:
1、初始化粒子群位置和速度。
2、计算每个粒子的适应度,确定全局最优粒子gbest和个体最优粒子pbest。
3、判断算法收敛准则是否满足,若满足,则输出搜索结果;否则执行以下步骤。
4、根据gbest和pbest更新速度分量。
5、根据更新的速度分量更新粒子位置。
6、更新全局最优粒子和个体最优粒子。
7、返回步骤③。
扫描二维码关注公众号,回复: 4067736 查看本文章
下面我们举了两个函数最小值优化问题,实际上是参数拟合,但是转化成了最小化问题(具体下载第三次实验课件)
f.m
function y = f( x )
% 矩阵按照元素的平方是X.^2 A*B 是矩阵的乘法,而A.*B是两个矩阵对应元素相乘,其他情况下效果一样
% X=[1,3,4,5,6,7,8,9,10];
% Y=[10,5,4,2,1,1,2,3,4];
% Y1=x(1)*X.^2+x(2)*X+x(3);
t=1:15;
Y=[352 211 197 160 142 106 104 60 56 38 36 32 21 19 15];
Y1=x(1)*exp(x(2).*t);
y=norm(Y-Y1); % 向量的欧几里得距离
end
gbestpso.m
clear
clc
%*********初始化
M=20; %种群规模
x1=rand(M,1); % 初始化粒子位置
x2=rand(M,1);
%x3=rand(M,1);
%X=[x1,x2,x3]
X=[x1,x2];
c1=2; % c1和c2是学习因子
c2=2;
wmax=0.9; % 最大最小惯性权重
wmin=0.4; % 线性减小惯性权重
Tmax=50; % 迭代次数
%v=zeros(M,3);
v=zeros(M,2); % 初始化速度
% v1m=0.1; % 速度1约束
% v2m=1;% 速度2约束
%******* 全局最优粒子位置初始化
fmin=1000;
for i=1:M
fx = f(X(i,:));
if fx<fmin
fmin=fx;
gb=X(i,:);
end
end
%********粒子个体历史最优位置初始化
pb=X;
%********算法迭代
for t=1:Tmax
t % w是每代对应的惯性权重,正在逐渐减小
w=wmax-(wmax-wmin)*t/Tmax; % 线性下降惯性权重
for i=1:M
%******更新每个粒子的当前速度
v(i,:)=w*v(i,:)+c1*rand(1)*(pb(i,:)-X(i,:))+c2*rand(1)*(gb-X(i,:));
%******速度约束
% if v(i,1)>v1m; v(i,1)=v1m;end
% if v(i,2)>v2m; v(i,2)=v2m; end
% if v(i,1)<-v1m;v(i,1)=-v1m;end
% if v(i,2)<-v2m;v(i,2)=-v1m;end
%*******更新每个粒子的当前位置
X(i,:)=X(i,:)+v(i,:);
end
% 更新所有粒子的速度和位置之后更新pbest和gbest
for i=1:M
if f(X(i,:))<f(pb(i,:))
pb(i,:)=X(i,:);
end
if f(X(i,:))<f(gb)
gb=X(i,:);
end
end
% 保存最佳适应度
re(t)=f(gb);
end
figure(1)
plot(re)
xlabel('迭代次数')
ylabel('适应度函数')
gb
re(end)
figure(2)
% X=[1,3,4,5,6,7,8,9,10];
% Y=[10,5,4,2,1,1,2,3,4];
% Y1=gb(1)*X.^2+gb(2)*X+gb(3);
X=1:15;
Y=[352 211 197 160 142 106 104 60 56 38 36 32 21 19 15];
Y1=gb(1)*exp(gb(2).*X);
t=16;
y16=gb(1)*exp(gb(2).*t)
plot(X,Y,'o',X,Y1,':');
hold on
plot(t,y16,'ro')
% gb = [400.2029 -0.2241] 最好适应度61.2758
lbestpso.m
clear
clc
%*********初始化
M=20; % 种群规模
x1=rand(M,1); % 初始化例子位置
x2=rand(M,1);
%x3=rand(M,1);
%X=[x1,x2,x3]
X=[x1,x2];
c1=2; % 学习因子
c2=2;
wmax=0.9; % 最大最小惯性权重
wmin=0.4;
Tmax=50; % 迭代次数
v=zeros(M,2); % 初始化速度
%*******全局最优粒子位置初始化
fmin=1000;
gb=X;
k=2; % 邻域规模
for i=1:M
for in=i-k:i+k
if in<1;
in=in+M;%越界处理
elseif in>M
in=in-M;%越界处理
else
in=in;
end
if f(X(in,:))<f(gb(i,:))
gb(i,:)=X(in,:);%个体的邻域最优
end
end
end
%********粒子个体历史最优位置初始化
pb=X;
%********算法迭代
for t=1:Tmax
t
w=wmax-(wmax-wmin)*t/Tmax; %线性下降惯性权重
for i=1:M
%******更新粒子速度 终于是局部最优
v(i,:)=w*v(i,:)+c1*rand(1)*(pb(i,:)-X(i,:))+c2*rand(1)*(gb(i,:)-X(i,:));
%*******更新粒子位置
X(i,:)=X(i,:)+v(i,:);
end
%更新pbest和gbest
for i=1:M
if f(X(i,:))<f(pb(i,:))
pb(i,:)=X(i,:);
end
for in=i-k:i+k
if in<1;
in=in+M;
elseif in>M
in=in-M;
else
in=in;
end
if f(X(in,:))<f(gb(i,:))
gb(i,:)=X(in,:);%更新邻域最优
end
end
end
%保存最佳适应度
ffmin=1000;
for i=1:M
if f(gb(i,:))<ffmin;
ffmin=f(gb(i,:))
re(t)=ffmin;
ggb=gb(i,:);
end
end
end
figure(1)
plot(re)
xlabel('迭代次数')
ylabel('适应度函数')
ggb
figure(2)
%X=[1,3,4,5,6,7,8,9,10];
%Y=[10,5,4,2,1,1,2,3,4];
%Y1=gb(1)*X.^2+gb(2)*X+gb(3);
X=1:15;
Y=[352 211 197 160 142 106 104 60 56 38 36 32 21 19 15];
Y1=ggb(1)*exp(ggb(2).*X);
t=16;
y16=ggb(1)*exp(ggb(2).*t)
plot(X,Y,'o',X,Y1,':');
hold on
plot(t,y16,'ro')
hold off
% 最好适应度61.2860 指数函数参数a,b分别是400.0875 -0.2234
% 二次函数参数拟合问题 a = -0.0963 b = 0.7585 c = 3.2129 最小适应度函数为8.5722
下面是在matlab上运行的截图:
lbest二元函数参数拟合图:
lbest指数函数参数拟合:
gbest指数函数参数问题: