【MATLAB】GA优化算法整定PID控制器参数(三)—— 一阶带时延的被控对象

0背景

写在前面:
 1.本代码基于MATLAB2019a版本,低版本或者不同版本可能会报错,mdl文件或slx文件打开可能会失败;
 2.如果运行时间过长,请观察迭代次数是否有变化。
 3.本博客附上代码并详细介绍,如果转载请注明出处;
 4.如果本博客恰巧与您的研究有所关联,欢迎您的咨询qq1366196286
 5.源代码及程序文件下载链接:见评论区。


  接着上上篇博客【Simulink】PSO优化算法整定PID控制器参数(一)继续讲解本博客:【Simulink】GA优化算法整定PID控制器参数(三)—— 一阶带时延的被控对象

1遗传算法介绍与发展

1.1遗传算法的简单介绍

  遗传算法(Genetic algorithm,GA)是由J.hollland教授提出的一种将编码技术等同染色体基因的方法。首先对所需求解的变量或优化参数进行编码,在有限解集空间中进行启发式搜索;其次利用目标函数进行适应度计算,其中遗传算子的寻优规则是由概率所决定的;最后通过选择、交叉和变异多次迭代出最优解。遗传算法因其流程简单,适合复杂问题的优化在许多领域诸如参数整定、目标寻优、路径规划等得到广泛应用。GA算法应用于参数整定的基本步骤如下:
  ⑴确定编码方式并初始化种群。如设置种群迭代GEN=1,二进制编码等。
  ⑵构造目标优化函数。
  ⑶对种群中个体进行解码,并计算相应的适应度。
  ⑷判断是否达到控制要求,对种群中个体进行选择、交叉和变异来更新种群的适应度大小,多次迭代以满足控制要求。
  ⑸判断终止条件,输出最优解。如图3-1所示。

在这里插入图片描述
图3-1 遗传算法的基本操作

遗传算法的伪代码

BEGIN:
I = 0; //进化种群代数
Initialize P(I); //初始化种群
Fitness P(I); //“适者生存”遗传选择
While(not Terminate-Condition) //不满足终止条件时,循环
{
I ++; //循环
GA-Operation P(I); //遗传算法运算or操作
Fitness P(I); //“适者生存”遗传选择
}

1.2算子的操作与理解

选择(轮盘赌法)

  又可以称比例选择方法.其基本思想是:各个个体被选中的概率与其适应度大小成正比.
具体操作如下:
(1)计算出群体中每个个体的适应度f(i=1,2,…,M),M为群体大小;
(2)计算出每个个体被遗传到下一代群体中的概率;
在这里插入图片描述
(3)计算出每个个体的累积概率;
在这里插入图片描述
(4)在[0,1]区间内产生一个均匀分布的伪随机数r;
(5)若r<q[1],则选择个体1,否则,选择个体k,使得:q[k-1]<r≤q[k] 成立;

(6)重复(4)、(5)共M次

轮盘赌法代码:

/*
* 按设定的概率,随机选中一个个体
* P[i]表示第i个个体被选中的概率
*/
int RWS()
{
m =0;
r =Random(0,1); //r为0至1的随机数
for(i=1;i<=N; i++)
{
/* 产生的随机数在m~m+P[i]间则认为选中了i
* 因此i被选中的概率是P[i]
*/
m = m + P[i];
if(r<=m) return i;
}
}

在这里插入图片描述
图3-2 遗传算子的选择操作(图片来源:https://zhuanlan.zhihu.com/p/49055485)

交叉(单点交叉和多点交叉)

可以参考这篇博客遗传算法中的变异和交叉

  单点交叉又称为简单交叉,它是指在个体编码串中只随机设置一个交叉点,然后在该点相互交换两个配体个体的部分染色体。图3-3为单点交叉运算的示意图。

  多点交叉或称广义交叉,是指在个体编码串中随机设置多个交叉点,然后进行基因交换。其操作过程与单点交叉和两点交叉相类似。

在这里插入图片描述
图3-3 遗传算子的交叉操作(图片来源:https://zhuanlan.zhihu.com/p/49055485)

变异
  变异算子的基本内容是对群体中的个体串的某些基因座上的基因值作变动。依据个体编码表示方法的不同,可以有以下的算法:
  a)实值变异
  b)二进制变异。

  一般来说,变异算子操作的基本步骤如下:

  a)对群中所有个体以事先设定的变异概率判断是否进行变异
  b)对进行变异的个体随机选择变异位进行变异。

  遗传算法引入变异的目的有两个:一是使遗传算法具有局部的随机搜索能力。当遗传算法通过交叉算子已接近最优解邻域时,利用变异算子的这种局部随机搜索能力可以加速向最优解收敛。显然,此种情况下的变异概率应取较小值,否则接近最优解的积木块会因变异而遭到破坏。二是使遗传算法可维持群体多样性,以防止出现未成熟收敛现象。此时收敛概率应取较大值。

  遗传算法中,交叉算子因其全局搜索能力而作为主要算子,变异算子因其局部搜索能力而作为辅助算子。遗传算法通过交叉和变异这对相互配合又相互竞争的操作而使其具备兼顾全局和局部的均衡搜索能力。所谓相互配合.是指当群体在进化中陷于搜索空间中某个超平面而仅靠交叉不能摆脱时,通过变异操作可有助于这种摆脱。所谓相互竞争,是指当通过交叉已形成所期望的积木块时,变异操作有可能破坏这些积木块。如何有效地配合使用交叉和变异操作,是目前遗传算法的一个重要研究内容。

  基本变异算子是指对群体中的个体码串随机挑选一个或多个基因座并对这些基因座的基因值做变动(以变异概率P.做变动),(0,1)二值码串中的基本变异操作如下:

  基因位下方标有*号的基因发生变异。

  变异率的选取一般受种群大小、染色体长度等因素的影响,通常选取很小

  遗传算法的值,一般取0.001-0.1。

在这里插入图片描述
图3-4 遗传算子的变异操作(图片来源:https://zhuanlan.zhihu.com/p/49055485)

1.3遗传算法的研究发展

  遗传算法最早是由美国的 Holland 教授于 1975 年在他的专著《自然界和人工系统的适应性》所提出。经过大量学者的努力研究发展,如图3-3所示。
在这里插入图片描述
图3-5 遗传算子的研究发展(图片来源:https://zhuanlan.zhihu.com/p/56299083)

2被控对象介绍

2.1带时延二阶系统的传递函数

  以下式二阶Ⅰ型时延系统的传递函数为例,运用GA算法进行PID参数优化,其中系统设置为采样时间1 ms,指令为单位阶跃信号,仿真运行时间为1.0 s。其中,性能优化函数Best_J采取时间与误差绝对值乘积的积分方程(Integral of Time Multiplied by the Absolute Value of Error,ITAE),同时为避免控制量过大而产生超调,在性能优化函数Best_J中添加PID控制器输入量的平方项。

  二阶Ⅰ型时延系统的传递函数,如下所示。可按照自己的实际系统进行设计,既可以.m文件进行编写,也可以通过Simulink仿真进行搭建。
在这里插入图片描述

在这里插入图片描述
图3-6 二阶Ⅰ型时延系统的Simulink仿真模型

2.2适应度评价函数的综述

  一共复现了以下这几种,其实原理是一样的,只是所实现的算法与适应度函数不同而已,如下所示:
在这里插入图片描述
在这里插入图片描述
  选定ITSE和ITAE进行GA算法适应度函数的设计,如下所示:
  为获取较为满意的过渡过程,采用误差绝对值时间积分性能指标作为适应度评价函数Best_J。同时为防止控制输入过大,在Best_J加入控制输入的评分项,如式(1-2)所示。

在这里插入图片描述

式(1-2)中e(t)为系统输出误差,u(t)为PID控制器输入量,ρ1,ρ2为权重值。
  为避免超调,采用罚函数对超调量进行优先处理,则如式(1-3)所示。
在这里插入图片描述

式(1-3)中ρ3>>max(ρ1,ρ2和ρ4),且y(t)为被控对象输出,ey(t)=y(t)-y(t-1)。

3PID参数整定

3.1GA算法的PID参数整定

  GA算法中种群大小设置为50,交叉概率为0.7,变异概率为0.01,ρ1=0.999,ρ2=0.01。PID控制器中比例系数Kp取值范围为[0,30],积分系数Ki取值范围为[0,1.0],微分系数KD取值范围为[0,1.0],编码方式为实数编码,并设置迭代次数100。

主函数

%GA(Generic Algorithm) Program to optimize PID Parameters
close all;
clear;
clc;

global rin yout timef

Size=50;  % 种群大小30个 可行解
CodeL=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);

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;    % 种群运行100次
BsJ=0;
sigma_data=zeros(1,G);
ts_data=zeros(1,G);

%*************** Start Running ***************
for kg=1:1:G
    time(kg)=kg;

%****** Step 1 : Evaluate BestJ ******
for i=1:1:Size
Kpidi=Kpid(i,:);  %单个可行解
    
[Kpidi,BsJ,Ts,sigma]=chap5_3f(Kpidi,BsJ);

BsJi(i)=BsJ;

end

        sigma_data(1,kg)=sigma;
        ts_data(1,kg)=Ts;
 
[OderJi,IndexJi]=sort(BsJi);
BestJ(kg)=OderJi(1);
BJ=BestJ(kg);
Ji=BsJi+1e-10;    % Avoiding deviding zero

   fi=1./Ji;
%  Cm=max(Ji);
%  fi=Cm-Ji;                     
   
   [Oderfi,Indexfi]=sort(fi);    %Arranging fi small to bigger
   Bestfi=Oderfi(Size);          %Let Bestfi=max(fi)
   BestS=Kpid(Indexfi(Size),:);  %Let BestS=E(m), m is the Indexfi belong to max(fi)
   
   kg   
   BJ
   BestS
%****** Step 2 : Select and Reproduct Operation******
   fi_sum=sum(fi);
   fi_Size=(Oderfi/fi_sum)*Size;
   
   fi_S=floor(fi_Size);                    % Selecting Bigger fi value
   r=Size-sum(fi_S);
   
   Rest=fi_Size-fi_S;
   [RestValue,Index]=sort(Rest);
   
   for i=Size:-1:Size-r+1
      fi_S(Index(i))=fi_S(Index(i))+1;     % Adding rest to equal Size
   end

   k=1;
   for i=Size:-1:1       % Select the Sizeth and Reproduce firstly  
      for j=1:1:fi_S(i)  
       TempE(k,:)=Kpid(Indexfi(i),:);      % Select and Reproduce 
         k=k+1;                            % k is used to reproduce
      end
   end
   
%************ Step 3 : Crossover Operation ************
    Pc=0.90;
    for i=1:2:(Size-1)
          temp=rand;
      if Pc>temp                      %Crossover Condition
          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;
    
%************ Step 4: Mutation Operation **************
Pm=0.10-[1:1:Size]*(0.01)/Size;       %Bigger fi,smaller Pm
Pm_rand=rand(Size,CodeL);
Mean=(MaxX + MinX)/2; 
Dif=(MaxX-MinX);

   for i=1:1:Size
      for j=1:1:CodeL
         if Pm(i)>Pm_rand(i,j)        %Mutation Condition
            TempE(i,j)=Mean(j)+Dif(j)*(rand-0.5);
         end
      end
   end
%Guarantee TempE(Size,:) belong to the best individual
   TempE(Size,:)=BestS;      
   Kpid=TempE;
   
end

Bestfi;
BestS;
Best_J = BestJ(G);

figure(1);
plot(time,BestJ);
xlabel('Times');ylabel('Best J');
title('GA算法优化PID三个参数');

figure(2);
plot(time,ts_data);
xlabel('Times');ylabel('Ts');
title('调节时间随迭代次数的变化'); 

figure(3);
plot(time,sigma_data);
xlabel('Times');ylabel('sigma');
title('超调量随迭代次数的变化');

figure(4);
plot(timef,rin,'r',timef,yout,'b');
xlabel('Time(s)');
ylabel('rin,yout');

3.2GA算法的PID参数整定仿真图

上述GA算法的PID参数整定的结果输出,如图3-7~图3-10所示。
在这里插入图片描述

图3-7 GA算法的适应度函数代价图

在这里插入图片描述

图3-8 调节时间随迭代次数的变化图
在这里插入图片描述

图3-9 超调量随迭代次数的变化图
在这里插入图片描述
图3-10 GA算法整定的结果输出图

3.3小结

1.由图3-7可知,GA算法整定PID参数是收敛的;
2.由图3-8~图3-9可知,调节时间与超调量是个矛盾量,单纯依靠单目标优化算法难以实现二者性能的最优化。**很明显可看出,在前50代超调量小,但调节时间长;在后50代调节时间下降变短,而超调量也随之上升。**为此,在后续博客中将多目标优化算法NSGA-2算法应用到此问题,用于解决这种不可调和的矛盾。
3.图3-10可知,最终整定优化所得的结果拥有极小的超调,且较快的响应速度。同时,GA算法在上述参数设置下耗时也较短。

4参考文献

[1]邓春燕. 遗传算法的交叉算子分析[J]. 农业网络信息, 2009(5):124-126.
[2]葛继科,邱玉辉,吴春明,蒲国林.遗传算法研究综述[J].计算机应用研究,2008(10):2911-2916.


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昔时扬尘处

你的鼓励会让技术更加具有价值!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值