这个例子展示了如何训练一个策略梯度(PG) agent来平衡一个在MATLAB®中建模的车杆系统。有关PG代理的更多信息,请参见政策梯度代理.
有关使用基线训练PG代理的示例,请参见用基线训练PG Agent控制双积分器系统.
本例的强化学习环境是一个连接在小车上的非驱动关节上的杆,它沿着无摩擦的轨道移动。训练目标是使钟摆直立而不摔倒。
对于这个环境:
向上平衡的摆位为0
弧度,向下悬挂的位置是π
弧度。
钟摆开始直立,初始角度在-0.05和0.05弧度之间。
agent对环境的力作用信号为-10到10 N。
从环境中观察到的是小车的位置和速度、摆角和摆角的导数。
如果杆距垂直方向超过12度,或者车距初始位置移动超过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);numObservations = obsInfo.Dimension (1);actInfo = getActionInfo (env);
修复随机生成器种子的再现性。
rng (0)
PG代理使用演员代表来决定采取什么行动。要创建参与者,首先要创建一个具有一个输入(观察)和一个输出(动作)的深度神经网络。参与者网络有两个输出,对应于可能的动作数量。有关创建深度神经网络策略表示的更多信息,请参见创建策略和价值功能表示.
actorNetwork = [featureInputLayer(numobobservations,“归一化”,“没有”,“名字”,“状态”) fullyConnectedLayer (2“名字”,“俱乐部”) softmaxLayer (“名字”,“actionProb”));
使用指定参与者表示的选项rlRepresentationOptions
.
actorOpts = rlRepresentationOptions (“LearnRate”1飞行,“GradientThreshold”1);
使用指定的深度神经网络和选项创建参与者表示。您还必须为评论家指定从环境接口获得的操作和观察信息。有关更多信息,请参见rlStochasticActorRepresentation
.
演员= rlStochasticActorRepresentation (actorNetwork obsInfo actInfo,“观察”, {“状态”}, actorOpts);
使用指定的参与者表示和默认代理选项创建代理。有关更多信息,请参见rlPGAgent
.
代理= rlPGAgent(演员);
要培训代理,首先指定培训选项。对于本示例,请使用以下选项。
每个训练集最多跑1000集,每集最多持续200个时间步。
在“插曲管理器”对话框中显示培训进度(设置情节
选项),并禁用命令行显示(设置详细的
选项假
).
在100次连续训练中,当代理获得平均累计奖励超过195时停止训练。在这一点上,代理可以平衡摆在直立的位置。
有关更多信息,请参见rlTrainingOptions
.
trainOpts = rlTrainingOptions (...“MaxEpisodes”, 1000,...“MaxStepsPerEpisode”, 200,...“详细”假的,...“阴谋”,“训练进步”,...“StopTrainingCriteria”,“AverageReward”,...“StopTrainingValue”, 195,...“ScoreAveragingWindowLength”, 100);
你可以通过使用情节
在训练或模拟过程中发挥作用。
情节(env)
训练代理人使用火车
函数。训练这个代理是一个计算密集型的过程,需要几分钟才能完成。为了节省运行此示例的时间,请通过设置加载预先训练过的代理doTraining
来假
.自己训练代理人,设置doTraining
来真正的
.
doTraining = false;如果doTraining培训代理商。trainingStats =火车(代理,env, trainOpts);其他的%加载示例的预训练代理。负载(“MATLABCartpolePG.mat”,“代理”);结束
为了验证训练过的代理的性能,在车杆环境中模拟它。有关代理模拟的更多信息,请参见rlSimulationOptions
和sim卡
.即使仿真时间增加到500步,该agent也能对车杆系统进行平衡。
simOptions = rlSimulationOptions (“MaxSteps”, 500);经验= sim (env,代理,simOptions);
totalReward =总和(experience.Reward)
totalReward = 500