训练DDPG代理用总线信号摆动和平衡摆锤
该示例展示了如何将简单的无摩擦摆Simulink®模型转换为强化学习环境接口,并在此环境中训练深度确定性策略梯度(DDPG)代理。金宝app
有关DDPG代理的更多信息,请参见深度确定性策略梯度代理.有关显示如何在MATLAB®中训练DDPG代理的示例,请参见训练DDPG Agent控制双积分系统.
摆起模型与总线
本例的起始模型是一个简单的无摩擦摆。训练目标是用最小的控制力使钟摆直立而不倒。
打开模型。
mdl =“rlSimplePendulumModelBus”;open_system (mdl)
对于这个模型:
向上平衡摆的位置为
0
弧度,向下悬挂的位置是π
弧度。从药剂到环境的力矩动作信号为-2 ~ 2n·m。
从环境中观测到的是摆角的正弦值,摆角的余弦值,以及摆角的导数。
观察信号和动作信号都是Simulink总线。金宝app
奖励 ,则为
在这里:
是垂直位置的位移角。
是位移角的导数。
是前一个时间步长的控制效果。
本例中使用的模型类似于中描述的简单摆模型加载预定义的Simulink环境金宝app.不同之处在于,本例中的模型使用Simulink总线来处理动作和观察信号。金宝app
使用总线创建环境接口
来自Simulink模型的环境接口是使用金宝apprl金宝appSimulinkEnv
,这需要Simulink模型的名称,到代理块的路径,以及观察和动作金宝app强化学习的数据规范。类为操作或观察使用总线信号的模型,可以创建相应的规范bus2RLSpec
函数。
指定代理块的路径。
agentBlk =“rlSimplePendulumModelBus / RL代理”;
创建观察公共汽车
对象。
obsBus = 金宝appSimulink.Bus();obs(1) = 金宝appSimulink.BusElement;奥林匹克广播服务公司(1)。Name =“sin_theta”;obs(2) = 金宝appSimulink.BusElement;奥林匹克广播服务公司(2)。Name =“cos_theta”;obs(3) = 金宝appSimulink.BusElement;奥林匹克广播服务公司(3)。Name =“dtheta”;obsBus。元素= obs;
创建动作公共汽车
对象。
actBus = 金宝appSimulink.Bus();act(1) = 金宝appSimulink.BusElement;(1)行动。Name =“τ”;(1)行动。Min = -2;(1)行动。Max = 2;actBus。元素=行为;
使用Simulink总线创建动作和观察规范对象。金宝app
obsInfo = bus2RLSpec(“obsBus”,“模型”、mdl);actInfo = bus2RLSpec(“actBus”,“模型”、mdl);
为钟摆模型创建强化学习环境。
env = rl金宝appSimulinkEnv(mdl,agentBlk,obsInfo,actInfo);
若要将摆的初始条件定义为向下悬挂,请使用匿名函数句柄指定环境重置函数。这个重置函数设置模型工作区变量theta0
来π
.
env。ResetFcn = @(in)setVariable(in,“theta0”π,“工作区”、mdl);
指定模拟时间特遣部队
以及代理取样时间Ts
在几秒钟内。
Ts = 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“sin_theta”,“concat /三机一体”);actorNetwork = connectLayers“cos_theta”,“concat / in2”);actorNetwork = connectLayers“dtheta”,“concat / in3”);actorNetwork = dlnetwork(actorNetwork);
查看角色网络配置。
图绘制(layerGraph (actorNetwork))
使用指定评论家表示的选项rlOptimizerOptions
.
actorOptions = rlOptimizerOptions(“LearnRate”1的军医,“GradientThreshold”1);
使用指定的深度神经网络和选项创建角色表示。您还必须为参与者指定操作和观察信息,这些信息是您从环境接口获得的。有关更多信息,请参见rlContinuousDeterministicActor
.
actor = 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 = [addtionlayer (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);临界网络= connectLayers(临界网络,“sin_theta”,“concat /三机一体”);临界网络= connectLayers(临界网络,“cos_theta”,“concat / in2”);临界网络= connectLayers(临界网络,“dtheta”,“concat / in3”);临界网络= connectLayers(临界网络,“CriticStateFC2”,“添加/三机一体”);临界网络= connectLayers(临界网络,“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);agentoptions . noiseoptions .方差= 0.6;agentoptions . noiseoptions . variancedecayrate = 1e-5;
然后使用指定的参与者表示、评论家表示和代理选项创建DDPG代理。有关更多信息,请参见rlDDPGAgent
.
agent = rlDDPGAgent(actor,批评家,agentOpts);
火车代理
要培训代理,首先指定培训选项。对于本例,使用以下选项:
每次训练最多运行50000集,每集持续时间最长
装天花板(Tf / Ts)
时间的步骤。在“事件管理器”对话框中显示培训进度
情节
选项)并禁用命令行显示(设置详细的
选项假
).当智能体连续五次获得的平均累积奖励大于-740时停止训练。在这一点上,代理可以用最小的控制努力快速平衡摆在直立位置。
为累积奖励大于-740的每一集保存一份代理副本。
有关更多信息,请参见rlTrainingOptions
.
Maxepisodes = 5000;maxsteps = ceil(Tf/Ts);trainOpts = rlTrainingOptions(...“MaxEpisodes”maxepisodes,...“MaxStepsPerEpisode”maxsteps,...“ScoreAveragingWindowLength”5,...“详细”假的,...“阴谋”,“训练进步”,...“StopTrainingCriteria”,“AverageReward”,...“StopTrainingValue”, -740);
培训代理使用火车
函数。训练这个代理是一个计算密集型的过程,需要几个小时才能完成。为了在运行此示例时节省时间,请通过设置加载预训练的代理doTraining
来假
.要亲自训练特工,请设置doTraining
来真正的
.
doTraining = false;如果doTraining培训代理。trainingStats = train(agent,env,trainOpts);其他的为示例加载预训练的代理。负载(“金宝appSimulinkPendBusDDPG.mat”,“代理”)结束
模拟DDPG Agent
为了验证训练代理的性能,在摆环境中进行了仿真。有关代理模拟的详细信息,请参见rlSimulationOptions
而且sim卡
.
simOptions = rlSimulationOptions(“MaxSteps”, 500);experience = sim(env,agent,simOptions);
另请参阅
rlDDPGAgent
|rl金宝appSimulinkEnv
|火车
|bus2RLSpec