这个例子展示了如何训练一个深度Q-learning network (DQN) agent来平衡MATLAB®中建模的车杆系统。
有关DQN代理的更多信息,请参见深Q-Network代理。有关在Simulink®中培训DQN代理的示例,请参见万博1manbetx训练DQN试剂上摆和平衡摆。
本例中的强化学习环境是一个连接在小车上的非驱动关节上的杆,它沿着无摩擦的轨道移动。训练的目标是使钟摆直立而不跌倒。
对于这个环境:
向上的平衡摆位置是0
弧度,向下的悬挂位置是π
弧度
钟摆以+/- 0.05弧度的初始角度开始直立
从agent到环境的力作用信号为-10到10n
从环境中观察到的是小车的位置和速度、摆角及其导数
如果磁极与垂直方向的角度超过12度,或者小车与原始位置的移动距离超过2.4米,那么这一集就结束了
每向前走一步,就会得到+1的奖励。当钟摆下落时,惩罚为-5。
有关此模型的更多信息,请参见加载预定义的控制系统环境。
为摆锤创建一个预定义的环境接口。
env = rlPredefinedEnv (“CartPole-Discrete”)
env = cartpole离散作用与属性:引力:9.8000 MassCart: 1 MassCart: 0.1000长度:0.5000 MaxForce: 10 Ts: 0.0200
该接口有一个离散的动作空间,在这个空间中,代理可以将两个可能的力值中的一个应用到cart, -10或10n。
修正随机生成器种子的可重复性。
rng (0)
DQN代理使用批评值函数表示来近似给出的观察和操作的长期回报。要创建批评家,首先要创建一个包含两个输入(状态和动作)和一个输出的深度神经网络。有关创建神经网络值函数表示的更多信息,请参见创建策略和值函数表示。
statePath = [imageInputLayer([4 1 1]),“归一化”,“没有”,“名字”,“状态”)fullyConnectedLayer(24日“名字”,“CriticStateFC1”)reluLayer (“名字”,“CriticRelu1”)fullyConnectedLayer(24日“名字”,“CriticStateFC2”));actionPath = [imageInputLayer([1,1,1]),“归一化”,“没有”,“名字”,“行动”)fullyConnectedLayer(24日“名字”,“CriticActionFC1”));commonPath = [additionLayer(2,“名字”,“添加”)reluLayer (“名字”,“CriticCommonRelu”)fullyConnectedLayer (1,“名字”,“输出”));criticNetwork = layerGraph (statePath);关键网络= addLayers(关键网络,动作路径);关键网络= addLayers(关键网络,公共路径);criticNetwork = connectLayers (criticNetwork,“CriticStateFC2”,“添加/三机一体”);criticNetwork = connectLayers (criticNetwork,“CriticActionFC1”,“添加/ in2”);
查看评论家网络配置。
图绘制(criticNetwork)
指定使用的批评家表示的选项rlRepresentationOptions
。
criticOpts = rlRepresentationOptions (“LearnRate”,0.01,“GradientThreshold”1);
使用指定的神经网络和选项创建批评家表示。您还必须指定批评家的操作和观察信息,这些信息是从环境接口获得的。有关更多信息,请参见rlQValueRepresentation
。
obsInfo = getObservationInfo (env);actInfo = getActionInfo (env);评论家= rlQValueRepresentation (criticNetwork obsInfo actInfo,“观察”,{“状态”},“行动”,{“行动”},criticOpts);
要创建DQN代理,首先使用以下命令指定DQN代理选项rlDQNAgentOptions
。
agentOpts = rlDQNAgentOptions (…“UseDoubleDQN”假的,…“TargetUpdateMethod”,“周期”,…“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);其他的为例加载预训练的代理。负载(“MATLABCartpoleDQN.mat”,“代理”);结束
为了验证训练后的agent的性能,可以在cart-pole环境中对其进行仿真。有关代理模拟的更多信息,请参见rlSimulationOptions
和sim卡
。当仿真时间增加到500时,智能体仍能保持平衡。
simOptions = rlSimulationOptions (“MaxSteps”,500);经验= sim (env,代理,simOptions);
totalReward =总和(experience.Reward)
totalReward = 500