主要内容

训练DQN代理上摆和平衡摆

这个例子展示了如何训练一个深度q学习网络(DQN)代理来摆动和平衡Simulink®中建模的摆锤。

有关DQN代理的更多信息,请参见DQN (Deep Q-Network)代理.关于在MATLAB®中训练DQN代理的例子,请参见训练DQN代理平衡车杆系统

摆摆起模型

本例中的强化学习环境是一个简单的无摩擦钟摆,最初悬挂在向下的位置。训练目标是用最小的控制力使钟摆直立而不跌倒。

打开模型。

mdl =“rlSimplePendulumModel”;open_system (mdl)

对于这个模型:

  • 向上的平衡摆位置为0弧度,向下的悬挂位置为π弧度。

  • 从试剂到环境的扭矩动作信号在-2到2 N·m之间。

  • 从环境中观察到的是摆角的正弦值,摆角的余弦值,以及摆角的导数。

  • 奖励 r t ,在每个时间步上提供,为

r t - θ t 2 + 0 1 θ t ˙ 2 + 0 001 u t - 1 2

在这里:

  • θ t 为从直立位置的位移角。

  • θ t ˙ 是位移角的导数。

  • u t - 1 是来自前一个时间步骤的控制努力。

有关此模型的更多信息,请参见加载预定义的Simulink环境

创建环境接口

为钟摆创建一个预定义的环境接口。

env = rlPredefinedEnv (“SimplePendulumModel-Discrete”
env = SimulinkEnvWithAgent with properties: Model: rlSimplePendulumModel AgentBlock: rlSimplePendulumModel/RL Agent ResetFcn: [] UseFastRestart: on

该界面具有一个离散的动作空间,在该空间中,代理可以向钟摆施加三种可能的扭矩值之一:-2、0或2 N·m。

要将钟摆的初始条件定义为向下悬挂,请使用匿名函数句柄指定环境重置函数。这个reset函数设置模型工作区变量theta0π

env。ResetFcn = @(在)setVariable (,“theta0”π,“工作区”、mdl);

从环境中获取观察和行动规范信息

obsInfo = getObservationInfo (env)
obsInfo = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf Name: " observing " Description: [0x0 string] Dimension: [3 1] DataType: "double"
actInfo = getActionInfo (env)
名称:"torque"描述:[0x0 string]尺寸:[1 1]数据类型:"double"

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

t = 0.05;Tf = 20;

固定随机生成器种子的再现性。

rng (0)

创建DQN代理

DQN代理在给定的观察和行动下,使用价值函数批评家来近似长期奖励。

由于DQN具有离散的动作空间,它可以依赖于多输出临界逼近器,这通常是比依赖可比的单输出逼近器更有效的选择。多输出近似器只有观察结果作为输入,输出向量具有与可能的离散动作数量相同的元素。当采取相应的离散行动时,每个输出元素都表示从作为输入的观察所得的预期累积长期回报。

要创建批评家,首先创建一个深度神经网络,它的输入向量有三个元素(用于摆角的正弦、余弦和导数),输出向量有三个元素(-2、0或2nm动作)。有关创建深度神经网络值函数表示的更多信息,请参见创建政策和价值功能

dnn = [featureInputLayer(3,“归一化”“没有”“名字”“状态”) fullyConnectedLayer(24日“名字”“CriticStateFC1”) reluLayer (“名字”“CriticRelu1”) fullyConnectedLayer(48岁“名字”“CriticStateFC2”) reluLayer (“名字”“CriticCommonRelu”) fullyConnectedLayer (3“名字”“输出”));款= dlnetwork(款);

查看批评家网络配置。

图绘制(layerGraph(款)

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

指定所使用的批评家优化器的选项rlOptimizerOptions

criticOpts = rlOptimizerOptions (“LearnRate”, 0.001,“GradientThreshold”1);

使用指定的深度神经网络和选项创建批评家表示。你还必须为评论家指定观察和行动信息。有关更多信息,请参见rlVectorQValueFunction

评论家= rlVectorQValueFunction(款、obsInfo actInfo);

要创建DQN代理,首先使用指定DQN代理选项rlDQNAgentOptions

agentOptions = rlDQNAgentOptions (...“SampleTime”Ts,...“CriticOptimizerOptions”criticOpts,...“ExperienceBufferLength”, 3000,...“UseDoubleDQN”、假);

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

代理= rlDQNAgent(评论家,agentOptions);

火车代理

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

  • 每次训练最多1000集,每集最多持续1000集500时间的步骤。

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

  • 当代理在连续五集中获得的平均累积奖励大于-1100时停止训练。在这一点上,代理可以用最小的控制努力快速平衡摆在直立位置。

  • 为每一集累积奖励大于-1100的场景保存一份代理副本。

有关更多信息,请参见rlTrainingOptions

trainingOptions = rlTrainingOptions (...“MaxEpisodes”, 1000,...“MaxStepsPerEpisode”, 500,...“ScoreAveragingWindowLength”5,...“详细”假的,...“阴谋”“训练进步”...“StopTrainingCriteria”“AverageReward”...“StopTrainingValue”, -1100,...“SaveAgentCriteria”“EpisodeReward”...“SaveAgentValue”, -1100);

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

doTraining = false;如果doTraining培训代理。trainingStats =火车(代理,env, trainingOptions);其他的为示例加载预先训练过的代理。负载(“SimulinkPendulumDQNMulti.mat”“代理”);结束

模拟DQN代理

要验证经过训练的代理的性能,请在摆环境中对其进行模拟。有关代理模拟的更多信息,请参见rlSimulationOptions而且sim卡

simOptions = rlSimulationOptions (“MaxSteps”, 500);经验= sim (env,代理,simOptions);

{

另请参阅

相关的话题

Baidu
map