这个例子展示了如何训练一个深度q学习网络(DQN) agent来平衡一个在MATLAB®中建模的车杆系统。
有关DQN代理的更多信息,请参见深度Q网络代理.有关在Simulink®中培训DQN代理的示例,请参见万博1manbetx培训DQN代理摆动并平衡摆锤.
本例中的强化学习环境是一根连接到手推车上未驱动接头的杆,它沿着无摩擦的轨道移动。培训目标是使杆直立而不摔倒。
对于这个环境:
向上平衡的极点位置是0
弧度,向下悬挂的位置是π
弧度。
杆开始垂直,初始角度在-0.05和0.05弧度之间。
agent对环境的力作用信号为-10到10 N。
从环境中观察到的是小车的位置和速度、极角和极角导数。
如果电杆与垂直方向的夹角超过12度,或者如果手推车从原始位置移动超过2.4 m,则事件终止。
当杆保持直立时,奖励为+1。当杆子倒下时,罚分为-5。
有关此模型的更多信息,请参见加载预定义的控制系统环境.
为系统创建预定义的环境界面。
env=rlPredefinedEnv(“CartPole-Discrete”)
env = CartPoleDiscreteAction with properties: Gravity: 9.8000 MassCart: 1 maspole: 0.1000 Length: 0.5000 MaxForce: 10 Ts: 0.0200 thetathresholdraites: 0.2094 XThreshold: 2.4000 RewardForNotFalling: 1 PenaltyForFalling: -5 State: [4x1 double]
该界面有一个离散的动作空间,在该空间中,agent可以对小车施加两个可能的力值之一,-10或10n。
获取观察和行动规范信息。
obsInfo = getObservationInfo (env)
obsInfo=rlNumericSpec,属性:LowerLimit:-Inf上限:Inf名称:“CartPole状态”说明:“x、dx、θ、dtheta”维度:[4 1]数据类型:“双”
actInfo=getActionInfo(环境)
属性:Elements: [-10 10] Name: "CartPole Action" Description: [0x0 string] Dimension: [1 1] DataType: "double"
修复随机生成器种子的再现性。
rng(0)
一个DQN代理使用价值-功能批评家来近似给定的观察和行动的长期回报。
DQN代理可以使用多输出Q值批评近似器,通常效率更高。多输出近似器将观察值作为输入,将状态动作值作为输出。每个输出元素表示从观察值指示的状态采取相应离散动作的预期累积长期报酬投入。
要创建批评家,首先创建一个具有一个输入(4维观察状态)和一个带有两个元素(一个用于10n动作,另一个用于- 10n动作)的输出向量的深度神经网络。有关基于神经网络创建值函数表示的更多信息,请参见创建策略和值函数表示.
dnn=[featureInputLayer(obsInfo.Dimension(1),“归一化”,“没有”,“姓名”,“状态”) fullyConnectedLayer(24日“姓名”,“CriticStateFC1”)雷卢耶(“姓名”,“CriticRelu1”) fullyConnectedLayer(24日“姓名”,“CriticStateFC2”)雷卢耶(“姓名”,“CriticCommonRelu”)完整连接层(长度(actInfo.元素),“姓名”,“输出”));
查看网络配置。
图形绘图(图层图(dnn))
使用指定批评家表示的一些训练选项rlRepresentationOptions
.
criticOpts = rlRepresentationOptions (“LearnRate”,0.001,“GradientThreshold”1);
使用指定的神经网络和选项创建批评家表示。有关更多信息,请参见rlQValueRepresentation
.
评论家= rlQValueRepresentation(款、obsInfo actInfo,“观察”, {“状态”}, criticOpts);
要创建DQN代理,请首先使用指定DQN代理选项rlDQNAgentOptions
.
agentOpts=rlDQNAgentOptions(...“UsedDoubledQn”假的,...“TargetSmoothFactor”,1,...“TargetUpdateFrequency”4...“经验缓冲长度”,100000,...“DiscountFactor”,0.99,...“MiniBatchSize”, 256);
然后,使用指定的评论表示和代理选项创建DQN代理。有关更多信息,请参见rlDQNAgent
.
代理= rlDQNAgent(评论家,agentOpts);
要培训代理,首先指定培训选项。对于本例,使用以下选项:
运行一次最多包含1000集的培训课程,每集最多持续500个时间步。
在“事件管理器”对话框中显示培训进度(设置阴谋
选项)并禁用命令行显示(设置详细的
选项错误的
).
当代理获得大于480的移动平均累积奖励时停止训练。此时,agent可以使车杆系统处于直立位置。
有关更多信息,请参见rlTrainingOptions
.
培训选项=RL培训选项(...“MaxEpisodes”,1000,...“MaxStepsPerEpisode”,500,...“详细”假的,...“情节”,“培训进度”,...“停止培训标准”,“平均向上”,...“StopTrainingValue”, 480);
你可以想象车杆系统可以通过使用情节
在训练或模拟过程中发挥作用。
情节(env)
训练代理人使用火车
函数。训练这个代理是一个计算密集型的过程,需要几分钟才能完成。为了节省运行此示例的时间,请通过设置加载预先训练过的代理溺爱
到错误的
.自己训练代理人,设置溺爱
到真正的
.
doTraining = false;如果溺爱%培训代理人。trainingStats =火车(代理,env, trainOpts);其他的%加载示例的预训练代理。装载(“MATLABCartpoleDQNMulti.mat”,“代理人”)终止
要验证经过培训的代理的性能,请在cart-pole环境中对其进行模拟。有关代理模拟的更多信息,请参阅rlSimulationOptions
和模拟
。即使模拟时间增加到500步,代理也可以平衡推车杆。
simOptions = rlSimulationOptions (“MaxSteps”,500);经验=sim(环境、代理、sim选项);
totalReward=总和(经验奖励)
totalReward = 500