这个例子展示了如何训练一个策略梯度(PG)代理来平衡MATLAB®建模的车杆系统。有关PG代理的更多信息,请参见政策梯度代理.
有关使用基线训练PG代理的示例,请参见用基线训练PG Agent控制双积分系统.
本例的强化学习环境是一根杆子连接在一辆小车上的一个未驱动关节上,它沿着无摩擦的轨道移动。训练目标是使钟摆直立不倒。
对于这种环境:
向上平衡摆的位置为0
弧度,向下悬挂的位置是π
弧度。
钟摆以-0.05到0.05弧度之间的初始角度垂直开始。
从agent到环境的力动作信号为-10 ~ 10n。
从环境中观测到的是小车的位置和速度、摆角和摆角导数。
如果杆子偏离垂直方向超过12度,或者推车从原来的位置移动超过2.4米,则该事件终止。
每一步杆子保持直立,奖励为+1。当钟摆下降时,惩罚值为-5。
有关此模型的更多信息,请参见负载预定义控制系统环境.
为摆创建一个预定义的环境接口。
环境= rlPredefinedEnv(“CartPole-Discrete”)
env = CartPoleDiscreteAction with properties: Gravity: 9.8000 MassCart: 1 MassPole: 0.1000 Length: 0.5000 MaxForce: 10 Ts: 0.0200 ThetaThresholdRadians: 0.2094 XThreshold: 2.4000 RewardForNotFalling: 1 PenaltyForFalling: -5 State: [4x1 double]
该界面有一个离散的动作空间,代理可以在其中对推车施加两种可能的力值之一,-10或10 N。
从环境接口获取观测和动作信息。
obsInfo = getObservationInfo(env);numObservations = obsInfo.Dimension(1);actInfo = getActionInfo(env);
固定随机生成器种子的再现性。
rng (0)
PG代理使用参与者表示来决定采取何种行动。为了创建参与者,首先创建一个深度神经网络,其中一个输入(观察)和一个输出(动作)。行动者网络有两个输出,对应于可能动作的数量。有关创建深度神经网络策略表示的更多信息,请参见创建策略和值函数表示.
actorNetwork = [featureInputLayer(numObservations,“归一化”,“没有”,“名字”,“状态”) fullyConnectedLayer (2“名字”,“俱乐部”) softmaxLayer (“名字”,“actionProb”));
使用指定参与者表示的选项rlRepresentationOptions
.
actorOpts = rlRepresentationOptions(“LearnRate”1飞行,“GradientThreshold”1);
使用指定的深度神经网络和选项创建角色表示。您还必须为评论家指定从环境接口获得的操作和观察信息。有关更多信息,请参见rlStochasticActorRepresentation
.
actor = rlStochasticActorRepresentation(actorNetwork,obsInfo,actInfo,“观察”, {“状态”}, actorOpts);
使用指定的参与者表示和默认代理选项创建代理。有关更多信息,请参见rlPGAgent
.
agent = rlpagent (actor);
要培训代理,首先指定培训选项。对于本例,使用以下选项。
每个训练集最多运行1000集,每集最多持续200个时间步。
在“事件管理器”对话框中显示培训进度情节
选项)并禁用命令行显示(设置详细的
选项假
).
当智能体在连续100集中获得的平均累积奖励大于195时停止训练。此时,agent可以将钟摆平衡在直立位置。
有关更多信息,请参见rlTrainingOptions
.
trainOpts = rlTrainingOptions(...“MaxEpisodes”, 1000,...“MaxStepsPerEpisode”, 200,...“详细”假的,...“阴谋”,“训练进步”,...“StopTrainingCriteria”,“AverageReward”,...“StopTrainingValue”, 195,...“ScoreAveragingWindowLength”, 100);
您可以通过使用情节
在训练或模拟中发挥作用。
情节(env)
培训代理使用火车
函数。训练这个代理是一个计算密集型的过程,需要几分钟才能完成。为了在运行此示例时节省时间,请通过设置加载预训练的代理doTraining
来假
.要亲自训练特工,请设置doTraining
来真正的
.
doTraining = false;如果doTraining培训代理。trainingStats = train(agent,env,trainOpts);其他的为示例加载预训练的代理。负载(“MATLABCartpolePG.mat”,“代理”);结束
为了验证训练过的智能体的性能,在车杆环境中进行了仿真。有关代理模拟的详细信息,请参见rlSimulationOptions
而且sim卡
.即使仿真时间增加到500步,agent也能平衡车杆系统。
simOptions = rlSimulationOptions(“MaxSteps”, 500);experience = sim(env,agent,simOptions);
totalReward =总和(经验。奖励)
totalReward = 500