创建Simul金宝appink环境和培训代理

这个例子说明了如何PI控制器转换在水缸金宝appSimulink将模型转换为一种强化学习深度确定性策略梯度(DDPG)代理。有关在MATLAB®中训练DDPG代理的示例,请参见培训DDPG代理控制双积分器系统

水箱模型

本例的原始模型是水箱模型。目标是控制水箱中的水位。有关水箱模型的更多信息,请参见watertank仿金宝app真软件模型(金宝app仿真软件控制设计)

修改通过以下的改变原始模型:

  1. 删除PID控制器。

  2. 插入RL代理块。

  3. 连接观测向量 ( e dt e h ] T ,其中 h 为水箱的高度, e = r - h r 是基准高度。

  4. 设立奖励 奖励 = 10 ( | e | < 0 1 ) - 1 ( | e | 0 1 ) - 100 ( h 0 | | h 20. )

  5. 配置终止信号,使得模拟如果停止 h 0 要么 h 20.

得到的模型是rlwatertank.slx。有关此模型和更改的详细信息,请参阅创建强化学习的金宝appSimulink环境

open_system(“rlwatertank”)

创建环境接口

创建环境模型包括定义如下:

定义观测规范obsInfo和动作规范actInfo

obsInfo = rlNumericSpec([3 1],“LowerLimit”,[-inf -inf 0]',“UpperLimit”[INF INF INF]');obsInfo.Name =“观察”;obsInfo。描述=“综合误差、误差和测量高度”;numObservations = obsInfo.Dimension(1);actInfo = rlNumericSpec([1 1]);actInfo.Name =“流”;numActions = actInfo.Dimension (1);

构建环境接口对象。

ENV = rl金宝appSimulinkEnv(“rlwatertank”,'rlwatertank / RL代理',obsInfo actInfo);

设置一个自定义重置函数,该函数为模型随机化引用值。

env.ResetFcn = @(上)localResetFcn(IN);

指定仿真时间特遣部队和所述试剂的采样时间Ts在几秒钟内。

t = 1.0;Tf = 200;

修正了重复性的随机生成种子。

rng (0)

创建DDPG代理

给定观察和行为,DDPG代理使用批评家值函数表示近似长期奖励。要创建批评家,首先创建一个具有两个输入(观察和动作)和一个输出的深度神经网络。有关创建深度神经网络值函数表示的更多信息,请参见创建策略和价值函数表示

statePath = [featureInputLayer(numObservations,'正常化',“没有”,“名字”,'州') fullyConnectedLayer (50,“名字”,'CriticStateFC1') reluLayer (“名字”,'CriticRelu1')fullyConnectedLayer(25,“名字”,'CriticStateFC2')];actionPath = [featureInputLayer(numActions,'正常化',“没有”,“名字”,'行动')fullyConnectedLayer(25,“名字”,'CriticActionFC1')];文件版本= [additionLayer(2,“名字”,“添加”) reluLayer (“名字”,'CriticCommonRelu') fullyConnectedLayer (1,“名字”,'CriticOutput')];criticNetwork = layerGraph();criticNetwork = addLayers(criticNetwork,statePath);criticNetwork = addLayers(criticNetwork,actionPath);criticNetwork = addLayers(criticNetwork,文件版本);criticNetwork = connectLayers(criticNetwork,'CriticStateFC2','添加/ IN1');criticNetwork = connectLayers(criticNetwork,'CriticActionFC1',“添加/平方英寸”);

查看批评家网络配置。

图图(criticNetwork)

使用指定批评家表示形式的选项rlRepresentationOptions

criticOpts = rlRepresentationOptions(“LearnRate”1 e 03'GradientThreshold',1);

创建使用指定的深层神经网络和选项的评论家表示。你还必须指定动作和观察规格的批评家,你从环境中获得的接口。有关更多信息,请参见rlQValueRepresentation

评论家= rlQValueRepresentation (criticNetwork obsInfo actInfo,“观察”{'州'},'行动'{'行动'},criticOpts);

给定观察结果,DDPG代理决定使用actor表示采取哪个操作。创建演员,首先创建一个深和一个输入神经网络,观察,和一个输出,行动。

构建演员评论家以类似的方式。有关更多信息,请参见rlDeterministicActorRepresentation

actorNetwork = [featureInputLayer(numObservations,'正常化',“没有”,“名字”,'州') fullyConnectedLayer (3“名字”,“actorFC”)tanhLayer(“名字”,“actorTanh”)fullyConnectedLayer(numActions,“名字”,'行动')];actorOptions = rlRepresentationOptions(“LearnRate”1 e-04'GradientThreshold',1);演员= rlDeterministicActorRepresentation(actorNetwork,obsInfo,actInfo,“观察”{'州'},'行动'{'行动'},actorOptions);

要创建DDPG剂,采用先指定DDPG代理选项rlDDPGAgentOptions

agentOpts = rlDDPGAgentOptions('采样时间',TS,'TargetSmoothFactor'1 e - 3,'DiscountFactor',1.0,“MiniBatchSize”,64,“ExperienceBufferLength”1 e6);agentOpts.NoiseOptions。方差= 0.3;agentOpts.NoiseOptions。VarianceDecayRate = 1 e-5;

然后,使用指定的actor表示、批评家表示和代理选项创建DDPG代理。有关更多信息,请参见rlDDPGAgent

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

火车代理

为了培养剂,先指定的培训方案。在这个例子中,使用下列选项:

  • 运行最多每次培训5000集。指定每一集最多持续时间装天花板(Tf / Ts)(那是200)时间的步骤。

  • 在“情节管理器”对话框中显示训练进度(设置情节选项)和禁用命令行显示(设定详细选项)。

  • 当代理接收到一个平均的累积奖励大于停止训练80020.连续发作。在这一点上,代理可以控制水箱中的水的水平。

有关更多信息,请参见rlTrainingOptions

maxepisodes = 5000;maxsteps =装天花板(Tf / Ts);trainOpts = rlTrainingOptions ('MaxEpisodes'maxepisodes,'MaxStepsPerEpisode',maxsteps,“ScoreAveragingWindowLength”, 20岁,“放牧”,假,“阴谋”,“训练进步”,“StopTrainingCriteria”,'AverageReward','StopTrainingValue', 800);

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

doTraining = FALSE;如果doTraining培训代理。trainingStats =列车(代理人,ENV,trainOpts);其他%加载预训练剂的例子。负载('WaterTankDDPG.mat',“代理”)结束

验证训练有素的代理

验证对仿真模型中了解到剂。

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

本地功能

功能= localResetFcn(中)随机参考信号BLK = sprintf的('rlwatertank /期望\ nWater级别');h = 3*randn + 10;h <= 0 || h >= 20 h = 3*randn + 10;结束在= setBlockParameter(黑色,“价值”num2str (h));%随机初始高度h = 3*randn + 10;h <= 0 || h >= 20 h = 3*randn + 10;结束黑色=“rlwatertank /水箱系统/ H”;在= setBlockParameter(黑色,'初始条件'num2str (h));结束

另请参阅

相关话题