主要内容

创建Simul万博1manbetxink环境并训练Agent

这个例子演示了如何在水箱万博1manbetxSimulink®模型到强化学习深度确定性策略梯度(DDPG)代理。有关在MATLAB®中训练DDPG代理的示例,请参阅培训DDPG代理控制双积分系统

水箱模型

本例的原始模型是水箱模型。目标是控制水箱中的水位。有关水箱模型的更多信息,请参阅水箱Simulink万博1manbetx模型(万博1manbetxSimulink控制设计)

修改原型号,修改如下:

  1. 删除PID控制器。

  2. 插入RL代理块。

  3. 连接观察向量 [ E dt E H ] T ,在那里 H 是水箱的高度, E = R - H ,及 R 为参考高度。

  4. 设置奖励 奖励 = 10 ( | E | < 0 1. ) - 1. ( | E | 0 1. ) - One hundred. ( H 0 | | H 20. )

  5. 配置终止信号,使模拟停止如果 H 0 H 20.

由此产生的模型是rlwatertank.slx.有关此模型和更改的更多信息,请参见创建Simul万博1manbetxink强化学习环境

open_system (“水箱”)

创建环境接口

创建环境模型包括定义以下内容:

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

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

构建环境接口对象。

env = rl万博1manbetxSimulinkEnv (“水箱”,“rlwatertank / RL代理”,...obsInfo、actInfo);

设置自定义重置函数,使模型的参考值随机化。

env.ResetFcn=@(in)localResetFcn(in);

指定模拟时间特遣部队和代理采样时间Ts几秒钟之内。

Ts=1.0;Tf=200;

修复随机生成器种子的再现性。

rng (0)

创建DDPG代理

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

statePath=[featureInputLayer(numObservations,“归一化”,“没有”,“姓名”,“状态”)完全连接层(50,“姓名”,“CriticStateFC1”)雷卢耶(“姓名”,“CriticRelu1”) fullyConnectedLayer (25,“姓名”,“CriticStateFC2”)]; actionPath=[featureInputLayer(numActions,“归一化”,“没有”,“姓名”,“行动”) fullyConnectedLayer (25,“姓名”,“CriticActionFC1”)]; commonPath=[additionLayer(2,“姓名”,“添加”)雷卢耶(“姓名”,“CriticCommonRelu”) fullyConnectedLayer (1,“姓名”,“CriticOutput”)];criticNetwork=layerGraph();criticNetwork=addLayers(criticNetwork,statePath);criticNetwork=addLayers(criticNetwork,actionPath);criticNetwork=addLayers(criticNetwork,commonPath);criticNetwork=connectLayers(criticNetwork,“CriticStateFC2”,“添加/in1”);临界网络=连接层(临界网络,“CriticActionFC1”,“添加/ in2”);

查看网络配置。

图表(关键网络)

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

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

criticOpts=rlRepresentationOptions(“LearnRate”1 e 03“梯度阈值”,1);

使用指定的深度神经网络和选项创建批评家表示。您还必须为评论家指定操作和观察规范,这是从环境接口获得的。有关更多信息,请参见rlQValueRepresentation

critic=rlQValueRepresentation(关键网络、obsInfo、actInfo、,“观察”,{“状态”},“行动”,{“行动”},批判者);

在给定的观察结果中,DDPG代理使用参与者表示来决定要执行的操作。要创建参与者,首先创建一个包含一个输入(观察结果)和一个输出(操作)的深层神经网络。

以与批评家相似的方式构造演员。有关更多信息,请参阅rlDeterministicActorRepresentation

actorNetwork = [featureInputLayer(numobobservations,“归一化”,“没有”,“姓名”,“状态”) fullyConnectedLayer (3“姓名”,“actorFC”) tanhLayer (“姓名”,“阿克托坦”) fullyConnectedLayer (numActions“姓名”,“行动”));actorOptions = rlRepresentationOptions (“LearnRate”1 e-04“梯度阈值”,1);actor=rlDeterministicActorRepresentation(actorNetwork、obsInfo、actInfo、,“观察”,{“状态”},“行动”,{“行动”}, actorOptions);

要创建DDPG代理,请首先使用指定DDPG代理选项rlDDPGAgentOptions

agentOpts = rlDDPGAgentOptions (...“SampleTime”,Ts,...“目标平滑因子”1 e - 3,...“折扣演员”,1.0,...“MiniBatchSize”,64,...“经验缓冲长度”,1e6);agentOpts.NoiseOptions.Variance=0.3;agentOpts.NoiseOptions.VarianceDecayRate=1e-5;

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

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

列车员

要培训代理,首先指定培训选项。对于本例,使用以下选项:

  • 每次训练最多跑一次5000集。指定每一集最多持续时间ceil(Tf/Ts)(即200)时间的步骤。

  • 在“插曲管理器”对话框中显示培训进度(设置情节选项)并禁用命令行显示(设置冗长的选项假的).

  • 当代理收到的平均累积奖励大于时,停止培训800结束20.连续事件。此时,代理可以控制水箱中的水位。

有关更多信息,请参见RL培训选项

maxepisodes = 5000;maxsteps =装天花板(Tf / Ts);trainOpts = rlTrainingOptions (...“MaxEpisodes”maxepisodes,...“MaxStepsPerEpisode”,maxsteps,...“ScoreAveragingWindowLength”, 20岁,...“详细”,错,...“情节”,“训练进步”,...“停止培训标准”,“AverageReward”,...“停止训练值”,800);

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

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

验证培训代理

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

simOpts=rlSimulationOptions(“MaxSteps”,maxsteps,“StopOnError”,“开”);经验=sim(环境、代理、simOpts);

本地函数

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

另见

相关的话题