这个例子展示了如何训练深度q -学习网络(DQN)代理来平衡MATLAB®建模的小车-极点系统。
有关DQN代理的更多信息,请参见深Q-Network代理.有关在Simulink®中训练DQN代理的示例,请参见金宝app训练DQN代理摆起和平衡摆.
本例中的强化学习环境是一根连接在小车上的非驱动关节上的杆,小车沿着无摩擦轨道移动。训练目标是让杆子直立而不摔倒。
对于这个环境:
向上的平衡杆位置为0
弧度,向下悬挂的位置是π
弧度。
极点开始直立与一个初始角度之间的-0.05和0.05弧度。
从代理到环境的力作用信号是-10到10n。
从环境中观察到的是小车的位置和速度、极角和极角导数。
如果磁极与垂直位置的距离超过12度,或者小车移动距离最初位置超过2.4米,则结束。
每走一次,柱子保持直立,奖励+1。当杆子倒下来时处以-5的惩罚。
有关此模型的更多信息,请参见加载预定义的控制系统环境.
为系统创建预定义的环境接口。
env = rlPredefinedEnv (“CartPole-Discrete”)
env = CartPoleDiscreteAction with properties: Gravity: 9.8000 MassCart: 1 MassPole: 0.1000 Length: 0.5000 MaxForce: 10 Ts: 0.0200 thetathresholdradiers: 0.2094 XThreshold: 2.4000 RewardForNotFalling: 1 PenaltyForFalling: -5 State: [4x1 double]
该接口有一个离散的操作空间,代理可以将两个可能的力值中的一个应用到购物车,即-10或10 N。
获得观察和行动规范信息。
obsInfo = getObservationInfo (env)
obsInfo = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf Name: "CartPole States" Description: "x, dx, theta, dtheta" Dimension: [4 1] DataType: "double"
actInfo = getActionInfo (env)
actInfo = rlFiniteSetSpec with properties: Elements: [-10 10] Name:“CartPole Action”
修复了可重复性的随机生成器种子。
rng (0)
DQN代理使用价值函数评论家来近似长期奖励,给出观察和行动。
DQN代理可以使用多输出q值临界逼近器,通常效率更高。多输出近似器以观察值作为输入,以状态-动作值作为输出。每个输出元素表示从观察输入所指示的状态中采取相应的离散行动所期望的累积长期回报。
要创建批评者,首先创建一个深度神经网络,其中有一个输入(4维观察状态)和一个输出向量,其中有两个元素(一个用于10n动作,另一个用于- 10n动作)。有关基于神经网络创建值-函数表示的更多信息,请参见创建策略和值函数表示.
dnn = [featureInputLayer(obsInfo.Dimension(1),“归一化”,“没有”,“名字”,“状态”) fullyConnectedLayer(24日“名字”,“CriticStateFC1”) reluLayer (“名字”,“CriticRelu1”) fullyConnectedLayer(24日“名字”,“CriticStateFC2”) reluLayer (“名字”,“CriticCommonRelu”) fullyConnectedLayer(长度(actInfo.Elements),“名字”,“输出”));
查看网络配置。
图绘制(layerGraph(款)
为批评者表示指定一些培训选项rlRepresentationOptions
.
criticOpts = rlRepresentationOptions (“LearnRate”, 0.001,“GradientThreshold”1);
使用指定的神经网络和选项创建批评表示。有关更多信息,请参见rlQValueRepresentation
.
评论家= rlQValueRepresentation(款、obsInfo actInfo,“观察”, {“状态”}, criticOpts);
要创建DQN代理,首先使用rlDQNAgentOptions
.
agentOpts = rlDQNAgentOptions (...“UseDoubleDQN”假的,...“TargetSmoothFactor”, 1...“TargetUpdateFrequency”4...“ExperienceBufferLength”, 100000,...“DiscountFactor”, 0.99,...“MiniBatchSize”, 256);
然后,使用指定的批评表示和代理选项创建DQN代理。有关更多信息,请参见rlDQNAgent
.
代理= rlDQNAgent(评论家,agentOpts);
要训练代理,首先指定训练选项。对于本例,使用以下选项:
每次训练最多包含1000集,每集最多500个时间步。
在“章节管理器”对话框中显示培训进度(设置情节
选项),并禁用命令行显示(设置详细的
选项假
).
当代理获得的累计移动平均奖励大于480时,停止训练。此时,agent可以在竖直位置平衡小车-杆系统。
有关更多信息,请参见rlTrainingOptions
.
trainOpts = rlTrainingOptions (...“MaxEpisodes”, 1000,...“MaxStepsPerEpisode”, 500,...“详细”假的,...“阴谋”,“训练进步”,...“StopTrainingCriteria”,“AverageReward”,...“StopTrainingValue”, 480);
您可以可视化的推车杆系统可以可视化使用情节
在训练或模拟期间的功能。
情节(env)
训练特工使用火车
函数。训练这个代理是一个计算密集的过程,需要几分钟才能完成。为了节省运行这个示例时的时间,可以通过设置加载一个预先训练过的代理doTraining
来假
.亲自训练探员,预备doTraining
来真正的
.
doTraining = false;如果doTraining%训练特工。trainingStats =火车(代理,env, trainOpts);其他的%为示例加载预训练的代理。负载(“MATLABCartpoleDQNMulti.mat”,“代理”)结束
为了验证训练后的代理的性能,请在车杆环境中进行模拟。有关代理模拟的更多信息,请参见rlSimulationOptions
和sim卡
.即使模拟时间增加到500步,该代理也能平衡小车杆。
simOptions = rlSimulationOptions (“MaxSteps”, 500);经验= sim (env,代理,simOptions);
totalReward =总和(experience.Reward)
totalReward = 500