这个例子演示了如何训练一个深度确定性策略梯度(DDPG)代理来生成Simulink®中模拟的飞行机器人的轨迹。万博1manbetx有关DDPG代理的更多信息,请参见深度确定性策略梯度代理.
这个例子的强化学习环境是一个飞行机器人,它的初始条件是随机的,围绕一个半径为的环15
其中机器人的方向也是随机的。机器人有两个推进器安装在身体的一侧,用来推动和操纵机器人。训练目标是将机器人从初始状态驱动到面向东方的原点。
打开模型并设置初始模型变量。
mdl =“rlFlyingRobotEnv”;open_system (mdl)初始模型状态变量theta0 = 0;x0 = -15;y0 = 0;%样品时间t = 0.4;%仿真长度Tf = 30;
对于这个模型:
目标定位是0
弧度(机器人面朝东)。
来自每个驱动器的推力是有界的1
来1
N
从环境中观察到的是机器人的位置、方向(方向的正弦和余弦)、速度和角速度。
奖励 ,在每个时刻的步长为:
地点:
是机器人在x轴上的位置。
是机器人在y轴上的位置。
是机器人的方向。
是左侧推进器的控制力。
是右侧推进器的控制力。
是机器人接近目标时的奖励。
当机器人超越时处罚是什么20.
m在x或y方向上。仿真在何时终止
.
是一种惩罚距离目标和控制努力的QR惩罚。
培训代理人FlyingRobotEnv
模型,使用createIntegratedEnv
功能自动生成与RL代理块集成的模型,该模型可用于培训。
integratedMdl =“IntegratedFlyingRobot”;[~,agentBlk observationInfo actionInfo] = createIntegratedEnv (mdl integratedMdl);
在创建环境对象之前,请为观察和操作规范指定名称,并在它们之间绑定推力操作1
和1
.
该环境的观测信号为 .
numObs = prod (observationInfo.Dimension);observationInfo。Name =“观察”;
这种环境的动作信号是 .
numAct = prod (actionInfo.Dimension);actionInfo。lowerLimit = -ones(numAct,1); actionInfo.UpperLimit = ones(numAct,1); actionInfo.Name =“手臂”;
为飞行机器人创建一个环境接口rl万博1manbetxSimulinkEnv
使用生成的模型。
env = rl万博1manbetxSimulinkEnv (integratedMdl agentBlk、observationInfo actionInfo);
创建一个自定义重置函数,该函数沿着一个半径为1的环随机化机器人的初始位置15
m和初始方向。看到flyingRobotResetFcn
查看重置函数的详细信息。
env。ResetFcn = @(in) flyingRobotResetFcn(in);
修正随机产生的种子的可重复性。
rng (0)
DDPG代理使用评论家值函数表示来近似给定的观察和操作的长期回报。要创建批评家,首先创建一个有两个输入(观察和动作)和一个输出的深度神经网络。有关创建神经网络值函数表示的更多信息,请参见创建策略和值函数表示.
指定隐藏层的输出数量。hiddenLayerSize = 100;observationPath = [imageInputLayer([numObs 11 1]),“归一化”,“没有”,“名字”,“观察”)fullyConnectedLayer (hiddenLayerSize“名字”,“fc1”)reluLayer (“名字”,“relu1”)fullyConnectedLayer (hiddenLayerSize“名字”,“取得”)additionLayer (2“名字”,“添加”)reluLayer (“名字”,“relu2”)fullyConnectedLayer (hiddenLayerSize“名字”,“一个fc3”文件)reluLayer (“名字”,“relu3”)fullyConnectedLayer (1,“名字”,“fc4”));actionPath = [imageInputLayer([numAct 11]),“归一化”,“没有”,“名字”,“行动”)fullyConnectedLayer (hiddenLayerSize“名字”,“fc5”));创建层图criticNetwork = layerGraph (observationPath);criticNetwork = addLayers (criticNetwork actionPath);%连接actionPath到obervationPathcriticNetwork = connectLayers (criticNetwork,“fc5”,“添加/ in2”);
指定评论家使用的选项rlRepresentationOptions
.
criticOptions = rlRepresentationOptions (“LearnRate”1 e 03“GradientThreshold”1);
使用指定的神经网络和选项创建批评家表示。您还必须指定评论家的操作和观察规范。有关更多信息,请参见rlQValueRepresentation
.
评论家= rlQValueRepresentation (criticNetwork observationInfo actionInfo,…“观察”,{“观察”},“行动”,{“行动”},criticOptions);
DDPG代理使用一个参与者表示来决定采取哪个动作。要创建actor,首先创建一个深度神经网络,其中有一个输入(观察)和一个输出(动作)。
用与批评家相似的方式构造这个演员。有关更多信息,请参见rlDeterministicActorRepresentation
.
actorNetwork = [imageInputLayer([numObs 11 1]),“归一化”,“没有”,“名字”,“观察”)fullyConnectedLayer (hiddenLayerSize“名字”,“fc1”)reluLayer (“名字”,“relu1”)fullyConnectedLayer (hiddenLayerSize“名字”,“取得”)reluLayer (“名字”,“relu2”)fullyConnectedLayer (hiddenLayerSize“名字”,“一个fc3”文件)reluLayer (“名字”,“relu3”)fullyConnectedLayer (numAct“名字”,“fc4”)tanhLayer (“名字”,“tanh1”));actorOptions = rlRepresentationOptions (“LearnRate”1 e-04“GradientThreshold”1);演员= rlDeterministicActorRepresentation (actorNetwork observationInfo actionInfo,…“观察”,{“观察”},“行动”,{“tanh1”},actorOptions);
要创建DDPG代理,首先使用以下命令指定DDPG代理选项rlDDPGAgentOptions
.
agentOptions = rlDDPGAgentOptions (…“SampleTime”Ts,…“TargetSmoothFactor”1 e - 3,…“ExperienceBufferLength”1 e6,…“DiscountFactor”,0.99,…“MiniBatchSize”,256);agentOptions.NoiseOptions。方差= 1 e 1;agentOptions.NoiseOptions。VarianceDecayRate = 1 e-6;
然后,使用指定的actor表示、批评家表示和代理选项创建代理。有关更多信息,请参见rlDDPGAgent
.
代理= rlDDPGAgent(演员、评论家、agentOptions);
要培训代理,首先指定培训选项。对于本例,使用以下选项:
每次训练最多进行2次0000
每一集最多持续一集装天花板(Tf / Ts)
时间的步骤。
在“事件管理器”对话框中显示培训进度情节
选项)和禁用命令行显示(设置详细的
选项假
)。
当代理收到的平均累积奖励大于时停止训练415
连续十集以上。此时,agent可以驱动飞行器到达目标位置。
为每一集保存一份代理的副本,其中累积奖励大于415
.
有关更多信息,请参见rlTrainingOptions
.
maxepisodes = 20000;maxsteps =装天花板(Tf / Ts);trainingOptions = rlTrainingOptions (…“MaxEpisodes”maxepisodes,…“MaxStepsPerEpisode”maxsteps,…“StopOnError”,“上”,…“详细”假的,…“阴谋”,“训练进步”,…“StopTrainingCriteria”,“AverageReward”,…“StopTrainingValue”,415,…“ScoreAveragingWindowLength”10…“SaveAgentCriteria”,“EpisodeReward”,…“SaveAgentValue”,415);
使用。训练代理火车
函数。这是一个计算密集型的过程,需要几个小时才能完成。要在运行此示例时节省时间,请通过设置加载预训练的代理doTraining
来假
.自己训练特工,开始doTraining
来真正的
.
doTraining = false;如果doTraining培训代理商。trainingStats =火车(代理,env, trainingOptions);其他的%加载预训练的代理为例。负载(“FlyingRobotDDPG.mat”,“代理”)结束
为了验证训练后的代理的性能,可以在单摆环境中进行仿真。有关代理模拟的更多信息,请参见rlSimulationOptions
和sim卡
.
simOptions = rlSimulationOptions (“MaxSteps”,maxsteps);经验= sim (env,代理,simOptions);