主要内容

使用强化学习调优PI控制器

这个例子展示了如何使用双延迟深度确定性策略梯度(TD3)强化学习算法调优PI控制器。将调谐控制器的性能与使用调谐控制器的性能进行了比较控制系统调谐器应用程序。控制系统调谐器应用程序调整控制器在Simulink®需要Simuli万博1manbetxnk控制设计™软件。

对于具有少量可调参数的相对简单的控制任务,基于模型的调优技术与基于无模型的rl方法相比,可以获得更好的结果,并且具有更快的调优过程。然而,RL方法更适合于高度非线性系统或自适应控制器调优。

为了便于控制器的比较,两种调优方法都使用了线性二次高斯(LQG)目标函数。

本例使用强化学习(RL)代理来计算PI控制器的增益。有关用神经网络控制器替换PI控制器的示例,请参见创建Simul万博1manbetxink环境和训练代理

环境模型

本例的环境模型是一个水箱模型。该控制系统的目标是保持水箱中的水位与参考值相匹配。

open_system (“watertankLQG”

该模型包含有方差的过程噪声 E n 2 t 1

保持水位,同时尽量减少控制工作u,本例中的控制器使用以下LQG准则。

J lim T E 1 T 0 T 裁判 - y 2 t + 0 01 u 2 t dt

要模拟该型号的控制器,必须指定仿真时间特遣部队和控制器采样时间Ts在几秒钟内。

Ts = 0.1;Tf = 10;

有关水箱模型的更多信息,请参见水箱Simulink万博1manbetx模型(万博1manbetxSimulink控制设计)

使用控制系统调谐器调谐PI控制器

在Simulink中使用万博1manbetx控制系统调谐器,您必须将控制器块指定为调优块,并为调优过程定义目标。有关使用的更多信息控制系统调谐器,请参阅使用控制系统调谐器调优控制系统(万博1manbetxSimulink控制设计)

对于本例,打开保存的会话ControlSystemTunerSession.mat使用控制系统调谐器.的PID控制器块watertankLQG模型作为一个调优块,并包含一个LQG调优目标。

controlSystemTuner (“ControlSystemTunerSession”

要调优控制器,请在调优选项卡上,单击调优

调谐的比例增益和积分增益分别约为9.8和1e-6。

Kp_CST = 9.80199999804512;Ki_CST = 1.00019996230706e-06;

为培训代理创造环境

要定义训练RL代理的模型,请按照以下步骤修改水箱模型。

  1. 删除PID控制器。

  2. 插入RL Agent块。

  3. 创建观察向量 e dt e T 在哪里 e r - h h 是水箱的高度,和 r 是参考高度。将观察信号连接到RL代理块。

  4. 定义RL代理的奖励函数为LQG代价的,即 奖励 - 裁判 - h 2 t + 0 01 u 2 t .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 Agent

给定观察结果,TD3代理使用参与者表示决定采取何种操作。为了创建行动者,首先创建一个带有观察输入和动作输出的深度神经网络。有关更多信息,请参见rlDeterministicActorRepresentation

你可以将PI控制器建模为一个具有误差和误差积分观测的全连接层的神经网络。

u e dt e K K p T

在这里:

  • u是行动者神经网络的输出。

  • Kp而且Ki是神经网络权值的绝对值。

  • e r - h h 是水箱的高度,和 r 是参考高度。

梯度下降优化可以使权重变为负值。为了避免负权重,请替换正权重fullyConnectedLayer与一个fullyConnectedPILayer.该层通过实现函数确保权重为正 Y 腹肌 权重 X .该层定义在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”“位置”“东南”)标题(的阶跃响应

图中包含一个轴对象。标题为Step Response的axes对象包含2个类型为line的对象。这些对象表示控制系统调谐器,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”);结束

另请参阅

|

相关的话题