% PSO算法
% 仿真一个串级系统,并计算出绝对误差矩积分,用PSO算法对PI控制器寻优
% clc
% close all;
% clear all;
%随机初始化
lp=50; %循环代数
%初始化各个粒子
x=rand(10,2);
[n,m]=size(x);
%初始化各个粒子的第一步前进的速度
v=rand(size(x));
vmax=[1 1];
xmax=[5 5 ];
for i=1:n
y(i)=PsoPidForObj( x(i,1), x(i,2) ); %计算原始粒子的目标值
py=0;
end
p=x; %原始粒子的历史最优位置既是本身
ymin=inf; %原始粒子中的最优值
k=0;
for i=1:n
if( ( ymin ) > y(i) )
ymin=y(i);
k=i;
end
end
g=x(k,:); %原始粒子中的最优值
c1=1.5; %常数
c2=1.5;
y0=y; %保留各个粒子目标值的前一时刻值
gy=inf;
for k=1:lp
%惯性因子
%w=1-0.8*k/lp;
w=0.73;
% 个体最优值
for i=1:n
if(y0(i)>=y(i))
for j=1:m
p(i,j)=x(i,j);
end
py(i)=y(i);
end
end
y0=y ;
% 全局最优值
for i=1:n
if( (gy ) > ( py(i) ) )
g=p(i,:);
gy=py(i) ;
end
end
%计算个体前进速度,并限制最大值
for i=1:n
for j=1:m
v(i,j)=w*v(i,j)+c1*rand(1)*( p(i,j)-x(i,j) )+c2*rand(1)*( g(j)-x(i,j) );
end
%速度最大值限制
for j=1:m
if ( v(i,j)>vmax(j) )
v(i,j)=vmax(j);
end
if ( v(i,j)<-vmax(j) )
v(i,j)=-vmax(j);
end
end
%粒子前进一步
for j=1:m
x(i,j)=x(i,j)+v(i,j);
end
%粒子活动范围限制
for j=1:m
if ( x(i,j)>xmax(j) )
x(i,j)=xmax(j);
end
if ( x(i,j)<=0 )
x(i,j)=0.001;
end
end
%当前粒子的当前目标函数值
y(i)=PsoPidForObj( x(i,1), x(i,2) ); %%调用目标函数
end
best(k)=gy;
if (gy<=400)
break;
end
end
g
gy
figure(1);
plot(best);
PsoPidForOut( g(1),g(2) );
- 1
- 2
- 3
- 4
前往页