这个例子展示了如何训练一个深度q学习网络(DQN) agent来平衡一个在MATLAB®中建模的车杆系统。
有关DQN代理的更多信息,请参见深度Q-Network代理商.有关在Simulink®中培训DQN代理的示例,请参见金宝app培训DQN Agent以摆动和平衡摆锤.
用于该示例的增强学习环境是连接到推车上的unactuat接头的杆,其沿着无摩擦轨道移动。培训目标是让杆子直立而不会摔倒。
对于这个环境:
向上平衡的极点位置是0.
弧度,向下悬挂的位置是π
弧度。
杆从直立开始,初始角度在-0.05和0.05弧度之间。
agent对环境的力作用信号为-10到10 N。
来自环境的观察是推车,极角和极角衍生物的位置和速度。
如果杆从垂直或撞车从原始位置移动超过2.4米,杆终止终止。
当杆保持直立时,奖励为+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 name:“castpole状态”描述:“x,dx,dtheta”维度:[4 1]数据类型:“double”
Actinfo = GetActionInfo(Env)
属性: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.Elements),'姓名'那'输出'));
查看网络配置。
图绘图(层图(DNN))
指定使用批评者表示的一些培训选项rlrepresentationOptions.
.
criticOpts = rlRepresentationOptions ('学习',0.001,'gradientthreshold'1);
使用指定的神经网络和选项创建批评家表示。有关更多信息,请参见rlqvalueerepresentation
.
评论家= rlQValueRepresentation(款、obsInfo actInfo,'观察', {“状态”}, criticOpts);
要创建DQN代理,请首先指定DQN代理选项使用rlDQNAgentOptions
.
Agentopts = RLDQNAGENTOPTIONS(......'unmorblebledqn'假的,......“TargetSmoothFactor”, 1......“TargetUpdateFrequency”4......'经验BufferLength',100000,......“DiscountFactor”,0.99,......'minibatchsize', 256);
然后,使用指定的评论表示和代理选项创建DQN代理。有关更多信息,请参见rlDQNAgent
.
代理= rlDQNAgent(评论家,agentOpts);
要培训代理,首先指定培训选项。对于本例,使用以下选项:
运行一个培训会话,包含最多1000个剧集,每个集发作持续到最多500个时间步长。
在Episode Manager对话框中显示培训进度(设置绘图
选项)并禁用命令行显示(设置详细的
选项错误的
)。
当代理获得大于480的移动平均累积奖励时停止训练。此时,agent可以使车杆系统处于直立位置。
有关更多信息,请参见rlTrainingOptions
.
训练= rltrainingOptions(......“MaxEpisodes”,1000,......“MaxStepsPerEpisode”,500,......'verbose'假的,......'plots'那'培训 - 进步'那......'stoptrinaincriteria'那'AverageReward'那......“StopTrainingValue”, 480);
你可以想象车杆系统可以通过使用阴谋
培训或模拟期间的功能。
情节(env)
训练代理人使用火车
函数。训练这个代理是一个计算密集型的过程,需要几分钟才能完成。为了节省运行此示例的时间,请通过设置加载预先训练过的代理用圆形
到错误的
.自己训练代理人,设置用圆形
到真正的
.
doTraining = false;如果用圆形%训练代理人。trainingStats =火车(代理,env, trainOpts);别的%加载预磨料的代理。加载('matlabcartpoledqnmulti.mat'那'代理人')结尾
要验证培训的代理的性能,请在推车杆环境中模拟它。有关代理模拟的更多信息,请参阅rlSimulationOptions
和SIM
.即使模拟时间增加到500步,代理也可以平衡推车极。
simOptions = rlSimulationOptions (“MaxSteps”,500);体验= SIM(ENV,Agent,SimOptions);
TotalReward = Sum(经验.Rward)
totalReward = 500