主要内容

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

中的PI控制器进行转换watertank金宝app基于Simulink模型的强化学习深度确定性策略梯度(DDPG)代理。有关在MATLAB®中训练DDPG代理的示例,请参见训练DDPG Agent控制双积分系统

水箱模型

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

对原始模型进行如下修改:

  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金宝appink强化学习环境

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);

构建环境接口对象。

环境= rlSi金宝appmulinkEnv(“rlwatertank”“rlwatertank / RL代理”...obsInfo actInfo);

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

env。ResetFcn = @ localResetFcn(in);

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

Ts = 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”));commonPath = [addtionlayer (2,“名字”“添加”) reluLayer (“名字”“CriticCommonRelu”) fullyConnectedLayer (1,“名字”“CriticOutput”));criticNetwork = layerGraph();criticNetwork = addLayers(criticNetwork,statePath);criticNetwork = addLayers(criticNetwork,actionPath);criticNetwork = addLayers(criticNetwork,commonPath);临界网络= connectLayers(临界网络,“CriticStateFC2”“添加/三机一体”);临界网络= connectLayers(临界网络,“CriticActionFC1”“添加/ in2”);

查看关键网络配置。

图绘制(criticNetwork)

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

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

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

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

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

给定观察结果,DDPG代理使用参与者表示来决定采取何种操作。要创建行动者,首先要创建一个深度神经网络,它有一个输入(观察)和一个输出(动作)。

用与评论家相似的方式来构建演员。有关更多信息,请参见rlDeterministicActorRepresentation

actorNetwork = [featureInputLayer(numObservations,“归一化”“没有”“名字”“状态”) fullyConnectedLayer (3“名字”“actorFC”) tanhLayer (“名字”“actorTanh”) fullyConnectedLayer (numActions“名字”“行动”));actorOptions = rlRepresentationOptions(“LearnRate”1 e-04“GradientThreshold”1);actor = rlDeterministicActorRepresentation(actorNetwork,obsInfo,actInfo,“观察”, {“状态”},“行动”, {“行动”}, actorOptions);

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

agentOpts = rlDDPGAgentOptions(...“SampleTime”Ts,...“TargetSmoothFactor”1 e - 3,...“DiscountFactor”, 1.0,...“MiniBatchSize”, 64,...“ExperienceBufferLength”1 e6);agentoptions . noiseoptions . variance = 0.3;agentoptions . noiseoptions . variancedecayrate = 1e-5;

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

agent = rlDDPGAgent(actor,批评家,agentOpts);

火车代理

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

  • 每次训练最多跑一次5000集。指定每个插曲最多持续一段时间装天花板(Tf / Ts)(即200)时间步长。

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

  • 当代理收到的平均累积奖励大于80020.连续集。此时,药剂可以控制水箱中的水位。

有关更多信息,请参见rlTrainingOptions

Maxepisodes = 5000;maxsteps = ceil(Tf/Ts);trainOpts = rlTrainingOptions(...“MaxEpisodes”maxepisodes,...“MaxStepsPerEpisode”maxsteps,...“ScoreAveragingWindowLength”, 20岁,...“详细”假的,...“阴谋”“训练进步”...“StopTrainingCriteria”“AverageReward”...“StopTrainingValue”, 800);

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

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

验证培训代理

通过仿真验证所学习的智能体与模型的关系。

simOpts = rlSimulationOptions(“MaxSteps”maxsteps,“StopOnError”“上”);experiences = sim(env,agent,simOpts);

本地函数

函数in = localResetFcn(in)随机化参考信号BLK = sprintf('rlwatertank/期望水位');H = 3*randn + 10;|| H >= 20 H = 3*randn + 10;结束in = setBlockParameter(in,blk,“价值”num2str (h));%随机初始高度H = 3*randn + 10;|| H >= 20 H = 3*randn + 10;结束黑色=“rlwatertank /水箱系统/ H”;in = setBlockParameter(in,blk,“InitialCondition”num2str (h));结束

另请参阅

相关的话题