当前位置:文档之家› 遗传算法的参数整定报告

遗传算法的参数整定报告

基于遗传算法的PID 控制器参数整定报告一、 遗传算法。

遗传算法(GAs )是基于自然界生物进化机制的搜索寻优技术。

用遗传算法来整定PID 参数,可以提高优化性能,对控制系统有良好的控制精度、动态性能和鲁棒性。

一般的,Gas 包括三个基本要素:复制、交叉和突变。

二、PID Optimal-TuningPID 控制:对偏差信号e(t)进行比例、积分和微分运算变换后形成的一种控制规律。

(1)可调参数:比例度δ(P )、 积分时间Ti (I )、微分时间Td (D )。

通常,PID 控制准则可以写成下面传递函数的形式: )1()(s T T s K s G d ip ++= (2) Kp 、Ti 和Td 分别是比例放大率、积分时间常量和微分时间常量。

1) 比例控制(P ):是一种最简单的控制方式。

其控制器的输出与输入误差信号成比例关系。

当仅有比例控制时系统输出存在稳态误差(Steady state error ),比例度减小,稳态误差减小;2) 积分(I )控制:在积分控制中,控制器的输出与输入误差信号的积分成正比关系。

3) 微分(D )控制:在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。

文中,性能指标是误差平方的时间加权积分,表示为:),,1,0(,02n k dt e t J it k Λ==⎰ (3)其中n 是非负整数,i t 是积分周期。

此外,其他标准项如超调量、上升时间和稳定时间()()()()⎥⎦⎤⎢⎣⎡++=⎰t e dt d T d e T t e K t u d t i p 01ττ也被一个合成性能指标选择:))(1(s s r r c t c t c os J ++= (4)s r os t t 、、分别代表超调量、上升时间和稳定时间。

s r c 、c 两个系数有用户定义或决定。

预期的性能指标的最下化可以认为是小的超调量、短的上升时间和稳定时间。

三个PID 参数的编码方式如下:10101011:S 10101000 11100111p K i K d Kp K 、i K 和d K 都是八位二进制字符格式。

自适应函数的选择关系到性能指标,如:101)(J J F F == (5) 实际上,)(J F 可以是任何一个能切实表达F 和J 关系的非线性函数。

遗传操作是模拟生物基因遗传的操作,从优化搜索的角度而言,遗传操作可使问题的解一代一代地优化,并逼近最优解,主要包括三个遗传算子:选择、交叉和变异。

关于他们的具体方法这里不在赘述。

三、 计算机实现作者编程使用的事TURBO C 。

程序包括两个部分:一个是仿真PID 控制系统的闭环阶跃响应;另一个是实施对一代所有成员的遗传算法的仿真,这里遗传算法将一代作为一个整体。

在第一代生物的二进制代码随机产生之后,这个过程重复直至迭代次数达到预选的次数。

步长、PID 参数范围、性能指标、自适应函数和方法得时间延迟都是从一个文件中读取。

而遗传算法的的参数,诸如世代数、交叉概率、变异概率、选择概率等通过菜单选择。

整个闭环系统仿真的完成可以用四阶龙格库塔法或直接时域计算。

在程序中,复制的实现是通过轮盘赌博法的线性搜索,面积加权于上一代成员的适应值。

交叉发生在每一对复制产生的成员。

交叉操作是将一个随机产生的一个在0到1之间数与交叉概率比较决定是否需要交叉。

如果需要交叉,则在1到47之间随机产生一个交叉位置代码。

变异,对新一代所有成员都随机产生一个0到1之间的数与变异概率比较,然后再决定是否改变代码的一位。

同理,反转也是这样判定和操作的。

另一需要说明的事,两个反转位置代码是在1~48之间随机选择的。

同样,依据随机的预选概率,预选操作是用好的后代取代不好父代。

除了这些基本操作,另一个过程叫做存储也在程序中进行,它是存储老一代适应值高的成为新一代。

程序实现过程列出如下:(1) 将d P K K K 和、i 三个参数编码成二进制字符串;(2) 生成第一代成员编码成字符串;(3) 将字符串解码成三个参数:d P K K K 和、i ;(4) 计算所有的传递函数;(5) 使用四阶龙格库塔仿真闭环系统的阶跃响应;(6) 计算自适应函数;(7) 用轮盘赌博法复制(繁殖)新一代的48位二进制字符串;(8) 交叉,对新一代中每对进行交叉操作,交叉位置随机产生;(9) 变异,依据变异概率对新一代所以成员进行变异操作;(10) 反转,依据反转概率对新一代所以成员进行反转操作;(11) 预选,依据预选概率对新一代所以成员进行反转操作;(12) 存储老一代中自适应值高的使之成为新一代;(13) 重复(3)~(12),迭代直至结果被接受。

在程序中,不同的性能指标可以选择,如误差的平方时间加权的积分。

通过改变性能指标组合或增加一些系数来改变那些不完全满足要求的成员的适应值。

四、数值例子在这里研究者共做了四个数值例子。

使用了ZN 和遗传两种算法,对于遗传算法每个例子分别又使用了三个性能指标函数:)0.1c -where ))(r c 40==s c J ITSE J ISE J (和(、。

(注:由于论文中只是指出了c J 的表达式,其他数据都是取自于其他论文。

所以在后面的数值仿真中,本文只使用自适应函数为c J 来进行实现PID 参数整定。

)Example 2 )]44.01)(3.01/[()(33.02S S e S P S ++=-;研究者的数值结果详见附录参考文献。

本人对文中第二个例子进行了仿真:样本个数为30,采用二进制编码方式,交叉概率:Pc=0.6,变异概率:Pm=0.001,种群大小M=30,终止迭代进化次数G=100。

得到最佳样本Bests=[10111001];最终PID 参数整定为Ki=15.5816;Ki=0.9912;Kd=0.7136。

图1为系统阶跃响应,图2为目标函数J 的优化过程。

五、结论通过对仿真结果的对比,发现GA 得到的结果总是好于ZN 。

GA 成功的降低了不希望的超调量并且达到较少的上升和稳定时间。

可以有效的解释作者提出的工作指标效果更好,在例1和例2中得到了充分的体现。

图1 带延迟的二阶系统的阶跃响应图2 目标函数J的优化过程MATLAB主程序:%基于GA(Generic Algorithm)算法的PID参数整定clear all;close all;global rin yout timefG=100;%迭代次数Size=30;%种群大小CodeL=10;%编码长度/3MinX(1)=zeros(1);MaxX(1)=20*ones(1);MinX(2)=zeros(1);MaxX(2)=1.0*ones(1);MinX(3)=zeros(1);MaxX(3)=1.0*ones(1);E=round(rand(Size,3*CodeL)); %初始化编码BsJ=0;for kg=1:1:Gtime(kg)=kg;for s=1:1:Size %译码m=E(s,:);y1=0;y2=0;y3=0;m1=m(1:1:CodeL);for i=1:1:CodeLy1=y1+m1(i)*2^(i-1);endKpid(s,1)=(MaxX(1)-MinX(1))*y1/1023+MinX(1);m2=m(CodeL+1:1:2*CodeL);for i=1:1:CodeLy2=y2+m2(i)*2^(i-1);endKpid(s,2)=(MaxX(2)-MinX(2))*y2/1023+MinX(2);m3=m(2*CodeL+1:1:3*CodeL);for i=1:1:CodeLy3=y3+m3(i)*2^(i-1);endKpid(s,3)=(MaxX(3)-MinX(3))*y3/1023+MinX(3);%****** 第一步1 : 评估个体BestJ(个体编码)****** Kpidi=Kpid(s,:);[Kpidi,BsJ]=pidzd(Kpidi,BsJ); %调用M文件BsJi(s)=BsJ;end[OderJi,IndexJi]=sort(BsJi);BestJ(kg)=OderJi(1);BJ=BestJ(kg);Ji=BsJi+1e-10;fi=1./Ji;[Oderfi,Indexfi]=sort(fi);Bestfi=Oderfi(Size);BestS=Kpid(Indexfi(Size),:);Bestfi=Oderfi(Size);BestS=E(Indexfi(Size),:);kgBJBestS;%****** 第二步: 选择和复制操作n****** fi_sum=sum(fi);fi_Size=(Oderfi/fi_sum)*Size;fi_S=floor(fi_Size);kk=1;for i=1:1:Sizefor j=1:1:fi_S(i)TempE(kk,:)=E(Indexfi(i),:);kk=kk+1;endend%************ 第三步:交叉操作************ pc=0.60;n=ceil(20*rand);for i=1:2:(Size-1)temp=rand;if pc>temp %交叉条件for j=n:1:20TempE(i,j)=E(i+1,j);TempE(i+1,j)=E(i,j);endendendTempE(Size,:)=BestS;E=TempE;%************ 第四步: 变异操作************** pm=0.001-[1:1:Size]*(0.001)/Size;for i=1:1:Sizefor j=1:1:3*CodeLtemp=rand;if pm>temp %变异条件if TempE(i,j)==0TempE(i,j)=1;elseTempE(i,j)=0;endendendendTempE(Size,:)=BestS;E=TempE;%******************************************************* endBestfi %最大适应值BestS %最佳个体编码Kpidi %参数整定结果Best_J=BestJ(G)%迭代最后种群规模figure(1);plot(time,BestJ);%种群规模随时间的变化xlabel('Times');ylabel('Best_J');figure(2);plot(timef,rin,'r',timef,yout,'b');xlabel('Time(s)');ylabel('rin,yout');%单位阶跃响应子程序:function [Kpidi,BsJ]=pidzd (Kpidi,BsJ)global rin yout timefts=0.001;%采样时间sys=tf(12.5,[1,2.58,12.5]);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=1000;for k=1:1:Ptimef(k)=k*ts;r(k)=rin;u(k)=Kpidi(1)*x(1)+Kpidi(2)*x(2)+Kpidi(3)*x(3); %控制规律if u(k)>=10u(k)=10;endif u(k)<=-10u(k)=-10;endyout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2; %差分方程形式error(k)=r(k)-yout(k); %控制方案%------------ 返回PID参数-------------u_2=u_1;u_1=u(k);y_2=y_1;y_1=yout(k);x(1)=error(k); % 计算Px(2)=(error(k)-error_1)/ts; % 计算D 微分x(3)=x(3)+error(k)*ts; % 计算I 积分error_2=error_1;error_1=error(k);if s==0if yout(k)>0.95&yout(k)<1.05tu=timef(k);s=1;endendendfor i=1:1:PJi(i)=0.999*abs(error(i))+0.01*u(i)^2*0.1;B=B+Ji(i);if i>1erry(i)=yout(i)-yout(i-1);if erry(i)<0B=B+100*abs(erry(i));endendendBsJ=B+0.2*tu*10;plot(time,BestJ);%种群规模随时间的变化xlabel('Times');ylabel('Best_J');figure(2);plot(timef,rin,'r',timef,yout,'b');xlabel('Time(s)');ylabel('rin,yout');%单位阶跃响应。

相关主题