创建Simul万博1manbetxink环境,培训Agent

此示例演示如何在。中转换PI控制器watertank万博1manbetx仿真软件®模型。提出了一种基于深度确定性策略梯度(DDPG)的增强学习算法。有关在MATLAB®中训练DDPG代理的示例,请参见培训DDPG代理商控制双积分系统.

水箱模型

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

对原模型进行如下修改:

  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.有关此模型和更改的更多信息,请参见为强化学习创建万博1manbetxSimulink环境.

open_system (“rlwatertank”)

创建环境接口

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

定义观察规范obsInfo和行为规范actInfo.

obsInfo = rlNumericSpec([31],“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万博1manbetxSimulinkEnv (“rlwatertank”,“rlwatertank / RL代理”,obsInfo actInfo);

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

env。ResetFcn = @(在)localResetFcn(的);

指定仿真时间特遣部队以及代理取样时间Ts在几秒钟内。

t = 1.0;Tf = 200;

修正随机产生的种子的可重复性。

rng (0)

创建DDPG代理

给定观察和操作,DDPG代理使用批评家值函数表示来近似长期回报。要创建批评家,首先要创建一个深度神经网络,它有两个输入:观察和动作,一个输出。有关创建深度神经网络值函数表示的更多信息,请参见创建策略和值函数表示.

statePath = [imageInputLayer([numobservation1 1]),“归一化”,“没有”,“名字”,“状态”)fullyConnectedLayer (50,“名字”,“CriticStateFC1”)reluLayer (“名字”,“CriticRelu1”)fullyConnectedLayer (25,“名字”,“CriticStateFC2”));actionPath = [imageInputLayer([numActions 1 1]),“归一化”,“没有”,“名字”,“行动”)fullyConnectedLayer (25,“名字”,“CriticActionFC1”));commonPath = [additionLayer(2,“名字”,“添加”)reluLayer (“名字”,“CriticCommonRelu”)fullyConnectedLayer (1,“名字”,“CriticOutput”));criticNetwork = layerGraph ();criticNetwork = addLayers (criticNetwork statePath);criticNetwork = addLayers (criticNetwork actionPath);criticNetwork = addLayers (criticNetwork commonPath);criticNetwork = connectLayers (criticNetwork,“CriticStateFC2”,“添加/三机一体”);criticNetwork = connectLayers (criticNetwork,“CriticActionFC1”,“添加/ in2”);

查看评论家网络配置。

图绘制(criticNetwork)

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

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

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

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

根据观察结果,DDPG代理将使用actor表示来决定采取哪个操作。要创建actor,首先要创建一个深度神经网络,其中有一个输入,一个观察,一个输出,一个动作。

用与批评家相似的方式构造这个演员。有关更多信息,请参见rlDeterministicActorRepresentation.

actorNetwork = [imageInputLayer([numObservations 1 1]),“归一化”,“没有”,“名字”,“状态”)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 (“SampleTime”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集。规定每一集最多持续多长时间200时间的步骤。

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

  • 当代理连续20次获得平均累积奖励超过800时停止训练。此时,代理可以控制水箱中的水位。

有关更多信息,请参见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(中)随机参考信号黑色= 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(黑色,“InitialCondition”num2str (h));结束

另请参阅

相关的话题