这个例子展示了如何使用双延迟深度确定性策略梯度(TD3)强化学习算法调优PI控制器。将调谐控制器的性能与使用调谐控制器的性能进行了比较控制系统调谐器应用程序。控制系统调谐器应用程序调整控制器在Simulink®需要Simuli万博1manbetxnk控制设计™软件。
对于具有少量可调参数的相对简单的控制任务,基于模型的调优技术与基于无模型的rl方法相比,可以获得更好的结果,并且具有更快的调优过程。然而,RL方法更适合于高度非线性系统或自适应控制器调优。
为了便于控制器的比较,两种调优方法都使用了线性二次高斯(LQG)目标函数。
本例使用强化学习(RL)代理来计算PI控制器的增益。有关用神经网络控制器替换PI控制器的示例,请参见创建Simul万博1manbetxink环境和训练代理.
本例的环境模型是一个水箱模型。该控制系统的目标是保持水箱中的水位与参考值相匹配。
open_system (“watertankLQG”)
该模型包含有方差的过程噪声 .
保持水位,同时尽量减少控制工作u
,本例中的控制器使用以下LQG准则。
要模拟该型号的控制器,必须指定仿真时间特遣部队
和控制器采样时间Ts
在几秒钟内。
Ts = 0.1;Tf = 10;
有关水箱模型的更多信息,请参见水箱Simulink万博1manbetx模型(万博1manbetxSimulink控制设计).
在Simulink中使用万博1manbetx控制系统调谐器,您必须将控制器块指定为调优块,并为调优过程定义目标。有关使用的更多信息控制系统调谐器,请参阅使用控制系统调谐器调优控制系统(万博1manbetxSimulink控制设计).
对于本例,打开保存的会话ControlSystemTunerSession.mat
使用控制系统调谐器.的PID控制器块watertankLQG
模型作为一个调优块,并包含一个LQG调优目标。
controlSystemTuner (“ControlSystemTunerSession”)
要调优控制器,请在调优选项卡上,单击调优.
调谐的比例增益和积分增益分别约为9.8和1e-6。
Kp_CST = 9.80199999804512;Ki_CST = 1.00019996230706e-06;
要定义训练RL代理的模型,请按照以下步骤修改水箱模型。
删除PID控制器。
插入RL Agent块。
创建观察向量 在哪里 , 是水箱的高度,和 是参考高度。将观察信号连接到RL代理块。
定义RL代理的奖励函数为负LQG代价的,即 .RL代理最大化这个奖励,从而最小化LQG成本。
得到的模型是rlwatertankPIDTune.slx
.
mdl =“rlwatertankPIDTune”;open_system (mdl)
创建环境接口对象。要做到这一点,请使用localCreatePIDEnv
在本例末尾定义的函数。
[env,obsInfo,actInfo] = localCreatePIDEnv(mdl);
提取该环境的观察和操作维度。
numObservations = obsInfo.Dimension(1);numActions = prod(actInfo.Dimension);
固定随机生成器种子的再现性。
rng (0)
给定观察结果,TD3代理使用参与者表示决定采取何种操作。为了创建行动者,首先创建一个带有观察输入和动作输出的深度神经网络。有关更多信息,请参见rlDeterministicActorRepresentation
.
你可以将PI控制器建模为一个具有误差和误差积分观测的全连接层的神经网络。
在这里:
u
是行动者神经网络的输出。
Kp
而且Ki
是神经网络权值的绝对值。
, 是水箱的高度,和 是参考高度。
梯度下降优化可以使权重变为负值。为了避免负权重,请替换正权重fullyConnectedLayer
与一个fullyConnectedPILayer
.该层通过实现函数确保权重为正
.该层定义在fullyConnectedPILayer.m
.
initialGain = single([1e-3 2]);actorNetwork = [featureInputLayer(numObservations,“归一化”,“没有”,“名字”,“状态”) fullyConnectedPILayer (initialGain“行动”));actorOptions = rlRepresentationOptions(“LearnRate”1 e - 3,“GradientThreshold”1);actor = rlDeterministicActorRepresentation(actorNetwork,obsInfo,actInfo,...“观察”,{“状态”},“行动”,{“行动”}, actorOptions);
TD3代理使用两个临界值-函数表示来近似给定观察和操作的长期奖励。要创建评论,首先要创建一个深度神经网络,它有两个输入,观察和行动,以及一个输出。有关创建深度神经网络值函数表示的更多信息,请参见创建策略和值函数表示.
要创建评论,请使用localCreateCriticNetwork
在本例末尾定义的函数。使用相同的网络结构来表示这两种评论。
criticNetwork = localCreateCriticNetwork(numObservations,numActions);criticOpts = rlRepresentationOptions(“LearnRate”1 e - 3,“GradientThreshold”1);critic1 = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,...“观察”,“状态”,“行动”,“行动”, criticOpts);critic2 = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,...“观察”,“状态”,“行动”,“行动”, criticOpts);批评家= [critic1 critic2];
使用以下选项配置代理。
设置代理使用控制器采样时间Ts
.
设置小批量大小为128个经验样品。
设置经验缓冲长度为1e6。
将探索模型和目标策略平滑模型设置为方差为0.1的高斯噪声。
使用指定TD3代理选项rlTD3AgentOptions
.
agentOpts = rlTD3AgentOptions(...“SampleTime”Ts,...“MiniBatchSize”, 128,...“ExperienceBufferLength”1 e6);agentoptions . explorationmodel . variance = 0.1;agentopt . targetpolicysmoothmodel . variance = 0.1;
使用指定的参与者表示、评论家表示和代理选项创建TD3代理。有关更多信息,请参见rlTD3AgentOptions
.
agent = rlTD3Agent(actor,批评家,agentOpts);
要培训代理,首先指定以下培训选项。
每次训练最多跑一次1000
集,每集不超过1集00
时间的步骤。
在“插曲管理器”中显示培训进度(设置情节
选项)并禁用命令行显示(设置详细的
选项)。
当智能体在连续100集中获得的平均累积奖励大于-355时停止训练。此时,药剂可以控制水箱中的水位。
有关更多信息,请参见rlTrainingOptions
.
Maxepisodes = 1000;maxsteps = ceil(Tf/Ts);trainOpts = rlTrainingOptions(...“MaxEpisodes”maxepisodes,...“MaxStepsPerEpisode”maxsteps,...“ScoreAveragingWindowLength”, 100,...“详细”假的,...“阴谋”,“训练进步”,...“StopTrainingCriteria”,“AverageReward”,...“StopTrainingValue”, -355);
培训代理使用火车
函数。训练这个代理是一个计算密集型的过程,需要几分钟才能完成。为了在运行此示例时节省时间,请通过设置加载预训练的代理doTraining
来假
.要亲自训练特工,请设置doTraining
来真正的
.
doTraining = false;如果doTraining培训代理。trainingStats = train(agent,env,trainOpts);其他的为示例加载预训练的代理。负载(“WaterTankPIDtd3.mat”,“代理”)结束
通过仿真验证所学习的智能体与模型的关系。
simOpts = rlSimulationOptions(“MaxSteps”, maxsteps);experiences = sim(env,agent,simOpts);
PI控制器的积分增益和比例增益是参与者表示的绝对权重。为了获得权重,首先从参与者中提取可学习的参数。
actor = getActor(代理);参数= getLearnableParameters(actor);
获取控制器增益。
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 = localStabilityAnalysis(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);
画出每个系统的阶跃响应。
figure plot(cstStep) hold住在情节(rlStep)网格在传奇(“控制系统调谐器”,“RL”,“位置”,“东南”)标题(的阶跃响应)
分析两种模拟的阶跃响应。
rlStepInfo = stepinfo(rlStep.Data,rlStep.Time);cstStepInfo = stepinfo(cstStep.Data,cstStep.Time);stepInfoTable = struct2table([cstStepInfo rlStepInfo]);stepInfoTable = removevars(stepInfoTable,{...“SettlingMin”,“SettlingMax”,“脱靶”,“PeakTime”});stepInfoTable.Properties.RowNames = {“控制系统调谐器”,“RL”};stepInfoTable
stepInfoTable =2×5表RiseTime TransientTime SettlingTime超调峰________ _____________ ____________ _________ ______ Control System Tuner 0.77737 1.3594 1.3278 0.33125 9.9023 RL 0.98024 1.7408 1.7073 0.40451 10.077
分析两个模拟的稳定性。
stabitymargintable = struct2table([cstStabilityMargin rlStabilityMargin]);stabitymargintable = removevars(stabitymargintable,{...“GMFrequency”,“PMFrequency”,“DelayMargin”,“DMFrequency”});stabitymargintable . properties . rownames = {“控制系统调谐器”,“RL”};stabilityMarginTable
stabilityMarginTable =2×3表GainMargin PhaseMargin稳定__________ ___________ ______控制系统调谐器8.1616 84.124 true RL 9.9226 84.242 true
比较两个控制器的累计LQG成本。rl调优控制器产生一个稍微更优的解决方案。
rlCumulativeCost = sum(rlCost.Data)
rlCumulativeCost = -375.9135
cstCumulativeCost = sum(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 = rl万博1manbetxSimulinkEnv(mdl,[mdl .' / RL代理', obsInfo actInfo);设置自定义重置函数,该函数将模型的参考值随机化。env。ResetFcn = @ localResetFcn(in,mdl);结束
函数随机参考信号和初始高度的水箱在每集开始。
函数in = localResetFcn(in,mdl)随机化参考信号BLK = sprintf([mdl .'/期望水位']);hRef = 10 + 4*(rand-0.5);in = setBlockParameter(in,blk,“价值”num2str (hRef));%随机初始高度hInit = 0;BLK = [mdl .“水箱系统/ H”];in = setBlockParameter(in,blk,“InitialCondition”num2str (hInit));结束
函数用于线性化和计算SISO水箱系统的稳定裕度。
函数margin = localStabilityAnalysis(mdl) io(1) = linio([mdl' / Sum1 '), 1“输入”);Io (2) = linio([mdl ./水箱系统的), 1“openoutput”);Op = operpoint(mdl);op.Time = 5;Linsys =线性化(mdl,io,op);Margin = allmargin(linsys);结束
功能创建评论家网络。
函数criticNetwork = localCreateCriticNetwork(numObservations,numActions) statePath = [featureInputLayer(numObservations, numActions)“归一化”,“没有”,“名字”,“状态”) fullyConnectedLayer (32,“名字”,“fc1”));actionPath = [featureInputLayer(numActions,“归一化”,“没有”,“名字”,“行动”) fullyConnectedLayer (32,“名字”,“取得”));commonPath = [concatenationLayer(1,2,“名字”,“concat”) reluLayer (“名字”,“reluBody1”) fullyConnectedLayer (32,“名字”,“fcBody”) reluLayer (“名字”,“reluBody2”) fullyConnectedLayer (1,“名字”,“qvalue”));criticNetwork = layerGraph();criticNetwork = addLayers(criticNetwork,statePath);criticNetwork = addLayers(criticNetwork,actionPath);criticNetwork = addLayers(criticNetwork,commonPath);临界网络= connectLayers(临界网络,“fc1”,“concat /三机一体”);临界网络= connectLayers(临界网络,“取得”,“concat / in2”);结束