使用强化学习调谐PI控制器
本例展示了如何使用双延迟深度确定性策略梯度(TD3)强化学习算法调优PI控制器。将调优控制器的性能与使用控制系统调谐器应用程序使用。控制系统调谐器应用程序来调整Simulink®中的控制器需要Simulink Control Design™软件。
对于具有少量可调参数的相对简单的控制任务,与无模型的基于rl的方法相比,基于模型的调优技术可以以更快的调优过程获得良好的结果。然而,RL方法可能更适合于高度非线性的系统或自适应控制器调优。
为了便于控制器比较,两种调优方法都使用线性二次高斯(LQG)目标函数。
本例使用强化学习(RL)代理来计算PI控制器的增益。关于用神经网络控制器替换PI控制器的例子,请参见创建Simulink环境和Train Agent。
环境模型
本例的环境模型是一个水箱模型。这个控制系统的目标是保持水箱中的水位与参考值相匹配。
open_system (“watertankLQG”)
该模型包含有方差的过程噪声 。
保持水位,同时尽量减少控制力度u
,本例中的控制器使用以下LQG标准。
要模拟该模型中的控制器,必须指定模拟时间特遣部队
和控制器采样时间Ts
在几秒钟内。
t = 0.1;Tf = 10;
关于水箱型号的更多信息,请参见watertank仿真软件模型(仿真软件控制设计)。
使用控制系统调谐器调谐PI控制器
对Simulink中的控制器进行调优控制系统调谐器,必须将控制器块指定为调优块,并为调优过程定义目标。有关使用的更多信息控制系统调谐器,请参阅使用控制系统调谐器调优控制系统(仿真软件控制设计)。
对于本例,打开保存的会话ControlSystemTunerSession.mat
使用控制系统调谐器。的PID控制器块watertankLQG
模型作为一个调优块,包含一个LQG调优目标。
controlSystemTuner (“ControlSystemTunerSession”)
调优控制器,在调优选项卡上,单击调优。
调谐后的比例增益和积分增益分别约为9.8和1e-6。
Kp_CST = 9.80199999804512;Ki_CST = 1.00019996230706 e-06;
为培训代理创造环境
要定义训练RL代理的模型,请使用以下步骤修改水箱模型。
删除PID控制器。
插入RL代理块。
创建观察向量 在哪里 , 是坦克的高度,和 为参考高度。将观测信号连接到RL Agent块。
定义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代理
给定观察结果,TD3代理使用参与者表示来决定采取哪个动作。要创建行动者,首先创建一个具有观察输入和动作输出的深度神经网络。欲了解更多信息,请参见rlContinuousDeterministicActor
。
你可以把PI控制器建模为一个神经网络,它有一个完全连接的层,带有误差和误差积分观察。
在这里:
u
是行动者神经网络的输出。Kp
和Ki
是神经网络权值的绝对值。, 是坦克的高度,和 为参考高度。
梯度下降优化可以使权重变为负值。为了避免负权值,替换正权值fullyConnectedLayer
与一个fullyConnectedPILayer
。这一层通过实现函数确保权值为正
。该层定义在fullyConnectedPILayer.m
。有关定义自定义层的更多信息,请参见定义自定义深度学习层。
initialGain = single([1e-3 2]);actorNetwork = [featureInputLayer(numObservations,“归一化”,“没有”,“名字”,“状态”) fullyConnectedPILayer (initialGain“行动”));actorNetwork = dlnetwork (actorNetwork);actorOptions = rlOptimizerOptions (“LearnRate”1 e - 3,“GradientThreshold”1);演员= rlContinuousDeterministicActor (actorNetwork obsInfo actInfo);
TD3代理使用两个批评家价值函数表示来近似给出观察和行动的长期奖励。要创建批评者,首先创建一个具有两个输入(观察和行动)和一个输出(输出)的深度神经网络。有关创建深度神经网络价值函数表示的更多信息,请参见创建策略和价值函数。
要创建批评,使用localCreateCriticNetwork
本例末尾定义的函数。对两个批评家表示使用相同的网络结构。
criticNetwork = localCreateCriticNetwork (numObservations numActions);criticOpts = rlOptimizerOptions (“LearnRate”1 e - 3,“GradientThreshold”1);摘要= rlQValueFunction (dlnetwork (criticNetwork) obsInfo, actInfo,…“ObservationInputNames”,“状态”,“ActionInputNames”,“行动”);critic2 = rlQValueFunction (dlnetwork (criticNetwork) obsInfo, actInfo,…“ObservationInputNames”,“状态”,“ActionInputNames”,“行动”);评论家= [critic1 critic2];
使用以下选项配置代理。
设置代理使用控制器采样时间
Ts
。设置小批量大小为128个体验样。
设置经验缓冲区长度为1e6。
设置探索模型和目标政策平滑模型使用方差为0.1的高斯噪声。
指定TD3代理选项使用rlTD3AgentOptions
。
agentOpts = rlTD3AgentOptions (…“SampleTime”Ts,…“MiniBatchSize”, 128,…“ExperienceBufferLength”1 e6,…“ActorOptimizerOptions”actorOptions,…“CriticOptimizerOptions”, criticOpts);agentOpts.TargetPolicySmoothModel.StandardDeviation = sqrt (0.1);
使用指定的参与者表示、批评家表示和代理选项创建TD3代理。欲了解更多信息,请参见rlTD3AgentOptions
。
代理= rlTD3Agent(演员、评论家、agentOpts);
火车代理
要培训代理,首先要明确以下培训选项。
每次训练最多进行一次
1000
章节,每一章节最长持续100
时间的步骤。在插曲管理器中显示训练进度(设置
情节
选项),并禁用命令行显示(设置详细的
选项)。当代理在连续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控制器的积分增益和比例增益是actor表示的绝对权重。为了获得权重,首先从actor中提取出可学习的参数。
演员= 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);
应用获得的增益使用控制系统调谐器到原始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 (stepInfoTable, {…“SettlingMin”,“SettlingMax”,“脱靶”,“PeakTime”});stepInfoTable.Properties.RowNames = {控制系统调谐器的,“RL”};stepInfoTable
stepInfoTable =2×5表RiseTime TransientTime SettlingTime超调峰值________ _____________ ____________ _________ ______控制系统调谐器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 = removevars (stabilityMarginTable, {…“GMFrequency”,“PMFrequency”,“DelayMargin”,“DMFrequency”});stabilityMarginTable.Properties.RowNames = {控制系统调谐器的,“RL”};stabilityMarginTable
stabilityMarginTable =2×3表GainMargin PhaseMargin Stable __________ ___________ ______ Control System Tuner 8.1616 84.124 true RL 9.9226 84.242 true
比较两个控制器的累计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 = 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 .]' / Sum1 '), 1“输入”);io (2) = linio (mdl/水箱系统的), 1“openoutput”);op = operpoint (mdl);op.Time = 5;linsys =线性化(mdl io, op);利润= allmargin (linsys);结束
创建评论家网络的功能。
函数criticNetwork = localCreateCriticNetwork(numObservations,numActions) statePath = [featureInputLayer(numObservations,“归一化”,“没有”,“名字”,“状态”) 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”);结束