主要内容

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

这个例子展示了如何使用双延迟深度确定性策略梯度(TD3)强化学习算法来调整PI控制器。将调谐控制器的性能与用该方法调谐的控制器的性能进行了比较控制系统调谐器应用程序使用。控制系统调谐器应用程序在Simulink®中调优控制器需要Simul金宝appink Control Design™软件。

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

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

这个例子使用了一个强化学习(RL)代理来计算PI控制器的增益。关于用神经网络控制器代替PI控制器的例子,请参见创建Simul金宝appink环境和培训代理

环境模型

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

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在几秒钟内。

t = 0.1;Tf = 10;

有关水箱型号的更多信息,请参见watertank仿金宝app真软件模型(金宝app仿真软件控制设计)

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

在Simulink中使用金宝app控制系统调谐器,则必须将控制器块指定为调优块,并定义调优过程的目标。,以获取更多使用信息控制系统调谐器,请参阅使用控制系统调谐器调整控制系统(金宝app仿真软件控制设计)

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

controlSystemTuner (“ControlSystemTunerSession”

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

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

Kp_CST = 9.80199999804512;Ki_CST = 1.00019996230706 e-06;

为培训代理创建环境

为了定义训练RL agent的模型,请按照以下步骤修改水箱模型。

  1. 删除PID控制器。

  2. 插入RL Agent块。

  3. 创建观测向量 e dt e T 在哪里 e r - h h 油箱的高度是多少 r 为参考高度。将观测信号连接到RL Agent块。

  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代理

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

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

u e dt e K K p T

在这里:

  • u为actor神经网络的输出。

  • KpKi为神经网络权值的绝对值。

  • e r - h h 油箱的高度是多少 r 为参考高度。

梯度下降优化可以使权值为负值。为了避免负权重,请替换正常权重fullyConnectedLayer与一个fullyConnectedPILayer.这一层通过实现函数确保权重为正 Y 腹肌 权重 X .这个层定义在fullyConnectedPILayer.m

initialGain = single([1e- 32 2]); / /初始化actorNetwork = [featureInputLayer(numobobservations,“归一化”“没有”“名字”“状态”) fullyConnectedPILayer (initialGain“行动”));actorOptions = rlRepresentationOptions (“LearnRate”1 e - 3,“GradientThreshold”1);演员= rlDeterministicActorRepresentation (actorNetwork obsInfo actInfo,...“观察”, {“状态”},“行动”, {“行动”}, actorOptions);

TD3代理使用两种批判价值-功能表示来近似给定观察和行动的长期奖励。要创建批评家,首先要创建一个深度神经网络,它有两个输入,一个是观察和行动,一个是输出。有关创建深度神经网络值函数表示的更多信息,请参见创建策略和价值功能表示

要创造批评家,就要使用localCreateCriticNetwork函数的定义。对这两种批评表示使用相同的网络结构。

criticNetwork = localCreateCriticNetwork (numObservations numActions);criticOpts = rlRepresentationOptions (“LearnRate”1 e - 3,“GradientThreshold”1);摘要= rlQValueRepresentation (criticNetwork obsInfo actInfo,...“观察”“状态”“行动”“行动”, criticOpts);critic2 = rlQValueRepresentation (criticNetwork obsInfo actInfo,...“观察”“状态”“行动”“行动”, criticOpts);[批评家];

使用以下选项配置代理。

  • 设置代理使用控制器样本时间Ts

  • 设置小批量尺寸为128个经验样品。

  • 设置体验缓冲区长度为1e6。

  • 设置探索模型和目标政策平滑模型,使用方差为0.1的高斯噪声。

使用以下方法指定TD3代理选项rlTD3AgentOptions

agentOpts = rlTD3AgentOptions (...“SampleTime”Ts,...“MiniBatchSize”, 128,...“ExperienceBufferLength”1 e6);agentOpts.ExplorationModel.Variance = 0.1;agentOpts.TargetPolicySmoothModel.Variance = 0.1;

使用指定的参与者表示、评论家表示和代理选项创建TD3代理。有关更多信息,请参见rlTD3AgentOptions

代理= rlTD3Agent(演员、评论家、agentOpts);

火车代理

要培训代理,首先指定以下培训选项。

  • 每次训练最多跑一次1000每集最多1集00时间的步骤。

  • 在章节管理器中显示培训进度(设置情节选项)并禁用命令行显示(设置详细的选项)。

  • 当代理在100个连续的事件中获得平均累积大于-355的奖励时,停止训练。此时,药剂可以控制水箱内的水位。

有关更多信息,请参见rlTrainingOptions

maxepisodes = 1000;maxsteps =装天花板(Tf / Ts);trainOpts = rlTrainingOptions (...“MaxEpisodes”maxepisodes,...“MaxStepsPerEpisode”maxsteps,...“ScoreAveragingWindowLength”, 100,...“详细”假的,...“阴谋”“训练进步”...“StopTrainingCriteria”“AverageReward”...“StopTrainingValue”, -355);

训练代理人使用火车函数。训练这个代理是一个计算密集型的过程,需要几分钟才能完成。为了节省运行此示例的时间,请通过设置加载预先训练过的代理doTraining.自己训练代理人,设置doTraining真正的

doTraining = false;如果doTraining培训代理商。trainingStats =火车(代理,env, trainOpts);其他的%为示例加载预训练的代理。负载(“WaterTankPIDtd3.mat”“代理”结束

验证培训代理

通过仿真验证了该模型的有效性。

simOpts = rlSimulationOptions (“MaxSteps”, maxsteps);经验= sim (env,代理,simOpts);

PI控制器的积分增益和比例增益是参与者表示的绝对权重。为了获得权重,首先从参与者中提取可学习参数。

演员= getActor(代理);参数= 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 = 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”“位置”“东南”)标题(的阶跃响应

图中包含一个轴对象。标题为“Step Response”的轴对象包含两个类型为line的对象。这些对象代表控制系统调谐器(Control System Tuner, 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 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

分析两个仿真的稳定性。

stabitymargintable = struct2table([cstStabilityMargin rlStabilityMargin]);stabilityMarginTable = removevars (stabilityMarginTable, {...“GMFrequency”“PMFrequency”“DelayMargin”“DMFrequency”});stabilityMarginTable.Properties.RowNames = {控制系统调谐器的“RL”};stabilityMarginTable
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输出”%构建环境接口对象。(mdl env金宝app = rlSimulinkEnv (mdl,' / RL代理', obsInfo actInfo);%设置一个自定义重置函数,随机化模型的参考值。env。ResetFcn = @(在)localResetFcn (, mdl);结束

函数随机参考信号和初始高度的水箱在每集开始。

函数在= localResetFcn (mdl)%随机化参考信号黑色= sprintf (mdl' /期望\ nWater水平']);hRef = 10 + 4*(rand-0.5);在= setBlockParameter(黑色,“价值”num2str (hRef));%随机化初始高度hInit = 0;黑色= [mdl“水箱系统/ H”];在= setBlockParameter(黑色,“InitialCondition”num2str (hInit));结束

函数用于线性化和计算SISO水箱系统的稳定裕度。

函数margin = localStabilityAnalysis(mdl) io(1) = linio([mdl . txt]' / Sum1 '), 1“输入”);io (2) = linio (mdl/水箱系统的), 1“openoutput”);op = operpoint (mdl);op.Time = 5;linsys =线性化(mdl io, op);利润= allmargin (linsys);结束

命令功能,创建评论家网络。

函数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);criticNetwork = connectLayers (criticNetwork,“fc1”“concat /三机一体”);criticNetwork = connectLayers (criticNetwork,“取得”“concat / in2”);结束

另请参阅

|

相关的话题