基于果蝇算法的PID整定.docx
《基于果蝇算法的PID整定.docx》由会员分享,可在线阅读,更多相关《基于果蝇算法的PID整定.docx(30页珍藏版)》请在冰豆网上搜索。
![基于果蝇算法的PID整定.docx](https://file1.bdocx.com/fileroot1/2023-2/2/4a042081-0c56-4823-a941-a83ae8a1e06b/4a042081-0c56-4823-a941-a83ae8a1e06b1.gif)
基于果蝇算法的PID整定
基于果蝇算法的PID整定
一、果蝇算法介绍
果蝇优化算法(FruitFlyOptimizationAlgorithm,FOA)是2011年由台湾学者潘文超提出的一种群体智能算法,一种基于果蝇觅食行为推演出的寻求全局优化的新方法。
果蝇本身在感官知觉上优于其他物种,尤其是在嗅觉与视觉上。
果蝇的嗅觉器官能很好地搜集飘浮在空气中的各种气味,然后飞近食物位置后亦可使用敏锐的视觉发现食物与同伴聚集的位置,并且往该方向飞去。
寻优步骤:
依照果蝇搜寻食物的特性,将其归纳为几个必要的步骤进行寻优。
Step1:
随机初始化果蝇群体位置。
InitX_axis;InitY_axis.
Step2:
赋予果蝇个体利用嗅觉搜寻食物的随机方向和距离。
X(i)=X_axis+RandomValue;
Y(i)=Y_axis+RandomValue;
Step3:
由于无法得知食物位置,因此先估计与原点的距离(Dist),再计算味道浓度判定值(S),此值为距离的倒数。
D(i)=(X(i)^2+Y(i)^2)^0.5;
S(i)=1/D(i);
Step4:
味道浓度判定值(S)代入味道浓度判定函数(或称为FitnessFunction)以求出该果蝇个体位置的味道浓度(Smelli)。
Smell(i)=Fitness(S(i))
Step5:
求此果蝇群体中的味道浓度最高的果蝇(求极值)。
[bestSmellbestindex]=max(Smell);
Step6:
记录浓度值与x、y坐标,此时果蝇群体利用视觉往该位置飞去。
Smellbest=bestSmell.
X_axis=X(bestIndex);
Y_axis=Y(bestIndex);
Step7:
重复执行step2至5,并判断味道浓度是否优于前一迭代味道浓度,若是则执行步骤6。
算法的流程图:
二、两种方法的PID整定(这一部分为了结论更有说服力,每种方法运行三次,以排除随机性)
1、遗传算法
遗传算法是一种新型的、模拟生物进化机制的随机化搜索和优化方法,具有并行计算、全局收敛、编码操作等特点。
由于其算法结构的开放性,易于与问题结合,便于运算,已成功的应用于求解多种复杂的优化问题,遗传算法的特点使得将其运用于PID参数的优化是可行的。
两种算法所选取最优指标一样,为了获得满意的过度动态特性,采用了误差绝对值时间积分性能作为参数选择的最小目标函数,为了防止控制能量过大,在目标函数中加入了控制输入的平方项,选用下式作为参数选择的最优指标:
式中e(t)为系统误差。
u(t)为控制器输出,tu为上升时间,W1,W2,W3为权值。
PID各系数的取值范围kp<100,ki<1,kd<1.
以下列传递函数作为对象:
程序见附录1。
经过MATLAB仿真得到如下曲线:
图2.1遗传算法第一组
图2.2遗传算法第二组
图2.3遗传算法第三组
由上面三个结果可知,遗传算法在整定问题上效果不够好。
遗传算法的缺点:
1、遗传算法的编程实现比较复杂,首先需要对问题进行编码,找到最优解之后还需要对问题进行解码,
2、另外三个算子的实现也有许多参数,如交叉率和变异率,并且这些参数的选择严重影响解的品质,而目前这些参数的选择大部分是依靠经验.
3、没有能够及时利用网络的反馈信息,故算法的搜索速度比较慢,要得要较精确的解需要较多的训练时间。
4、算法对初始种群的选择有一定的依赖性,能够结合一些启发算法进行改进。
5、算法的并行机制的潜在能力没有得到充分的利用,这也是当前遗传算法的一个研究热点方向。
2、果蝇算法
本例中最优指标同上:
传递函数同上:
种群大小:
30;迭代次数:
100
同样运行三次程序(附录2)得到如下图:
图2.4果蝇算法第一组
图2.5果蝇算法第二组
图2.6果蝇算法第三组
由上图可以看到果蝇算法的曲线优于遗传算法,但是仍然不够理想。
果蝇算法的缺点在于,它容易陷入局部寻优,出现早熟现象。
三、改进FOA
由上面得到的结论可知,我们希望得到在尽量少的代数里得到最优值。
所以需要对FOA进行改进,方法为改进步长,即
其中h为搜索步长,rand为0~1之间的随机数。
通过改进的FOA仿真(程序见附录3)可得:
图3.1改进FOA第一组
图3.2改进FOA第二组
图3.3改进FOA第三组
四、总结
1、果蝇算法与遗传算法相比优点:
程序简单,时间短,容易达到要求。
2、缺点:
容易陷入局部最优,且只适用于较为简单的系统。
3、改进FOA:
用增加步长的方式进行改进,防止陷入局部最优,可实现全局最优,从曲线看,效果优于FOA及遗传算法。
附录1
遗传算法:
主程序
%GA(GenericAlgorithm)ProgramtooptimizePIDParameters
clearall;
closeall;
tic;
globalrinyouttimef%定义3个全局变量
Size=30;%种群大小
CodeL=3;%种群个体长度
MinX
(1)=zeros
(1);%P最小为0
MaxX
(1)=20*ones
(1);%P最大为20
MinX
(2)=zeros
(1);%I最小为0
MaxX
(2)=1.0*ones
(1);%I最大为1
MinX(3)=zeros
(1);%D最小为0
MaxX(3)=1.0*ones
(1);%D最大为1
Kpid(:
1)=MinX
(1)+(MaxX
(1)-MinX
(1))*rand(Size,1);%编码
Kpid(:
2)=MinX
(2)+(MaxX
(2)-MinX
(2))*rand(Size,1);
Kpid(:
3)=MinX(3)+(MaxX(3)-MinX(3))*rand(Size,1);
G=100;%迭代次数
BsJ=0;
%***************StartRunning***************
forkg=1:
1:
G
time(kg)=kg;
%******Step1:
EvaluateBestJ******
fori=1:
1:
Size
Kpidi=Kpid(i,:
);
[Kpidi,BsJ]=pid_gaf(Kpidi,BsJ);
BsJi(i)=BsJ;
end
[OderJi,IndexJi]=sort(BsJi);
BestJ(kg)=OderJi
(1);
BJ=BestJ(kg);
Ji=BsJi+1e-10;%Avoidingdevidingzero
fi=1./Ji;
%Cm=max(Ji);
%fi=Cm-Ji;
[Oderfi,Indexfi]=sort(fi);%Arrangingfismalltobigger
Bestfi=Oderfi(Size);%LetBestfi=max(fi)
BestS=Kpid(Indexfi(Size),:
);%LetBestS=E(m),mistheIndexfibelongtomax(fi)
kg;
BJ;
BestS;
%******Step2:
SelectandReproductOperation******
fi_sum=sum(fi);
fi_Size=(Oderfi/fi_sum)*Size;
fi_S=floor(fi_Size);%SelectingBiggerfivalue
r=Size-sum(fi_S);
Rest=fi_Size-fi_S;
[RestValue,Index]=sort(Rest);
fori=Size:
-1:
Size-r+1
fi_S(Index(i))=fi_S(Index(i))+1;%AddingresttoequalSize
end
k=1;
fori=Size:
-1:
1%SelecttheSizethandReproducefirstly
forj=1:
1:
fi_S(i)
TempE(k,:
)=Kpid(Indexfi(i),:
);%SelectandReproduce
k=k+1;%kisusedtoreproduce
end
end
%************Step3:
CrossoverOperation************
Pc=0.90;
fori=1:
2:
(Size-1)
temp=rand;
ifPc>temp%CrossoverCondition
alfa=rand;
TempE(i,:
)=alfa*Kpid(i+1,:
)+(1-alfa)*Kpid(i,:
);
TempE(i+1,:
)=alfa*Kpid(i,:
)+(1-alfa)*Kpid(i+1,:
);
end
end
TempE(Size,:
)=BestS;
Kpid=TempE;
%************Step4:
MutationOperation**************
Pm=0.10-[1:
1:
Size]*(0.01)/Size;%Biggerfi,smallerPm
Pm_rand=rand(Size,CodeL);
Mean=(MaxX+MinX)/2;
Dif=(MaxX-MinX);
fori=1:
1:
Size
forj=1:
1:
CodeL
ifPm(i)>Pm_rand(i,j)%MutationCondition
TempE(i,j)=Mean(j)+Dif(j)*(rand-0.5);
end
end
end
%GuaranteeTempE(Size,:
)belongtothebestindividual
TempE(Size,:
)=BestS;
Kpid=TempE;
end
Bestfi;
BestS;
Best_J=BestJ(G)
toc;
figure
(1);
plot(time,BestJ);
title('最优指标')
xlabel('Times');ylabel('BestJ');
figure
(2);
plot(timef,rin,'r',timef,yout,'b');
title('阶跃响应')
xlabel('Time(s)');ylabel('rin,yout');
调用程序
function[Kpidi,BsJ]=pid_gaf(Kpidi,BsJ)
globalrinyouttimef
ts=0.001;
sys=tf(400,[1,1,100]);
dsys=c2d(sys,ts,'z');
[num,den]=tfdata(dsys,'v');
rin=1.0;
u_1=0.0;u_2=0.0;
y_1=0.0;y_2=0.0;
x=[0,0,0]';
B=0;
error_1=0;
tu=1;
s=0;
P=100;
fork=1:
1:
P
timef(k)=k*ts;
r(k)=rin;
u(k)=Kpidi
(1)*x
(1)+Kpidi
(2)*x
(2)+Kpidi(3)*x(3);
ifu(k)>=10
u(k)=10;
end
ifu(k)<=-10
u(k)=-10;
end
yout(k)=-den
(2)*y_1-den(3)*y_2+num
(2)*u_1+num(3)*u_2;
error(k)=r(k)-yout(k);
%------------ReturnofPIDparameters-------------
u_2=u_1;u_1=u(k);
y_2=y_1;y_1=yout(k);
x
(1)=error(k);%CalculatingP
x
(2)=(error(k)-error_1)/ts;%CalculatingD
x(3)=x(3)+error(k)*ts;%CalculatingI
error_2=error_1;
error_1=error(k);
ifs==0
ifyout(k)>0.95&yout(k)<1.05
tu=timef(k);
s=1;
end
end
end
fori=1:
1:
P
Ji(i)=0.999*abs(error(i))+0.01*u(i)^2*0.1;
B=B+Ji(i);
ifi>1
erry(i)=yout(i)-yout(i-1);
iferry(i)<0
B=B+100*abs(erry(i));
end
end
end
BsJ=B+0.2*tu*10;
附录2
普通FOA:
%function[BESTP,BESTI,BESTD]=FOA(kp,ki,kd,K,T)
%***清空运行环境
clc
clear
tic;
%tic;
%K=2;
%T=13;
kp=5;
ki=0.1;
kd=0.1;
globalrinyouttimef
ts=0.001;
sys=tf(400,[1,50,0]);
dsys=c2d(sys,ts,'z');
[num,den]=tfdata(dsys,'v');
%***初始果蝇个体飞行距离
%***初始果蝇群体位置
X_axis=[kp,ki,kd];
maxgen=100;%迭代次数
sizepop=30;%种群规模
%***果蝇寻优开始,利用嗅觉寻找食物。
forp=1:
sizepop
%***初始果蝇个体飞行距离
A(p,1)=X_axis(1,1)+(rand(1,1));
ifA(p,1)<100&A(p,1)>0
X(p,1)=A(p,1);
end
A(p,2)=X_axis(1,2)+0.01*(rand(1,1));
ifA(p,2)<1&A(p,2)>0
X(p,2)=A(p,2);
end
A(p,3)=X_axis(1,3)+0.1*(rand(1,1));
ifA(p,3)<1&A(p,3)>0
X(p,3)=A(p,3);
end
%***利用味道浓度判定函数求出味道浓度
rin=1.0;
u_1=0.0;u_2=0.0;
y_1=0.0;y_2=0.0;
x=[0,0,0];
B=0;
error_1=0;
tu=1;
s=0;
P=100;
fork=1:
1:
P
timef(k)=k*ts;
r(k)=rin;
u(k)=X(p,1)*x
(1)+X(p,2)*x
(2)+X(p,3)*x(3);
ifu(k)>=10
u(k)=10;
end
ifu(k)<=-10
u(k)=-10;
end
yout(k)=-den
(2)*y_1-den(3)*y_2+num
(2)*u_1+num(3)*u_2;
error(k)=r(k)-yout(k);
%------------ReturnofPIDparameters-------------
u_2=u_1;u_1=u(k);
y_2=y_1;y_1=yout(k);
x
(1)=error(k);%CalculatingP
x
(2)=(error(k)-error_1)/ts;%CalculatingD
x(3)=x(3)+error(k)*ts;%CalculatingI
error_2=error_1;
error_1=error(k);
ifs==0
ifyout(k)>0.95&yout(k)<1.05
tu=timef(k);
s=1;
end
end
end
fori=1:
1:
P
Ji(i)=0.999*abs(error(i))+0.01*u(i)^2*0.1;
B=B+Ji(i);
ifi>1
erry(i)=yout(i)-yout(i-1);
iferry(i)<0
B=B+100*abs(erry(i));
end
end
end
BsJ(p)=B+0.2*tu*10;
Smell(p)=BsJ(p);
end
[bestSmellbestindex]=min(Smell);
%***利用视觉寻找味道浓度最高的种群。
X_axis=X(bestindex,:
);
Smellbest=bestSmell;
%————————————————果蝇迭代寻优——————————————————
forgen=1:
maxgen
%***利用嗅觉寻找食物
forp=1:
sizepop
%***初始果蝇个体飞行距离
A(p,1)=X_axis(1,1)+(rand(1,1));
ifA(p,1)<100&A(p,1)>0
X(p,1)=A(p,1);
end
A(p,2)=X_axis(1,2)+0.01*(rand(1,1));
ifA(p,2)<1&A(p,2)>0
X(p,2)=A(p,2);
end
A(p,3)=X_axis(1,3)+0.1*(rand(1,1));
ifA(p,3)<1&A(p,3)>0
X(p,3)=A(p,3);
end
%***利用味道浓度判定函数求出味道浓度
rin=1.0;
u_1=0.0;u_2=0.0;
y_1=0.0;y_2=0.0;
x=[0,0,0];
B=0;
error_1=0;
tu=1;
s=0;
P=100;
fork=1:
1:
P
timef(k)=k*ts;
r(k)=rin;
u(k)=X(p,1)*x
(1)+X(p,2)*x
(2)+X(p,3)*x(3);
ifu(k)>=10
u(k)=10;
end
ifu(k)<=-10
u(k)=-10;
end
yout(k)=-den
(2)*y_1-den(3)*y_2+num
(2)*u_1+num(3)*u_2;
error(k)=r(k)-yout(k);
%------------ReturnofPIDparameters-------------
u_2=u_1;u_1=u(k);
y_2=y_1;y_1=yout(k);
x
(1)=error(k);%CalculatingP
x
(2)=(error(k)-error_1)/ts;%CalculatingD
x(3)=x(3)+error(k)*ts;%CalculatingI
error_2=error_1;
error_1=error(k);
ifs==0
ifyout(k)>0.95&yout(k)<1.05
tu=timef(k);
s=1;
end
end
end
fori=1:
1:
P
Ji(i)=0.999*abs(error(i))+0.01*u(i)^2*0.1;
B=B+Ji(i);
ifi>1
erry(i)=yout(i)-yout(i-1);
iferry(i)<0
B=B+100*abs(erry(i));
end
end
end
BsJ(p)=B+0.2*tu*10;
Smell(p)=BsJ(p);
[bestSmellbestindex]=min(Smell);
%***利用视觉寻找味道浓度最大的种群
ifbestSmellX_axis=X(bestindex,:
);
%bestS=S(bestindex,:
);
Smellbest=bestSmell;
end
yy(gen)=Smellbest;
Xbest(gen,:
)=X_axis;
end
end
toc;
figure
(1)
plot(yy)
title('最优指标')
xlabel('Times');ylabel('BestJ');
figure
(2);
plot(timef,rin,'r',timef,yout,'b');
title('阶跃响应')
xlabel('Time(s)');ylabel('rin,yout');
disp(Xbest(gen,:
))
disp(Smellbest)
%—————程序结束——————————————
附录3
改进FOA:
%function[BESTP,BESTI,BESTD]=FOA(kp,ki,kd,K,T)
%***清空运行环境
clc
clear
tic;
%tic;
%K=2;
%T=13;
kp=5;
ki=0.1;
kd=0.1;
globalrinyouttimef
ts=0.001;
sys=tf(400,[1,1,100]);
dsys=c2d(sys,ts,'z');
[num,den]=tfdata(dsys,'v');
%***初始果蝇个体飞行距离
%***初始果蝇群体位置
X_axis=[kp,ki,kd];
number=1;
maxgen=100;%迭代次数
sizepop=30;%种群规模
%***果蝇寻优开始,利用嗅觉寻找食物。
forp=1:
sizepop
%***初始果蝇个体飞行距离
A(p,1)=X_axis(1,1)+number*(2*rand(1,1)-1);
ifA(p,1)<100&A(p,1)>0
X(p,1)=A(p,1);
end
A(p,2)=X_axis(1,2)+0.01*number*(2*rand(1,1)-1);
ifA(p,2)<1&A(p,2)>0
X(p,2)=A(p,2);
end
A(p,3)=X_axis(1,3)+0.1*number*(2*rand(1,1)-1);
ifA(p,3)<1&A(p,3)>0
X(p,3)=A(p,3);
end
%***利用味道浓度判定函数求出味道浓度
rin=1.0;
u_1=0.0;u_2=0.0;
y_1=0.0;y_2=0.0;
x=[0,0,0];
B=0;
error_1=0;
tu=1;
s=0;
P=100;
fork=1:
1:
P
timef(k)=k*ts;
r(k)=rin;
u(k)=X(p,1)*x
(1)+X(p,2)*x
(2)+X(p,3)*x(3);
ifu(k)>=10
u(k)=10;
end
ifu(k)<=-10
u(k)=-10;
e