这个例子展示了如何训练一个深度确定性策略梯度(DDPG)代理摆动和平衡一个在Simulink®中建模的摆。金宝app
有关DDPG代理的更多信息,请参见深度确定性策略梯度代理.在MATLAB®中训练DDPG代理的示例,请参见培训DDPG Agent控制双积分系统.
本例的强化学习环境是一个简单的无摩擦摆,最初挂在一个向下的位置。训练目标是用最小的控制力使钟摆直立而不倾倒。
打开模型。
mdl =“rlSimplePendulumModel”;open_system (mdl)
对于这个模型:
向上平衡的摆位为0
弧度,向下悬挂的位置是π
弧度。
agent对环境的力矩动作信号为-2 ~ 2n·m。
从环境中观察到的是摆角的正弦值,摆角的余弦值,以及摆角的导数值。
奖励 ,在每个时间步长时,为
在这里:
为从垂直位置位移的角度。
是位移角的导数。
是上一个时间步骤的控制工作。
有关此模型的更多信息,请参见加载预定义的Simulink环境金宝app.
为摆创建一个预定义的环境接口。
env = rlPredefinedEnv (“SimplePendulumModel-Continuous”)
env = 金宝appSimulinkEnvWithAgent with properties: Model: rlSimplePendulumModel AgentBlock: rlSimplePendulumModel/RL Agent ResetFcn: [] UseFastRestart: on . env = SimulinkEnvWithAgent with properties: Model: rlSimplePendulumModel
该界面有一个连续的作用空间,在该空间中,agent可以向摆施加扭矩值在-2到2 N·m之间。
设置环境的观测值为摆角的正弦值、摆角的余弦值和摆角的导数值。
numObs = 3;set_param (“rlSimplePendulumModel /创建观察”,“ThetaObservationHandling”,“要求”);
若要定义摆的初始状态为向下悬挂,请使用匿名函数句柄指定环境复位函数。这个重置函数设置模型工作区变量theta0
来π
.
env。ResetFcn = @(在)setVariable (,“theta0”π,“工作区”、mdl);
指定模拟时间特遣部队
以及样本时间Ts
在几秒钟内。
t = 0.05;Tf = 20;
修复随机生成器种子的再现性。
rng (0)
DDPG代理使用批判价值函数表示来近似给定的观察和行动的长期回报。要创建批评家,首先要创建一个有两个输入(状态和动作)和一个输出的深度神经网络。有关创建深度神经网络值函数表示的更多信息,请参见创建策略和价值功能表示.
statePath = [featureInputLayer(numObs,“归一化”,“没有”,“名字”,“观察”) fullyConnectedLayer (400,“名字”,“CriticStateFC1”) reluLayer (“名字”,“CriticRelu1”) fullyConnectedLayer (300,“名字”,“CriticStateFC2”));actionPath = [featureInputLayer(1,“归一化”,“没有”,“名字”,“行动”) fullyConnectedLayer (300,“名字”,“CriticActionFC1”,“BiasLearnRateFactor”, 0)];commonPath =[附加路径]“名字”,“添加”) reluLayer (“名字”,“CriticCommonRelu”) fullyConnectedLayer (1,“名字”,“CriticOutput”));criticNetwork = layerGraph ();criticNetwork = addLayers (criticNetwork statePath);criticNetwork = addLayers (criticNetwork actionPath);criticNetwork = addLayers (criticNetwork commonPath);criticNetwork = connectLayers (criticNetwork,“CriticStateFC2”,“添加/三机一体”);criticNetwork = connectLayers (criticNetwork,“CriticActionFC1”,“添加/ in2”);
查看critical网络配置。
图绘制(criticNetwork)
为使用的批评家表示指定选项rlRepresentationOptions
.
criticOpts = rlRepresentationOptions (“LearnRate”1 e 03“GradientThreshold”1);
使用指定的深度神经网络和选项创建批评家表示。您还必须为评论家指定操作和观察信息,这些信息是从环境接口获得的。有关更多信息,请参见rlQValueRepresentation
.
obsInfo = getObservationInfo (env);actInfo = getActionInfo (env);评论家= rlQValueRepresentation (criticNetwork obsInfo actInfo,“观察”,{“观察”},“行动”,{“行动”}, criticOpts);
DDPG代理使用参与者表示来决定对给定的观察采取什么行动。要创建参与者,首先创建一个深度神经网络,有一个输入,一个观察,和一个输出,一个动作。
以类似于评论家的方式构思行动者。有关更多信息,请参见rlDeterministicActorRepresentation
.
[featureInputLayer(nummobs,“归一化”,“没有”,“名字”,“观察”) fullyConnectedLayer (400,“名字”,“ActorFC1”) reluLayer (“名字”,“ActorRelu1”) fullyConnectedLayer (300,“名字”,“ActorFC2”) reluLayer (“名字”,“ActorRelu2”) fullyConnectedLayer (1,“名字”,“ActorFC3”) tanhLayer (“名字”,“ActorTanh”) scalingLayer (“名字”,“ActorScaling”,“规模”马克斯(actInfo.UpperLimit)));actorOpts = rlRepresentationOptions (“LearnRate”1 e-04“GradientThreshold”1);演员= rlDeterministicActorRepresentation (actorNetwork obsInfo actInfo,“观察”,{“观察”},“行动”,{“ActorScaling”}, actorOpts);
要创建DDPG代理,首先使用rlDDPGAgentOptions
.
agentOpts = rlDDPGAgentOptions (...“SampleTime”Ts,...“TargetSmoothFactor”1 e - 3,...“ExperienceBufferLength”1 e6,...“DiscountFactor”, 0.99,...“MiniBatchSize”, 128);agentOpts.NoiseOptions.Variance = 0.6;agentOpts.NoiseOptions.VarianceDecayRate = 1 e-5;
然后使用指定的参与者表示、评论家表示和代理选项创建DDPG代理。有关更多信息,请参见rlDDPGAgent
.
代理= rlDDPGAgent(演员、评论家、agentOpts);
要培训代理,首先指定培训选项。对于本示例,请使用以下选项。
跑步训练最多50000集,每集最多持续时间装天花板(Tf / Ts)
时间的步骤。
在“插曲管理器”对话框中显示培训进度(设置情节
选项),并禁用命令行显示(设置详细的
选项假
).
当经纪人在连续五次的训练中获得超过-740的平均累积奖励时,停止训练。在这一点上,代理可以快速平衡摆在直立的位置,使用最小的控制努力。
为累积奖励大于-740的每一集保存一份代理副本。
有关更多信息,请参见rlTrainingOptions
.
maxepisodes = 5000;maxsteps =装天花板(Tf / Ts);trainOpts = rlTrainingOptions (...“MaxEpisodes”maxepisodes,...“MaxStepsPerEpisode”maxsteps,...“ScoreAveragingWindowLength”5,...“详细”假的,...“阴谋”,“训练进步”,...“StopTrainingCriteria”,“AverageReward”,...“StopTrainingValue”, -740,...“SaveAgentCriteria”,“EpisodeReward”,...“SaveAgentValue”, -740);
训练代理人使用火车
函数。训练这个代理是一个计算密集型的过程,需要几个小时才能完成。为了节省运行此示例的时间,请通过设置加载预先训练过的代理doTraining
来假
.自己训练代理人,设置doTraining
来真正的
.
doTraining = false;如果doTraining培训代理商。trainingStats =火车(代理,env, trainOpts);其他的%加载示例的预训练代理。负载(“金宝appSimulinkPendulumDDPG.mat”,“代理”)结束
为了验证训练过的代理的性能,在摆环境中模拟它。有关代理模拟的更多信息,请参见rlSimulationOptions
和sim卡
.
simOptions = rlSimulationOptions (“MaxSteps”, 500);经验= sim (env,代理,simOptions);
rlDDPGAgent
|rl金宝appSimulinkEnv
|火车