主要内容

训练DDPG代理用总线信号上摆和平衡摆

本例展示了如何将一个简单的无摩擦摆Simulink®模型转换为强化学习环境接口,并在此环境中训练一个深度确定性策略梯度(DDPG)代理。

有关DDPG代理的更多信息,请参见深度确定性策略梯度(DDPG)代理.有关如何在MATLAB®中训练DDPG代理的示例,请参见训练DDPG代理控制双积分器系统

带总线的摆上摆模型

本例的初始模型是一个简单的无摩擦摆。训练目标是用最小的控制力使钟摆直立而不跌倒。

打开模型。

mdl =“rlSimplePendulumModelBus”;open_system (mdl)

对于这个模型:

  • 向上平衡的钟摆位置为0弧度,向下悬挂的位置是π弧度。

  • 从试剂到环境的扭矩动作信号在-2到2 N·m之间。

  • 从环境中观察到的是摆角的正弦值,摆角的余弦值,以及摆角的导数。

  • 观察信号和动作信号都是Simulink总线。

  • 奖励 r t ,在每个时间步上提供,为

r t - θ t 2 + 0 1 θ t ˙ 2 + 0 001 u t - 1 2

在这里:

  • θ t 为从直立位置的位移角。

  • θ t ˙ 是位移角的导数。

  • u t - 1 是来自前一个时间步骤的控制努力。

本例中使用的模型类似于中描述的简单摆模型加载预定义的Simulink环境.不同之处在于,本例中的模型使用Simulink总线来处理动作和观察信号。

使用总线创建环境接口

从Simulink模型创建的环境接口使用rlSimulinkEnv,这需要Simulink模型的名称、到代理块的路径以及观察和动作强化学习的数据规范。对于使用总线信号进行操作或观察的模型,您可以使用bus2RLSpec函数。

指定代理块的路径。

agentBlk =“rlSimplePendulumModelBus / RL代理”

创建一个观察公共汽车对象。

obsBus = Simulink.Bus ();奥林匹克广播服务公司(1)= Simulink.BusElement;奥林匹克广播服务公司(1)。Name =“sin_theta”;奥林匹克广播服务公司(2)= Simulink.BusElement;奥林匹克广播服务公司(2)。Name =“cos_theta”;奥林匹克广播服务公司(3)= Simulink.BusElement;奥林匹克广播服务公司(3)。Name =“dtheta”;obsBus。元素=奥林匹克广播服务公司;

创建行动公共汽车对象。

actBus = Simulink.Bus ();行为(1)= Simulink.BusElement;(1)行动。Name =“τ”;(1)行动。Min = 2;(1)行动。Max = 2;actBus。元素=行为;

使用Simulink总线创建操作和观察规范对象。

obsInfo = bus2RLSpec (“obsBus”“模型”、mdl);actInfo = bus2RLSpec (“actBus”“模型”、mdl);

为钟摆模型创建强化学习环境。

env = rlSimulinkEnv (mdl agentBlk、obsInfo actInfo);

要将钟摆的初始条件定义为向下悬挂,请使用匿名函数句柄指定环境重置函数。这个reset函数设置模型工作区变量theta0π

env。ResetFcn = @(在)setVariable (,“theta0”π,“工作区”、mdl);

指定模拟时间特遣部队和代理采样时间Ts在几秒钟内。

t = 0.05;Tf = 20;

固定随机生成器种子的再现性。

rng (0)

创建DDPG代理

DDPG代理使用参与者表示,根据观察结果决定采取哪种操作。要创建参与者,首先创建一个具有三个输入(观察)和一个输出(动作)的深度神经网络。这三个观察结果可以使用concatenationLayer

有关创建深度神经网络值函数表示的更多信息,请参见创建政策和价值功能

sinThetaInput = featureInputLayer (1,“归一化”“没有”“名字”“sin_theta”);cosThetaInput = featureInputLayer (1,“归一化”“没有”“名字”“cos_theta”);dThetaInput = featureInputLayer (1,“归一化”“没有”“名字”“dtheta”);commonPath = [concatenationLayer(1,3,“名字”“concat”) fullyConnectedLayer (400,“名字”“ActorFC1”) reluLayer (“名字”“ActorRelu1”) fullyConnectedLayer (300,“名字”“ActorFC2”) reluLayer (“名字”“ActorRelu2”) fullyConnectedLayer (1,“名字”“ActorFC3”) tanhLayer (“名字”“ActorTanh1”) scalingLayer (“名字”“ActorScaling1”“规模”马克斯(actInfo.UpperLimit)));actorNetwork = layerGraph (sinThetaInput);actorNetwork = addLayers (actorNetwork cosThetaInput);actorNetwork = addLayers (actorNetwork dThetaInput);actorNetwork = addLayers (actorNetwork commonPath);actorNetwork = connectLayers (actorNetwork,“sin_theta”“concat /三机一体”);actorNetwork = connectLayers (actorNetwork,“cos_theta”“concat / in2”);actorNetwork = connectLayers (actorNetwork,“dtheta”“concat / in3”);actorNetwork = dlnetwork (actorNetwork);

查看actor网络配置。

图绘制(layerGraph (actorNetwork))

图中包含一个axes对象。axes对象包含一个graphplot类型的对象。

使用指定批评家表示的选项rlOptimizerOptions

actorOptions = rlOptimizerOptions (“LearnRate”1的军医,“GradientThreshold”1);

使用指定的深度神经网络和选项创建参与者表示。您还必须为参与者指定操作和观察信息,这些信息是从环境接口获得的。有关更多信息,请参见rlContinuousDeterministicActor

演员= rlContinuousDeterministicActor (actorNetwork obsInfo actInfo,...“ObservationInputNames”, (“sin_theta”“cos_theta”“dtheta”]);

DDPG代理使用临界价值函数表示来近似给出观察和行动的长期奖励。要创建批评家,首先创建一个深度神经网络,它有两个输入,即观察和动作,和一个输出,即状态动作值。

用与演员相似的方式来构建评论家。有关更多信息,请参见rlQValueFunction

statePath = [concatenationLayer(1,3,“名字”“concat”) fullyConnectedLayer (400,“名字”“CriticStateFC1”) reluLayer (“名字”“CriticRelu1”) fullyConnectedLayer (300,“名字”“CriticStateFC2”));actionPath = [featureInputLayer(1,“归一化”“没有”“名字”“行动”) fullyConnectedLayer (300,“名字”“CriticActionFC1”“BiasLearnRateFactor”, 0)];commonPath = [additionLayer(2,“名字”“添加”) reluLayer (“名字”“CriticCommonRelu”) fullyConnectedLayer (1,“名字”“CriticOutput”));criticNetwork = layerGraph (sinThetaInput);criticNetwork = addLayers (criticNetwork cosThetaInput);criticNetwork = addLayers (criticNetwork dThetaInput);criticNetwork = addLayers (criticNetwork actionPath);criticNetwork = addLayers (criticNetwork statePath);criticNetwork = addLayers (criticNetwork commonPath);criticNetwork = connectLayers (criticNetwork,“sin_theta”“concat /三机一体”);criticNetwork = connectLayers (criticNetwork,“cos_theta”“concat / in2”);criticNetwork = connectLayers (criticNetwork,“dtheta”“concat / in3”);criticNetwork = connectLayers (criticNetwork,“CriticStateFC2”“添加/三机一体”);criticNetwork = connectLayers (criticNetwork,“CriticActionFC1”“添加/ in2”);criticOptions = rlOptimizerOptions (“LearnRate”1 e 03“GradientThreshold”1);评论家= rlQValueFunction (criticNetwork obsInfo actInfo,...“ObservationInputNames”, (“sin_theta”“cos_theta”“dtheta”),“ActionInputNames”“行动”);

要创建DDPG代理,首先使用指定DDPG代理选项rlDDPGAgentOptions

agentOpts = rlDDPGAgentOptions (...“SampleTime”Ts,...“ActorOptimizerOptions”actorOptions,...“CriticOptimizerOptions”criticOptions,...“ExperienceBufferLength”1 e6,...“MiniBatchSize”, 128);agentOpts.NoiseOptions.Variance = 0.6;agentOpts.NoiseOptions.VarianceDecayRate = 1 e-5;

然后使用指定的参与者表示、批评家表示和代理选项创建DDPG代理。有关更多信息,请参见rlDDPGAgent

代理= rlDDPGAgent(演员、评论家、agentOpts);

火车代理

要培训代理,首先要指定培训选项。对于本例,使用以下选项:

  • 每次训练不超过50000集,每集不超过50000集装天花板(Tf / Ts)时间的步骤。

  • 在“集训管理器”对话框中显示训练进度情节选项)并禁用命令行显示(设置详细的选项).

  • 当代理连续五集获得的平均累积奖励大于-740时停止训练。在这一点上,代理可以用最小的控制努力快速平衡摆在直立位置。

  • 为每一集累积奖励大于-740的场景保存一份代理副本。

有关更多信息,请参见rlTrainingOptions

maxepisodes = 5000;maxsteps =装天花板(Tf / Ts);trainOpts = rlTrainingOptions (...“MaxEpisodes”maxepisodes,...“MaxStepsPerEpisode”maxsteps,...“ScoreAveragingWindowLength”5,...“详细”假的,...“阴谋”“训练进步”...“StopTrainingCriteria”“AverageReward”...“StopTrainingValue”, -740);

训练代理使用火车函数。训练这个代理是一个计算密集的过程,需要几个小时才能完成。要在运行此示例时节省时间,请通过设置加载预先训练过的代理doTraining.亲自训练探员,设doTraining真正的

doTraining = false;如果doTraining培训代理。trainingStats =火车(代理,env, trainOpts);其他的为示例加载预先训练过的代理。负载(“SimulinkPendBusDDPG.mat”“代理”结束

模拟DDPG代理

要验证经过训练的代理的性能,请在摆环境中对其进行模拟。有关代理模拟的更多信息,请参见rlSimulationOptions而且sim卡

simOptions = rlSimulationOptions (“MaxSteps”, 500);经验= sim (env,代理,simOptions);

{

另请参阅

|||

相关的话题

Baidu
map