%%清空环境
clear all;
clc;
%%参数设置
w=0.5; %惯性因子
Pc=0.9; %杂交因子
Sp=0.2;
c1=2; %加速常数
c2=2; %加速常数
Dim=3 ; %维数
SwarmSize=100;%粒子群规模
ObjFun=@PIDsimulink;%待优化函数句柄
MaxIter=50;%最大迭代次数
MinFit=0.001; %最小适应值
Vmax=3;
Vmin=-3;
Ub=[60 20 20];
Lb=[0 0 0];
%%粒子群初始化
Range=ones(SwarmSize,1)*(Ub-Lb);
Swarm=rand(SwarmSize,Dim).*Range+ones(SwarmSize,1)*Lb;%初始化粒子群
VStep=rand(SwarmSize,Dim)*(Vmax-Vmin)+Vmin;%初始化速度
fSwarm=zeros(SwarmSize,1); %预设空矩阵,存放适应值
for i=1:SwarmSize
i
fSwarm(i,:)=feval(ObjFun,Swarm(i,:));%粒子群的适应值计算
end
%%个体极值和群体极值
[bestf, bestindex]=min(fSwarm); %求适应值最小值所在序列
zbest=Swarm(bestindex,:);%全局最佳
%fzbest=bestf;%局部最佳适应值
%gbest=zbest;%全局最佳
%fgbest=fzbest;%全局最佳适应值
gbest=Swarm; %个体最佳值
fgbest=fSwarm; %个人体最佳适应值
fzbest=bestf; %全局最佳适应值
%%迭代寻优
iter=0;
y_fitness=zeros(1,MaxIter);%预先产生4个空矩阵
Kp=zeros(1,MaxIter);
Ki=zeros(1,MaxIter);
Kd=zeros(1,MaxIter);
Swarm_cell = cell(MaxIter,1);
VStep_cell = cell(MaxIter,1);
zbest_cell = cell(MaxIter,1);
while((iter<MaxIter)&&(fzbest>MinFit))
iter
for j=1:SwarmSize
j;
%速度更新
VStep(j,:)=w*VStep(j,:)+c1*rand*(gbest(j,:)-Swarm(j,:))+c2*rand*(zbest-Swarm(j,:));
if VStep(j,:)>Vmax, VStep(j,:)=Vmax;end
if VStep(j,:)<Vmin, VStep(j,:)=Vmin;end
%位置更新
Swarm(j,:)=Swarm(j,:)+VStep(j,:);
for k=1:Dim
if Swarm(j,k)>Ub(k),Swarm(j,k)=Ub(k);end
if Swarm(j,k)<Lb(k),Swarm(j,k)=Lb(k);end
end
%适应值
fSwarm(j,:)=feval(ObjFun,Swarm(j,:));
%个体最优更新
if fSwarm(j)<fgbest(j)
gbest(j,:)=Swarm(j,:);
fgbest(j)=fSwarm(j);
end
%群体最优更新
if fSwarm(j)<fzbest
zbest=Swarm(j,:);
fzbest=fSwarm(j);
end
r1=rand();
if r1<Pc %Pc杂交概率
numPool=round( Sp*SwarmSize); %杂交池的大小
PoolX=Swarm(1:numPool,:); %杂交池中粒子位置
PoolV=VStep(1:numPool,:); %杂交池中粒子速度
for j=1:numPool
seed1=floor(rand()*(numPool-1))+1;
seed2=floor(rand()*(numPool-1))+1;
Pb=rand();
childX1(j,:)=Pb*PoolX(seed1,:)+(1-Pb)*PoolX(seed2,:); %子代位置计算
childV1(j,:)=(PoolV(seed1,:)+PoolV(seed2,:))*norm(PoolV(seed1,:))/norm(PoolV(seed1,:)+PoolV(seed2,:));
end
Swarm(1:numPool,:)=childX1;
VStep(1:numPool,:)=childV1;
end
end
fzbest
iter=iter+1;%迭代次数更新
y_fitness(1,iter)=fzbest;%为绘图做准备
Kp(1,iter)=zbest(1);
Ki(1,iter)=zbest(2);
Kd(1,iter)=zbest(3);
zbest_cell{iter,1} = zbest;
Swarm_cell{iter,1} = Swarm;
VStep_cell{iter,1} = VStep;
end
%%绘图输出
figure(1)%绘制ITAE性能指标的变化曲线
plot(y_fitness,'LineWidth',2)
title('最优个体适应值','fontsize',12);
xlabel('迭代次数','fontsize',12);ylabel('适应值','fontsize',12);
set(gca,'Fontsize',12);
figure(2)%绘制参数变化曲线
plot(Kp)
hold on
plot(Ki,'k','LineWidth',3)
plot(Kd,'--r')
title('Kp、Ki、Kd优化曲线','fontsize',12);
xlabel('迭代次数','fontsize',12);ylabel('参数值','fontsize',12);
set(gca,'Fontsize',12);
legend('Ke','Kec','Ku',1);