这个例子展示了如何训练一个深度确定性策略梯度(DDPG)代理来生成在Simulink®中建模的飞行机器人的轨迹。万博1manbetx有关DDPG代理的更多信息,请参见深度确定性策略梯度代理.
本例中的强化学习环境是一个飞行机器人,其初始条件围绕一个半径环随机化15
m、 机器人的方向也是随机的。机器人有两个推进器安装在身体一侧,用于推动和引导机器人。训练目标是将机器人从初始状态驱动到面向东方的原点。
打开模型。
mdl =“rlFlyingRobotEnv”;开放式系统(mdl)
设置初始模型状态变量。
θ0=0;x0=-15;y0=0;
定义样本时间Ts
以及模拟持续时间特遣部队
.
ts = 0.4;tf = 30;
对于这个模型:
目标取向是0
rad(面向东方的机器人)。
每个执行器的推力是被限制的-1
来1
N
从环境中观察到的是机器人的位置、方向(方向的正弦和余弦)、速度和角速度。
奖赏 在每次执行步骤时提供
地点:
是机器人沿x轴的位置。
是机器人沿y轴的位置。
为机器人的方向。
是来自左推进器的控制力。
是右侧推进器的控制力。
是机器人接近目标时的奖励。
当机器人驾驶超出范围时,处罚是多少20.
M在x或y方向上。当
.
是QR惩罚,惩罚距离目标和控制努力的距离。
培训一名代理FlyingRobotEnv
模型,使用createIntegratedEnv
使用已准备好培训的RL代理块自动生成集成模型。
集成MDL=“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 =“手臂”;
使用集成模型为飞行机器人创建环境界面。
env = rl万博1manbetxSimulinkEnv (integratedMdl agentBlk、observationInfo actionInfo);
创建一个自定义重置功能,使机器人的初始位置沿半径环随机化15
M和初始方向。关于复位功能的详细介绍请参见飞行机器人
.
env.ResetFcn=@(in)flyingRobotResetFcn(in);
修复随机生成器种子以获得再现性。
rng (0)
DDPG代理通过使用批判价值函数表示来近似给定观察和行动的长期奖励。要创建批评家,首先要创建一个有两个输入(观察和行动)和一个输出的深度神经网络。有关创建神经网络值函数表示的更多信息,请参见创建策略和价值功能表示.
%指定隐藏图层的输出数。hiddenLayerSize = 100;observationPath = [featureInputLayer(numObs,“正常化”,“没有”,“名字”,“观察”) fullyConnectedLayer (hiddenLayerSize“名字”,“fc1”) reluLayer (“名字”,“relu1”) fullyConnectedLayer (hiddenLayerSize“名字”,“取得”)附加层(2,“名字”,“添加”) reluLayer (“名字”,“relu2”) fullyConnectedLayer (hiddenLayerSize“名字”,“一个fc3”文件) reluLayer (“名字”,“relu3”) fullyConnectedLayer (1,“名字”,“fc4”)];ActionPath = [FeatureInputLayer(Numact,“正常化”,“没有”,“名字”,“行动”) fullyConnectedLayer (hiddenLayerSize“名字”,“fc5”)];%创建图层图。criticNetwork = layerGraph (observationPath);criticNetwork = addLayers (criticNetwork actionPath);%将actionPath连接到observationPath。临界网络=连接层(临界网络,“fc5”,'添加/ in2');
指定评论家使用的选项rlRepresentationOptions
.
临界点=rlRepresentationOptions(“LearnRate”1 e 03“梯度阈值”,1);
使用指定的神经网络和选项创建批评家表示。您还必须为评论家指定行动和观察规范。有关更多信息,请参见rlQValueRepresentation
.
评论家= rlQValueRepresentation (criticNetwork observationInfo actionInfo,...“观察”,{“观察”},“行动”,{“行动”},批评);
DDPG代理通过使用参与者表示来决定执行给定观察的动作。要创建参与者,首先创建一个具有一个输入(观察)和一个输出(动作)的深度神经网络。
以与批评家相似的方式构造演员。有关详细信息,请参阅rlDeterministicActorRepresentation
.
ActorNetWork = [FeatureInputLayer(numobs,“正常化”,“没有”,“名字”,“观察”) fullyConnectedLayer (hiddenLayerSize“名字”,“fc1”) reluLayer (“名字”,“relu1”) fullyConnectedLayer (hiddenLayerSize“名字”,“取得”) reluLayer (“名字”,“relu2”) fullyConnectedLayer (hiddenLayerSize“名字”,“一个fc3”文件) reluLayer (“名字”,“relu3”)完全连接层(numAct,“名字”,“fc4”)坦莱尔(“名字”,“tanh1”)];actorOptions=rlRepresentationOptions(“LearnRate”1 e-04“梯度阈值”,1); actor=rlDeterministicActorRepresentation(actorNetwork、observationInfo、actionInfo、,...“观察”,{“观察”},“行动”,{“tanh1”},动植物);
要创建DDPG代理,请首先使用指定DDPG代理选项rlDDPGAgentOptions
.
agentOptions = rlDDPGAgentOptions (...“采样时间”,Ts,...“目标平滑因子”1 e - 3,...“ExperienceBufferLength”1 e6,...“折扣演员”, 0.99,...“MiniBatchSize”, 256);agentOptions.NoiseOptions.Variance = 1 e 1;agentOptions.NoiseOptions.VarianceDecayRate = 1 e-6;
然后,使用指定的参与者表示、评论家表示和代理选项创建代理。有关详细信息,请参阅rlDDPGAgent
.
代理= rlddpgagent(演员,批评者,代理选项);
要培训代理,请首先指定培训选项。对于本例,请使用以下选项:
每次训练最多进行一次20000
每集最多持续一集装天花板(Tf / Ts)
时间的步骤。
在“插曲管理器”对话框中显示培训进度(设置阴谋
选项)并禁用命令行显示(设置冗长的
选择假
).
当代理收到的平均累积奖励大于时,停止培训415
连续10集以上。此时,代理可以驱动飞行机器人到达目标位置。
为累积奖励大于的每集保存一份代理副本415
.
有关更多信息,请参见RL培训选项
.
最大事件数=20000;最大步骤数=ceil(Tf/Ts);培训选项数=RL培训选项数(...“最大集”maxepisodes,...“MaxStepsPerEpisode”,maxsteps,...“StopOnError”,“上”,...“冗长”错误的...“阴谋”,“训练进步”,...“StopTrainingCriteria”,“平均向上”,...“停止训练值”, 415,...“ScoreAveragingWindowLength”10...“SaveAgentCriteria”,“EpisodeReward”,...“SaveAgentValue”,415);
使用火车
作用培训是一个计算密集的过程,需要几个小时才能完成。要在运行此示例时节省时间,请通过设置doTraining
来假
.要亲自培训特工,请设置doTraining
来符合事实的
.
doTraining=false;如果doTraining培训代理商。trainingStats =火车(代理,env, trainingOptions);其他的%加载示例的预训练代理。负载(“FlyingRobotDDPG.mat”,“代理”)结束
要验证经过培训的代理的性能,请在环境中模拟代理。有关代理模拟的更多信息,请参阅RlsimulationOptions.
和sim卡
.
simoptions = rlsimulation选项(“MaxSteps”, maxsteps);经验= sim (env,代理,simOptions);