这个例子展示了如何训练一个actor-critic (AC) agent来平衡在MATLAB®中建模的cart-pole系统。
有关AC代理的详细信息,请参见Actor-Critic代理。有关演示如何使用并行计算训练AC代理的示例,请参见用并行计算训练交流代理平衡车杆系统。
本例的强化学习环境是一个连接到小车上的非驱动关节的杆子,小车沿着无摩擦的轨道移动。训练目标是使钟摆直立而不摔倒。
对于这种环境:
向上平衡的钟摆位置为0
弧度,向下悬挂位置为π
弧度。
钟摆以-0.05和0.5 rad之间的初始角度开始直立。
代理对环境的力作用信号为-10 ~ 10n。
从环境中观察到的是小车的位置和速度、摆角和摆角的导数。
如果杆与垂直的距离超过12度,或者如果小车从原来的位置移动超过2.4米,则比赛结束。
杆保持直立的每一步奖励+1。当钟摆落下时,罚-5分。
有关此模型的更多信息,请参见加载预定义的控制系统环境。
为钟摆创建一个预定义的环境接口。
env = rlPredefinedEnv()“CartPole-Discrete”)
env = CartPoleDiscreteAction with properties: Gravity: 9.8000 MassCart: 1 MassPole: 0.1000 Length: 0.5000 MaxForce: 10 Ts: 0.0200 thetathresholdrans: 0.2094 XThreshold: 2.4000 RewardForNotFalling: 1 PenaltyForFalling: -5 State: [4x1 double]
env。罚分forfalling = -10;
界面有一个离散的动作空间,代理可以在其中应用两种可能的力值之一,-10或10 N。
从环境接口获取观察和动作信息。
obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);
修复随机生成器种子的再现性。
rng (0)
AC代理近似长期奖励,给定观察和行动,使用批评值函数表示。要创建评论家,首先要创建一个具有一个输入(观察)和一个输出(状态值)的深度神经网络。批评家网络的输入大小为4,因为环境有4个观察值。有关创建深度神经网络值函数表示的更多信息,请参见创建策略和价值函数表示。
criticNetwork = [featureInputLayer(4,“归一化”,“没有”,“名字”,“状态”) fullyConnectedLayer (1,“名字”,“CriticFC”));
为评论家表示指定选项rlRepresentationOptions
。
criticOpts = rlRepresentationOptions()“LearnRate”, 8 e - 3,“GradientThreshold”1);
使用指定的深度神经网络和选项创建评论家表示。您还必须为评论家指定从环境接口获得的操作和观察信息。有关更多信息,请参见rlValueRepresentation
。
批评家= rlValueRepresentation(criticNetwork,obsInfo,“观察”,{“状态”}, criticOpts);
AC代理根据给定的观察结果,使用参与者表示来决定采取什么行动。为了创建参与者,创建一个具有一个输入(观察)和一个输出(动作)的深度神经网络。行动者网络的输出大小为2,因为环境有两个可能的动作,-10和10。
用与评论家相似的方式来建构演员。有关更多信息,请参见rlStochasticActorRepresentation
。
actorNetwork = [featureInputLayer(4,“归一化”,“没有”,“名字”,“状态”) fullyConnectedLayer (2“名字”,“俱乐部”) softmaxLayer (“名字”,“actionProb”));actorOpts = rlRepresentationOptions(“LearnRate”, 8 e - 3,“GradientThreshold”1);actor = rlStochasticActorRepresentation(actorNetwork,obsInfo,actInfo,…“观察”,{“状态”}, actorOpts);
要创建AC代理,首先使用指定AC代理选项rlACAgentOptions
。
agentOpts = rlACAgentOptions(…“NumStepsToLookAhead”32岁的…“DiscountFactor”, 0.99);
然后使用指定的参与者表示和默认代理选项创建代理。有关更多信息,请参见rlACAgent
。
agent = rlACAgent(演员,评论家,agentOpts);
要训练代理,首先要指定训练选项。对于本例,使用以下选项。
每个训练集最多运行1000集,每集最多持续500个时间步。
在章节管理器对话框中显示训练进度(设置情节
选项)并禁用命令行显示(设置详细的
选项假
)。
当智能体在连续10集中获得的平均累计奖励大于480时,停止训练。在这一点上,代理可以平衡摆在直立的位置。
有关更多信息,请参见rlTrainingOptions
。
trainopt = rlTrainingOptions(…“MaxEpisodes”, 1000,…“MaxStepsPerEpisode”, 500,…“详细”假的,…“阴谋”,“训练进步”,…“StopTrainingCriteria”,“AverageReward”,…“StopTrainingValue”, 480,…“ScoreAveragingWindowLength”10);
您可以在训练或模拟过程中可视化推车杆系统情节
函数。
情节(env)
对代理进行培训火车
函数。训练这个代理是一个计算密集型的过程,需要几分钟才能完成。为了在运行此示例时节省时间,请通过设置加载预训练的代理doTraining
来假
。自己训练代理,设置doTraining
来真正的
。
doTraining = false;如果doTraining%培训座席。trainingStats = train(agent,env,trainOpts);其他的为示例加载预训练的代理。负载(“MATLABCartpoleAC.mat”,“代理”);结束
为了验证经过训练的智能体的性能,可以在cart-pole环境中进行模拟。有关代理模拟的更多信息,请参见rlSimulationOptions
和sim卡
。
simOptions = rlSimulationOptions(“MaxSteps”, 500);experience = sim(env,agent,simOptions);
totalReward = sum(experience.Reward)
totalReward = 500