此示例显示如何使用双延迟深度确定性策略梯度(TD3)加固学习算法调整PI控制器。将调谐控制器的性能与使用使用的控制器的性能进行比较控制系统调谐器应用程序。使用控制系统调谐器应用程序在Simulink®中调整控制器需要Simul金宝appink Control Design™软件。
对于具有少量可调参数的相对简单的控制任务,与基于型号的RL的方法相比,基于模型的调谐技术可以通过更快的调谐过程获得良好的结果。然而,RL方法可以更适合于高度非线性系统或自适应控制器调谐。
为了便于控制器比较,调整方法都使用线性二次高斯(LQG)目标函数。
此示例使用强化学习(RL)代理来计算PI控制器的增益。有关用神经网络控制器替换PI控制器的示例,请参阅创建Simul金宝appink环境和培训代理。
该示例的环境模型是水箱模型。该控制系统的目标是将罐中的水平保持在匹配参考值。
Open_System('watertanklqg')
该模型包括具有方差的过程噪声 。
保持水位,同时最大限度地减少控制努力你
,此示例中的控制器使用以下LQG标准。
要在此模型中模拟控制器,必须指定模拟时间TF.
和控制器采样时间TS.
马上。
ts = 0.1;tf = 10;
有关水箱模型的更多信息,请参阅Watertank 金宝appSimulink模型(金宝appSimulink Control Design)。
在Simulink中调整控制器使用金宝app控制系统调谐器,您必须将控制器块指定为调谐块,并定义调整过程的目标。有关使用的更多信息控制系统调谐器, 看使用控制系统调谐器调整控制系统(金宝appSimulink Control Design)。
在此示例中,打开已保存的会话ControlSystemTunersession.mat.
使用控制系统调谐器。此会话指定PID控制器块watertanklqg.
模型作为调谐块,包含LQG调整目标。
ControlSystemTuner(“ControlSystemtunersession”)
调整控制器,在调整选项卡,单击调。
调谐比例和整数增益分别为9.8和1E-6。
kp_cst = 9.80199999804512;ki_cst = 1.00019996230706e-06;
要定义用于训练RL代理的模型,请使用以下步骤修改水箱模型。
删除PID控制器。
插入RL代理程序块。
创建观察向量 在哪里 那 是坦克的高度,和 是参考高度。将观察信号连接到RL代理块。
定义RL代理的奖励函数作为消极的LQG成本,即 。RL代理最大化此奖励,从而最大限度地降低LQG成本。
得到的模型是rlwatertankpidtune.slx.
。
mdl ='rlwatertankpidtune';Open_System(MDL)
创建环境界面对象。为此,使用localcreatepidenv.
此示例结束时定义的功能。
[Env,Obsinfo,Actinfo] = LocalCreatePidenV(MDL);
提取此环境的观察和动作尺寸。
numobservations = Obsinfo.dimension(1);数量= prod(Actinfo.dimension);
修复随机发生器种子以进行再现性。
RNG(0)
考虑到观察,TD3代理决定使用演员表示采取的行动。要创建演员,首先使用观察输入和动作输出创建深度神经网络。有关更多信息,请参阅RLDETerminyActorRepresentation
。
您可以将PI控制器绘制为具有一个完全连接的图层的神经网络,错误和错误积分观察。
这里:
你
是演员神经网络的输出。
kp.
和ki.
是神经网络权重的绝对值。
那 是坦克的高度,和 是参考高度。
梯度下降优化可以将权重驱动到负值。为了避免负重,更换正常全康统计层
与A.全康统计服务
。该层可确保通过实现该功能来重量是积极的
。该层定义在全康统计场
。
initialgain =单([1e-3 2]);ActorNetWork = [FeatureInputLayer(NumObServations,'正常化'那'没有任何'那'名称'那'状态')全康校准(initialgain,'行动')];ACTOROPTIONS = RLREPRESENTATIONOPTIONS('学习',1e-3,'gradientthreshold',1);Actor = RLDETerminyActorRepresentation(Actornetwork,Obsinfo,Actinfo,......'观察',{'状态'},'行动',{'行动'},ActorOptions);
TD3代理近似于使用两个批评值函数表示给出的长期奖励给出的观察和行动。要创建批评者,首先创建一个具有两个输入,观察和动作的深神经网络,以及一个输出。有关创建深度神经网络值函数表示的更多信息,请参阅创建策略和值函数表示。
要创建批评者,请使用localcreatecridnetwork
此示例结束时定义的功能。使用相同的网络结构来批评批评者表示。
批判性= localCreateCriticnetwork(numobservations,numactions);批评= rlrepresentationOptions('学习',1e-3,'gradientthreshold',1);批评1 = rlqvaluerepresentation(批评,obsinfo,actinfo,......'观察'那'状态'那'行动'那'行动',批评);批评2 = rlqvalueerepresentation(批评,obsinfo,Actinfo,......'观察'那'状态'那'行动'那'行动',批评);评论家= [批评1批评2];
使用以下选项配置代理。
设置代理以使用控制器采样时间TS.
。
将迷你批量大小设置为128体验样本。
将体验缓冲区长度设置为1E6。
设置探索模型和目标策略平滑模型,使用具有0.1的方差的高斯噪声。
使用TD3代理选项使用rltd3agentoptions.
。
Agentopts = RLTD3AGENTOPTIONS(......'采样时间',ts,......'minibatchsize',128,......'经验BufferLength',1E6);Adstopts.expliationModel.StandardDeviation = SQRT(0.1);代理.targetpolicysmoothmodel.standardDeviation = SQRT(0.1);
使用指定的Actor表示,批评者表示和代理选项创建TD3代理。有关更多信息,请参阅rltd3agentoptions.
。
代理= rltd3agent(演员,评论家,代理商);
要培训代理,请先指定以下培训选项。
最多运行每个培训1000
剧集,每一集最多持续100
时间步骤。
显示集中管理器中的培训进度(设置绘图
选项)并禁用命令行显示(设置verb
选项)。
当代理收到超过100个连续发作的平均累积奖励超过-355时停止训练。此时,药剂可以控制罐中的水平。
有关更多信息,请参阅rltringOptions.
。
maxepisodes = 1000;maxsteps = ceil(tf / ts);训练= rltrainingOptions(......'maxepisodes',maxepisodes,......'maxstepperepisode',maxsteps,......'scoreaveragingwindowlength',100,......'verbose',错误的,......'plots'那'培训 - 进步'那......'stoptrinaincriteria'那'AverageReward'那......'stoptriningvalue',-355);
使用该代理商培训火车
功能。培训此代理是一个计算密集型进程,需要几分钟才能完成。要在运行此示例的同时节省时间,请通过设置加载预制代理用圆形
至错误的
。训练代理人,套装用圆形
至真的
。
dotraining = false;如果用圆形%训练代理人。Trainstats =火车(代理,env,训练);别的%负载净化代理。加载('watertankpidtd3.mat'那'代理人')结尾
通过仿真验证学习代理针对模型。
Simopts = RlsimulationOptions('maxsteps',maxsteps);体验= SIM(ENV,Agent,Simopts);
PI控制器的积分和比例增益是actor表示的绝对权重。为了获得权重,首先从演员提取学习参数。
Actor = GetAttor(代理);参数= GetLearnableParameters(演员);
获取控制器收益。
ki = abs(参数{1}(1))
ki =单身的0.3958
kp = abs(参数{1}(2))
kp =单身的8.0822
将从RL代理获得的增益应用于原始PI控制器块,并运行步进响应仿真。
mdltest ='watertanklqg';Open_System(MDLTEST);set_param([mdltest'/ pid控制器'],'P',num2str(kp))set_param([mdltest'/ pid控制器'],'一世',num2str(ki)sim(mdltest)
提取用于模拟的步骤响应信息,LQG成本和稳定性余量。计算稳定性余量,使用localstabilityanalysis.
此示例结束时定义的功能。
rlstep = simout;rlcost =成本;rlstabilitymargin = localstabilityanysis(mdltest);
应用使用的收益控制系统调谐器到原始PI控制器块并运行步进响应仿真。
set_param([mdltest'/ pid控制器'],'P',num2str(kp_cst))set_param([mdltest'/ pid控制器'],'一世',num2str(ki_cst))sim(mdltest)cststep = simout;cstcost =成本;CststabilityMargin = localstabilityAnalysis(mdltest);
绘制每个系统的步骤响应。
图绘图(CSTSTEP)保持上绘图(RLSTEP)网格上传奇('控制系统调谐器'那'rl'那'地点'那'东南') 标题('逐步回应')
分析两种模拟的步骤响应。
rlstepinfo = stepInfo(rlstep.data,rlstep.time);cststepinfo = stepinfo(cststep.data,cststep.time);stepInfoTable = struct2table([cststepinfo rlstepinfo]);stepInfoTable = removeVars(步骤可防护,{......'setlingmin'那'setlingmax'那'underhoot'那'高峰时段'});stepinfotable.properties.ropordames = {'控制系统调谐器'那'rl'};步骤可动画
stepInfotable =.2×4表立季Setlingtime过冲峰________ _____________________ ______控制系统调谐器0.77322 1.3594 0.33125 9.9023 RL 0.97617 1.7408 0.40451 10.077
分析两种模拟的稳定性。
稳定性argintable = struct2table([cststilitymargin rlstilitymargin]);愚蠢的argintable = removevars(稳定性argintable,{......“Gmfrequency”那'pmfrequency'那'delaymargin'那'dmfrequency'});愚蠢的argintable.properties.rowname = {'控制系统调谐器'那'rl'};稳定性
稳定性达尔=2×3表GainMargin Phasemargin稳定__________ ___________ ______控制系统调谐器8.1616 84.122 TRUE RL 9.9226 84.241真实
比较两个控制器的累积LQG成本。RL调谐控制器产生稍微最佳的解决方案。
rlcumulativecost = sum(rlcost.data)
rlcumulativecost = -375.9135.
cstcumulativecost = sum(cstcost.data)
cstcumulativecost = -376.9373.
两个控制器都会产生稳定的响应,使用控制器使用控制系统调谐器产生更快的反应。然而,RL调谐方法产生更高的增益余量和更优化的解决方案。
功能创建水箱RL环境。
功能[Env,Obsinfo,Actinfo] = LocalCreatePidenV(MDL)%定义观察规范ObsInfo和Action规范Actinfo。Obsinfo = rlnumericspec([2 1]);ObsInfo.name =.'观察';Obsinfo.description =.'集成错误和错误';Actinfo = rlnumericspec([1 1]);Actinfo.name =.'PID输出';%构建环境界面对象。ent = rl金宝appsimulinkenv(mdl,[mdl'/ rl代理'],Obsinfo,Actinfo);%设置一个伪复位函数,随机化模型的参考值。env.resetfcn = @(in)localresetfcn(in,mdl);结尾
在每一集开始时随机化水箱的参考信号和初始高度。
功能在= localresetfcn(in,mdl)%随机化参考信号blk = sprintf([mdl'/期望的\ nwater等级']);href = 10 + 4 *(兰德-0.5);在= setBlockParameter(IN,BLK,'价值',num2str(href));%随机化初始高度hinit = 0;blk = [mdl'/水箱系统/ h'];在= setBlockParameter(IN,BLK,'初始条件',num2str(hinit));结尾
Siso水箱系统的线性化和计算稳定性边缘的功能。
功能边缘= localstabilitysanysis(mdl)io(1)= linio([mdl'/ sum1'],1,'输入');IO(2)= LINIO([MDL'/水箱系统'],1,'openOutput');OP = OperPoint(MDL);op.time = 5;Linsys =线性化(MDL,IO,OP);边缘= allmargin(linsys);结尾
创建批评网络的功能。
功能批判性= localCreateCriticnetwork(numobservations,numicatess)endicath = [featureInputLayer(numobservations,'正常化'那'没有任何'那'名称'那'状态')全连接列(32,'名称'那'fc1')];ActionPath = [featuredupputlayer(nations,'正常化'那'没有任何'那'名称'那'行动')全连接列(32,'名称'那'fc2')];commonpath = [concatenationLayer(1,2,'名称'那'concat')剥离('名称'那'Relubody1')全连接列(32,'名称'那'fcbody')剥离('名称'那'Relubody2')全康连接层(1,'名称'那'qvalue')];批判性= layergraph();批评网络= addlayers(批判性,州路径);批评网络= addlayers(批判性,ActionPath);批评网络= addlayers(批判性,commonpath);批评网络= ConnectLayers(批评者,'fc1'那'concat / In1');批评网络= ConnectLayers(批评者,'fc2'那'concat / In2');结尾