遗传算法的参数整定报告Word格式文档下载.docx
《遗传算法的参数整定报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《遗传算法的参数整定报告Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
(4)
分别代表超调量、上升时间和稳定时间。
两个系数有用户定义或决定。
预期的性能指标的最下化可以认为是小的超调量、短的上升时间和稳定时间。
三个PID参数的编码方式如下:
、
和
都是八位二进制字符格式。
自适应函数的选择关系到性能指标,如:
(5)
实际上,
可以是任何一个能切实表达
关系的非线性函数。
遗传操作是模拟生物基因遗传的操作,从优化搜索的角度而言,遗传操作可使问题的解一代一代地优化,并逼近最优解,主要包括三个遗传算子:
选择、交叉和变异。
关于他们的具体方法这里不在赘述。
三、计算机实现
作者编程使用的事TURBOC。
程序包括两个部分:
一个是仿真PID控制系统的闭环阶跃响应;
另一个是实施对一代所有成员的遗传算法的仿真,这里遗传算法将一代作为一个整体。
在第一代生物的二进制代码随机产生之后,这个过程重复直至迭代次数达到预选的次数。
步长、PID参数范围、性能指标、自适应函数和方法得时间延迟都是从一个文件中读取。
而遗传算法的的参数,诸如世代数、交叉概率、变异概率、选择概率等通过菜单选择。
整个闭环系统仿真的完成可以用四阶龙格库塔法或直接时域计算。
在程序中,复制的实现是通过轮盘赌博法的线性搜索,面积加权于上一代成员的适应值。
交叉发生在每一对复制产生的成员。
交叉操作是将一个随机产生的一个在0到1之间数与交叉概率比较决定是否需要交叉。
如果需要交叉,则在1到47之间随机产生一个交叉位置代码。
变异,对新一代所有成员都随机产生一个0到1之间的数与变异概率比较,然后再决定是否改变代码的一位。
同理,反转也是这样判定和操作的。
另一需要说明的事,两个反转位置代码是在1~48之间随机选择的。
同样,依据随机的预选概率,预选操作是用好的后代取代不好父代。
除了这些基本操作,另一个过程叫做存储也在程序中进行,它是存储老一代适应值高的成为新一代。
程序实现过程列出如下:
(1)将
三个参数编码成二进制字符串;
(2)生成第一代成员编码成字符串;
(3)将字符串解码成三个参数:
;
(4)计算所有的传递函数;
(5)使用四阶龙格库塔仿真闭环系统的阶跃响应;
(6)计算自适应函数;
(7)用轮盘赌博法复制(繁殖)新一代的48位二进制字符串;
(8)交叉,对新一代中每对进行交叉操作,交叉位置随机产生;
(9)变异,依据变异概率对新一代所以成员进行变异操作;
(10)反转,依据反转概率对新一代所以成员进行反转操作;
(11)预选,依据预选概率对新一代所以成员进行反转操作;
(12)存储老一代中自适应值高的使之成为新一代;
(13)重复(3)~(12),迭代直至结果被接受。
在程序中,不同的性能指标可以选择,如误差的平方时间加权的积分。
通过改变性能指标组合或增加一些系数来改变那些不完全满足要求的成员的适应值。
四、数值例子
在这里研究者共做了四个数值例子。
使用了ZN和遗传两种算法,对于遗传算法每个例子分别又使用了三个性能指标函数:
。
(注:
由于论文中只是指出了
的表达式,其他数据都是取自于其他论文。
所以在后面的数值仿真中,本文只使用自适应函数为
来进行实现PID参数整定。
)
Example2
;
研究者的数值结果详见附录参考文献。
本人对文中第二个例子进行了仿真:
样本个数为30,采用二进制编码方式,交叉概率:
Pc=0.6,变异概率:
Pm=0.001,种群大小M=30,终止迭代进化次数G=100。
得到最佳样本Bests=[101110001101101111111101101101];
最终PID参数整定为
Ki=15.5816;
Ki=0.9912;
Kd=0.7136。
图1为系统阶跃响应,图2为目标函数J的优化过程。
五、结论
通过对仿真结果的对比,发现GA得到的结果总是好于ZN。
GA成功的降低了不希望的超调量并且达到较少的上升和稳定时间。
可以有效的解释作者提出的工作指标效果更好,在例1和例2中得到了充分的体现。
图1带延迟的二阶系统的阶跃响应
图2目标函数J的优化过程
MATLAB主程序:
%基于GA(GenericAlgorithm)算法的PID参数整定
clearall;
closeall;
globalrinyouttimef
G=100;
%迭代次数
Size=30;
%种群大小
CodeL=10;
%编码长度/3
MinX
(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;
forkg=1:
1:
G
time(kg)=kg;
fors=1:
Size%译码
m=E(s,:
);
y1=0;
y2=0;
y3=0;
m1=m(1:
CodeL);
fori=1:
CodeL
y1=y1+m1(i)*2^(i-1);
end
Kpid(s,1)=(MaxX
(1)-MinX
(1))*y1/1023+MinX
(1);
m2=m(CodeL+1:
2*CodeL);
y2=y2+m2(i)*2^(i-1);
Kpid(s,2)=(MaxX
(2)-MinX
(2))*y2/1023+MinX
(2);
m3=m(2*CodeL+1:
3*CodeL);
y3=y3+m3(i)*2^(i-1);
Kpid(s,3)=(MaxX(3)-MinX(3))*y3/1023+MinX(3);
%******第一步1:
评估个体BestJ(个体编码)******
Kpidi=Kpid(s,:
[Kpidi,BsJ]=pidzd(Kpidi,BsJ);
%调用M文件
BsJi(s)=BsJ;
[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),:
kg
BJ
BestS;
%******第二步:
选择和复制操作n******
fi_sum=sum(fi);
fi_Size=(Oderfi/fi_sum)*Size;
fi_S=floor(fi_Size);
kk=1;
Size
forj=1:
fi_S(i)
TempE(kk,:
)=E(Indexfi(i),:
kk=kk+1;
%************第三步:
交叉操作************
pc=0.60;
n=ceil(20*rand);
fori=1:
2:
(Size-1)
temp=rand;
ifpc>
temp%交叉条件
forj=n:
20
TempE(i,j)=E(i+1,j);
TempE(i+1,j)=E(i,j);
end
TempE(Size,:
)=BestS;
E=TempE;
%************第四步:
变异操作**************
pm=0.001-[1:
Size]*(0.001)/Size;
3*CodeL
ifpm>
temp%变异条件
ifTempE(i,j)==0
TempE(i,j)=1;
else
TempE(i,j)=0;
%*******************************************************
end
Bestfi%最大适应值
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'
Time(s)'
rin,yout'
%单位阶跃响应
子程序:
function[Kpidi,BsJ]=pidzd(Kpidi,BsJ)
ts=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;
fork=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;
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);
%控制方案
%------------返回PID参数-------------
u_2=u_1;
u_1=u(k);
y_2=y_1;
y_1=yout(k);
x
(1)=error(k);
%计算P
x
(2)=(error(k)-error_1)/ts;
%计算D微分
x(3)=x(3)+error(k)*ts;
%计算I积分
error_2=error_1;
error_1=error(k);
ifs==0
ifyout(k)>
0.95&
yout(k)<
1.05
tu=timef(k);
s=1;
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)<
B=B+100*abs(erry(i));
BsJ=B+0.2*tu*10;
THANKS!
!
致力为企业和个人提供合同协议,策划案计划书,学习课件等等
打造全网一站式需求
欢迎您的下载,资料仅供参考