训练交流装置平衡车杆系统
这个例子展示了如何训练一个actor-批评家(AC)代理来平衡MATLAB®中建模的车-杆系统。
有关AC代理的更多信息,请参见Actor-Critic代理.有关显示如何使用并行计算训练AC代理的示例,请参见用并行计算训练交流代理平衡车-杆系统.
Cart-Pole MATLAB环境
本例的强化学习环境是一根杆子,拴在小车上的一个不受驱动的关节上,小车沿着无摩擦的轨道移动。训练目标是使钟摆直立不跌倒。
对于这个环境:
向上平衡的钟摆位置为
0
弧度,向下悬挂的位置是π
弧度。钟摆垂直开始,初始角度在-0.05到0.05 rad之间。
从代理到环境的力动作信号是-10或10牛。
从环境中观察到的是推车的位置和速度、摆角和摆角的导数。
如果极点与垂直的距离超过12度,或者如果推车移动到距离原来位置超过2.4米,则事件终止。
杆子保持直立的每一步奖励+1。当钟摆下降时,施加-5的惩罚。
有关此模型的更多信息,请参见负载预定义控制系统环境.
创建环境接口
为钟摆创建一个预定义的环境接口。
env = rlPredefinedEnv (“CartPole-Discrete”)
env = cartpoledistteaction with properties: Gravity: 9.8000 MassCart: 1 masspoole: 0.1000 Length: 0.5000 MaxForce: 10 Ts: 0.0200 thetathresholdraans: 0.2094 XThreshold: 2.4000 RewardForNotFalling: 1 pendtyforfalling: -5 State: [4x1 double]
env。PenaltyForFalling = -10;
该界面有一个离散的动作空间,代理可以在其中向推车施加两种可能的力值之一,-10或10 N。
从环境接口获取观测和动作信息。
obsInfo = getObservationInfo (env);actInfo = getActionInfo (env);
固定随机生成器种子的再现性。
rng (0)
创建交流代理
AC代理使用价值函数批评家逼近贴现累积长期报酬。价值函数批评家必须接受一个观察结果作为输入,并返回一个单一标量(估计的折现累积长期奖励)作为输出。
为了近似评价内的值函数,可以使用神经网络。将网络定义为层对象的数组,并从环境规范对象中获取观察空间的维度和可能的操作数量。有关创建深度神经网络值函数表示的更多信息,请参见创建政策和价值功能.
criticNet = [featureInputLayer(obsInfo.Dimension(1)) fullyConnectedLayer(32) reluLayer fullyConnectedLayer(1)];
转换为dlnetwork
并显示权重的数量。
criticNet = dlnetwork (criticNet);总结(criticNet)
可学习的数量:193输入:1 '输入' 4个特性
使用创建临界近似器对象criticNet
、观察规范。有关更多信息,请参见rlValueFunction
.
评论家= rlValueFunction (criticNet obsInfo);
用随机的观察输入检查批评家。
getValue(评论家,{兰德(obsInfo.Dimension)})
ans =单-0.3590
AC代理使用随机策略来决定采取哪种行动,对于离散的行动空间,该策略近似于离散的范畴行动者。这个actor必须将观察信号作为输入,并为每个动作返回一个概率。
为了近似actor内部的策略函数,可以使用深度神经网络。将网络定义为层对象的数组,并从环境规范对象中获取观察空间的维度和可能的操作数量。
actorNet = [featureInputLayer(obsInfo.Dimension(1)) fullyConnectedLayer(32) reluLayer fullyConnectedLayer(numl (actInfo.Elements)) softmaxLayer];
转换为dlnetwork
并显示权重的数量。
actorNet = dlnetwork (actorNet);总结(actorNet)
可学习的数量:226输入:1 '输入' 4个特性
使用创建actor近似器对象actorNet
以及观察和行动规范。有关更多信息,请参见rlDiscreteCategoricalActor
.
演员= rlDiscreteCategoricalActor (actorNet obsInfo actInfo);
要返回作为随机观察函数的可能动作的概率分布,并给定当前网络权重,使用evaluate。
复审委员会=评估(演员,{兰德(obsInfo.Dimension)})
复审委员会=1 x1单元阵列{2 x1单}
复审委员会{1}
ans =2x1单列向量0.4414 - 0.5586
使用actor和批评家创建代理。有关更多信息,请参见rlACAgent
.
代理= rlACAgent(演员、批评);
用随机观测输入检查代理。
getAction(代理,{兰德(obsInfo.Dimension)})
ans =1 x1单元阵列{[-10]}
使用点符号指定代理选项,包括演员和评论家的训练选项。或者,您也可以使用rlACAgentOptions
而且rlOptimizerOptions
对象,然后创建代理。
agent.AgentOptions.EntropyLossWeight = 0.01;agent.AgentOptions.ActorOptimizerOptions.LearnRate = 1飞行;agent.AgentOptions.ActorOptimizerOptions.GradientThreshold = 1;agent.AgentOptions.CriticOptimizerOptions.LearnRate = 1飞行;agent.AgentOptions.CriticOptimizerOptions.GradientThreshold = 1;
火车代理
要培训代理,首先要指定培训选项。对于本例,使用以下选项。
每集训练最多1000集,每集持续最多500个时间步。
在“集训管理器”对话框中显示训练进度
情节
选项)并禁用命令行显示(设置详细的
选项假
).当代理连续10集获得的平均累积奖励超过480时停止训练。此时,代理可以将钟摆保持在直立位置。
有关更多信息,请参见rlTrainingOptions
.
trainOpts = rlTrainingOptions (...MaxEpisodes = 1000,...MaxStepsPerEpisode = 500,...Verbose = false,...情节=“训练进步”,...StopTrainingCriteria =“AverageReward”,...StopTrainingValue = 480,...ScoreAveragingWindowLength = 10);
可以在训练或模拟过程中可视化车杆系统情节
函数。
情节(env)
训练代理使用火车
函数。训练这个代理是一个计算密集的过程,需要几分钟才能完成。要在运行此示例时节省时间,请通过设置加载预先训练过的代理doTraining
来假
.亲自训练探员,设doTraining
来真正的
.
doTraining = false;如果doTraining培训代理。trainingStats =火车(代理,env, trainOpts);其他的为示例加载预先训练过的代理。负载(“MATLABCartpoleAC.mat”,“代理”);结束
模拟交流代理
为了验证训练过的代理的性能,在车杆环境中模拟它。有关代理模拟的更多信息,请参见rlSimulationOptions
而且sim卡
.
simOptions = rlSimulationOptions (MaxSteps = 500);经验= sim (env,代理,simOptions);
totalReward =总和(experience.Reward)
totalReward = 500