这个例子展示了如何使用双延迟深度确定性策略梯度(TD3)强化学习算法来调整PI控制器。将调谐控制器的性能与用该方法调谐的控制器的性能进行了比较控制系统调谐器应用程序使用。控制系统调谐器应用程序在Simulink®中调优控制器需要Simul金宝appink Control Design™软件。
对于具有少量可调参数的相对简单的控制任务,基于模型的调优技术与基于模型的rl方法相比,可以获得较好的效果,且调优过程更快。然而,RL方法更适合于高度非线性系统或自适应控制器整定。
为了便于控制器的比较,两种整定方法都使用线性二次高斯(LQG)目标函数。
这个例子使用了一个强化学习(RL)代理来计算PI控制器的增益。关于用神经网络控制器代替PI控制器的例子,请参见创建Simul金宝appink环境并训练Agent.
本例中的环境模型是水箱模型。该控制系统的目标是保持水箱中的水位与参考值相匹配。
open_system (“watertankLQG”)
该模型包含带方差的过程噪声 .
在尽量减少控制的同时保持水位U
,此示例中的控制器使用以下LQG标准。
要在此模型中模拟控制器,您必须指定模拟时间特遣部队
以及控制器采样时间Ts
几秒钟之内。
Ts=0.1;Tf=10;
有关水箱型号的更多信息,请参见水箱Simulink金宝app模型(金宝appSimulink控制设计).
在Simulink中使用金宝app控制系统调谐器,则必须将控制器块指定为调优块,并定义调优过程的目标。,以获取更多使用信息控制系统调谐器看见使用控制系统调谐器调整控制系统(金宝appSimulink控制设计).
对于本例,请打开保存的会话ControlSystemTunerSession.mat
使用控制系统调谐器.中的PID Controller块watertankLQG
模型作为调优块,并包含一个LQG调优目标。
controlSystemTuner (“ControlSystemTunerSession”)
调整控制器,在调优选项卡,单击曲调.
调谐的比例增益和积分增益分别约为9.8和1e-6。
Kp_CST=9.801999804512;Ki_CST=1.00019996230706e-06;
为了定义训练RL agent的模型,请按照以下步骤修改水箱模型。
删除PID控制器。
插入RL Agent块。
创建观测向量 在哪里 , 是油箱的高度,以及 为参考高度。将观测信号连接到RL Agent块。
将RL代理的奖励函数定义为负LQG成本,即 .RL代理使这种回报最大化,从而使LQG成本最小化。
由此产生的模型是rlwatertankPIDTune.slx
.
mdl =“rlwatertankPIDTune”;open_system (mdl)
创建环境接口对象。要做到这一点,使用localCreatePIDEnv
本例末尾定义的函数。
[env, obsInfo actInfo] = localCreatePIDEnv (mdl);
提取该环境的观察和行动维度。
numObservations=obsInfo.Dimension(1);数量=产品(活动尺寸);
修复随机生成器种子的再现性。
rng (0)
根据观察结果,TD3代理使用参与者表示来决定采取哪个动作。为了创建参与者,首先创建一个具有观测输入和动作输出的深度神经网络。有关更多信息,请参见rlDeterministicActorRepresentation
.
您可以将PI控制器建模为具有误差和误差积分观测的全连接层的神经网络。
在这里:
U
为actor神经网络的输出。
Kp
和Ki
为神经网络权值的绝对值。
, 是油箱的高度,以及 为参考高度。
梯度下降优化可以使权值为负值。为了避免负权重,请替换正常权重完全连接层
与一个完全连接的Pilayer
.这一层通过实现函数确保权重为正
.这个层定义在完全连接的Pilayer.m
.
初始增益=单个([1e-3-2]);actorNetwork=[featureInputLayer(numObservations,“归一化”,“没有”,“姓名”,“状态”)完全连接的Pilayer(初始增益,“行动”));actorOptions = rlRepresentationOptions (“LearnRate”1 e - 3,“梯度阈值”1);演员= rlDeterministicActorRepresentation (actorNetwork obsInfo actInfo,...“观察”, {“状态”},“行动”, {“行动”}, actorOptions);
TD3代理使用两个临界值函数表示来近似给定观察和行动的长期回报。要创建批评者,首先创建一个具有两个输入、观察和行动以及一个输出的深度神经网络。有关创建深度神经网络值函数表示的更多信息,请参见创建策略和价值功能表示.
要创造批评家,就要使用localCreateCriticNetwork
本例末尾定义的函数。对两种表示使用相同的网络结构。
criticNetwork = localCreateCriticNetwork (numObservations numActions);criticOpts = rlRepresentationOptions (“LearnRate”1 e - 3,“梯度阈值”,1);临界C1=rlQValueRepresentation(临界网络、obsInfo、actInfo、,...“观察”,“状态”,“行动”,“行动”,criticOpts);critic2=rlQValueRepresentation(criticNetwork、obsInfo、actInfo、,...“观察”,“状态”,“行动”,“行动”,criticOpts);批评家=[critic1 critic2];
使用以下选项配置代理。
设置代理使用控制器样本时间Ts
.
设置小批量尺寸为128个经验样品。
设置体验缓冲区长度为1e6。
设置探索模型和目标政策平滑模型,使用方差为0.1的高斯噪声。
使用指定TD3代理选项rlTD3AgentOptions
.
agentOpts = rlTD3AgentOptions (...“SampleTime”Ts,...“MiniBatchSize”, 128,...“经验缓冲长度”1 e6);agentOpts.ExplorationModel.Variance = 0.1;agentOpts.TargetPolicySmoothModel.Variance = 0.1;
使用指定的参与者表示、评论家表示和代理选项创建TD3代理。有关更多信息,请参见rlTD3AgentOptions
.
代理= rlTD3Agent(演员、评论家、agentOpts);
要培训代理,首先指定以下培训选项。
每次训练最多进行一次1000
剧集,每集最多持续1集00
时间步长。
在章节管理器中显示培训进度(设置情节
选项)并禁用命令行显示(设置冗长的
选项)。
当代理连续100集获得的平均累积奖励超过-355时,停止训练。此时,代理可以控制水箱中的水位。
有关更多信息,请参见RL培训选项
.
最大事件数=1000;最大步骤数=ceil(Tf/Ts);训练选项数=RL训练选项(...“MaxEpisodes”maxepisodes,...“MaxStepsPerEpisode”,maxsteps,...“ScoreAveragingWindowLength”,100,...“详细”假的,...“情节”,“训练进步”,...“停止培训标准”,“AverageReward”,...“StopTrainingValue”, -355);
使用火车
函数。训练这个代理是一个计算密集型的过程,需要几分钟才能完成。为了节省运行此示例的时间,请通过设置加载预先训练过的代理溺爱
来错误的
.自己训练代理人,设置溺爱
来真正的
.
doTraining = false;如果溺爱培训代理商。trainingStats =火车(代理,env, trainOpts);其他的%为示例加载预训练的代理。负载(“水箱PIDTD3.mat”,“代理”)终止
通过仿真验证了该模型的有效性。
simOpts=rlSimulationOptions(“MaxSteps”, maxsteps);经验= sim (env,代理,simOpts);
PI控制器的积分增益和比例增益是参与者表示的绝对权重。为了获得权重,首先从参与者中提取可学习参数。
actor=getActor(代理);parameters=getLearnableParameters(actor);
获取控制器增益。
Ki = abs(参数{1}(1))
Ki =单0.3958
Kp = abs(参数{1}(2))
金伯利进程=单8.0822
将从RL代理获得的增益应用于原始PI控制器块,并运行阶跃响应仿真。
mdlTest=“watertankLQG”;open_system (mdlTest);set_param ([mdlTest“/PID控制器”],“P”,num2str(Kp))设置参数([mdlTest“/PID控制器”],“我”,num2str(Ki))sim(mdlTest)
为仿真提取阶跃响应信息、LQG代价和稳定裕度。要计算稳定裕度,请使用局部稳定性分析
本例末尾定义的函数。
rlStep = simout;rlCost =成本;rlStabilityMargin = localStabilityAnalysis (mdlTest);
应用所获得的收益使用控制系统调谐器,并运行阶跃响应仿真。
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(stepInfoTable{...“SettlingMin”,“SettlingMax”,“下冲”,“高峰期”});stepInfoTable.Properties.RowNames = {控制系统调谐器的,“RL”}步骤信息表
stepInfoTable =2×5表RiseTime TransientTime SettlingTime Overshoot Peak ________ _____________ ____________ _________ ______ Control System Tuner 0.77737 1.3594 1.3278 0.33125 9.9023 RL 0.98024 1.7408 1.7073 0.40451 10.077
分析两种模拟的稳定性。
stabilityMarginTable=struct2table([cstStabilityMargin rlStabilityMargin]);stabilityMarginTable=移除变量(stabilityMarginTable{...“GMFrequency”,“PMFrequency”,“延迟保证金”,“DMFrequency”});stabilityMarginTable.Properties.RowNames={控制系统调谐器的,“RL”};稳定表
stabilityMarginTable =2×3表控制系统调谐器8.1616 84.124真RL 9.9226 84.242真
比较两个控制器的累积LQG成本。RL调谐控制器产生稍微更优的解决方案。
rlCumulativeCost =总和(rlCost.Data)
rlCumulativeCost = -375.9135
cstCumulativeCost =总和(cstCost.Data)
cstCumulativeCost=-376.9373
两个控制器都产生稳定的响应,控制器使用控制系统调谐器产生更快的响应。然而,RL调谐方法产生更高的增益裕度和更优的解决方案。
功能创建水箱RL环境。
函数[env,obsInfo,actInfo]=localCreatePIDEnv(mdl)%定义观察规范obsInfo和行动规范actInfo。obsInfo=rlNumericSpec([2 1]);obsInfo.Name=“观察”;obsInfo。描述=“综合误差和误差”;actInfo = rlNumericSpec([1 1]);actInfo。Name =“PID输出”;%构建环境接口对象。env=rlSi金宝appmulinkEnv(mdl,[mdl“/RL代理”],obsInfo,actInfo);%设置一个自定义重置函数,随机化模型的参考值。env.ResetFcn=@(in)localResetFcn(in,mdl);终止
函数随机参考信号和初始高度的水箱在每集开始。
函数在= localResetFcn (mdl)%随机参考信号黑色= sprintf (mdl“/所需的\n水位”]); hRef=10+4*(rand-0.5);in=设定锁定参数(in,blk,“价值”num2str (hRef));%随机化初始高度hInit = 0;黑色= [mdl“/水箱系统/H”];在= setBlockParameter(黑色,“初始条件”num2str (hInit));终止
函数用于线性化和计算SISO水箱系统的稳定裕度。
函数margin = localStabilityAnalysis(mdl) io(1) = linio([mdl . txt]' / Sum1 '), 1“输入”);io (2) = linio (mdl“/水箱系统”), 1“openoutput”);op=操作点(mdl);op.时间=5;linsys=线性化(mdl,io,op);余量=所有余量(linsys);终止
功能创建评论网络。
函数statePath = [featureInputLayer(numObservations, numActions),“归一化”,“没有”,“姓名”,“状态”)完全连接层(32,“姓名”,“fc1”)];actionPath=[featureInputLayer(numActions,“归一化”,“没有”,“姓名”,“行动”)完全连接层(32,“姓名”,“取得”)]; commonPath=[连接层(1,2,“姓名”,“concat”)雷卢耶(“姓名”,“重新注册1”)完全连接层(32,“姓名”,“fcBody”)雷卢耶(“姓名”,“reluBody2”) fullyConnectedLayer (1,“姓名”,“qvalue”));criticNetwork = layerGraph ();criticNetwork = addLayers (criticNetwork statePath);criticNetwork = addLayers (criticNetwork actionPath);criticNetwork = addLayers (criticNetwork commonPath);criticNetwork = connectLayers (criticNetwork,“fc1”,“concat/in1”);criticNetwork = connectLayers (criticNetwork,“取得”,“concat/in2”);终止