主要内容

训练DQN代理摆起和平衡摆

这个例子展示了如何训练深度q -学习网络(DQN)代理,以摆动和平衡在Simulink®中建模的摆。金宝app

有关DQN代理的更多信息,请参见深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环境金宝app

创建环境接口

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

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

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

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

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

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

obsInfo = getObservationInfo (env)
obsInfo = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf Name: "observations" Description: [0x0 string]维度:[3 1]DataType: "double"
actInfo = getActionInfo (env)
actInfo = rlFiniteSetSpec with properties: Elements: [3x1 double] Name: "torque" Description: [0x0 string] Dimension: [1 1] DataType: "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“名字”“输出”));

查看批评网络配置。

图绘制(layerGraph(款)

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

使用rlRepresentationOptions

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

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

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

要创建DQN代理,首先使用rlDQNAgentOptions

agentOptions = rlDQNAgentOptions (...“SampleTime”Ts,...“TargetSmoothFactor”1 e - 3,...“ExperienceBufferLength”, 3000,...“UseDoubleDQN”假的,...“DiscountFactor”, 0.9,...“MiniBatchSize”, 64);

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

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

火车代理

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

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

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

  • 当特工连续5次获得超过-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);其他的%为示例加载预训练的代理。负载(“金宝appSimulinkPendulumDQNMulti.mat”“代理”);结束

模拟DQN代理

为了验证训练过的代理的性能,在钟摆环境中模拟它。有关代理模拟的更多信息,请参见rlSimulationOptionssim卡

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

图单摆可视化器包含一个轴。坐标轴包含两个类型为line和rectangle的对象。

另请参阅

相关的话题