这个例子展示了如何在Simulink®中训练深度确定性策略梯度(DDPG)代理用于路径跟踪控制(PFC)。金宝app有关DDPG代理的更多信息,请参见据A.href="//www.tatmou.com/help/reinforcement-learning/ug/ddpg-agents.html" class="a">深度确定性策略梯度代理据/a>.据/p>
本例的强化学习环境是用于自我汽车的简单自行车模型和用于引导汽车的简单纵向模型。训练目标是让自我车以设定的速度行驶,同时通过控制纵向加速和制动来保持与领先车的安全距离,同时通过控制前转向角度来使自我车保持在车道中心线上行驶。有关PFC的更多信息,请参见据A.href="//www.tatmou.com/help/mpc/ref/pathfollowingcontrolsystem.html" class="a">路径跟随控制系统据/a>(模型预测控制工具箱)据/span>.自我汽车动力学由下列参数指定。据/p>
指定两辆车的初始位置和速度。据/p>
指定静止默认间隔(m),时间间隙和驱动器设置速度(M / s)。据/p>
为了模拟车辆动态的物理限制,将加速度限制在范围内据code class="literal">(3 2)据/code>(m / s ^ 2)和转向角受约束据code class="literal">[-0.5, 0.5]据/code>(rad)。据/p>
道路的曲率定义为常数0.001 (据span class="inlineequation">
m = 1600;据span style="color:#228B22">车辆总质量(kg)据/span>IZ = 2875;据span style="color:#228B22">%惯性矩(MNS ^ 2)据/span>如果= 1.4;据span style="color:#228B22">重心到前胎纵向距离百分比(m)据/span>lr = 1.6;据span style="color:#228B22">%重心到后胎纵向距离(m)据/span>Cf = 19000;据span style="color:#228B22">前轮转弯刚度百分比(N/rad)据/span>CR = 33000;据span style="color:#228B22">后轮转弯刚度百分比(N/rad)据/span>tau = 0.5;据span style="color:#228B22">纵时间常数据/span>
x0_lead = 50;据span style="color:#228B22">%导车起始位置(m)据/span>v0_lead = 24;据span style="color:#228B22">导车初速度% (m/s)据/span>x0_ego = 10;据span style="color:#228B22">自我车初始位置(m)据/span>v0_ego = 18;据span style="color:#228B22">自我车初始速度% (m/s)据/span>
D_default = 10;t_gap = 1.4;v_set = 28;据/pre>
amin_ego = -3;Amax_ego = 2;umin_ego = -0.5;Umax_ego = 0.5;据/pre>
ρ= 0.001;e1_initial = 0.2;e2_initial = -0.1;据/pre>
定义样本时间据code class="literal">Ts据/code>和仿真持续时间据code class="literal">特遣部队据/code>在几秒钟内。据/p>
t = 0.1;Tf = 60;据/pre>
打开模型。据/p>
mdl =据span style="color:#A020F0">'rlpfcmdl'据/span>;Open_system (mdl) agentblk = [mdl . Open_system (mdl)据span style="color:#A020F0">'/ rl代理'据/span>];据/pre>
对于这个模型:据/p>
动作信号由加速和转向角动作组成。加速度动作信号在-3和2之间取值(m / s ^ 2)。转向动作信号在-15度(-0.2618 rad)和15度(0.2618rad)之间取得值。据/p>
自我车的参考速度据span class="inlineequation"> 定义如下。如果相对距离小于安全距离,自我车跟踪领先车速度和驾驶员设定速度的最小值。以这种方式,自我车与领先车保持一定的距离。如果相对距离大于安全距离,自我汽车跟踪驾驶者设定的速度。在这个例子中,安全距离被定义为自我汽车纵向速度的一个线性函数据span class="inlineequation"> ,也就是说,据span class="inlineequation"> .安全距离确定自助式汽车的跟踪速度。据/p>
来自环境的观测包含了纵向测量:速度误差据span class="inlineequation"> ,它的积分据span class="inlineequation"> ,和自我车的纵向速度据span class="inlineequation"> .此外,观察结果包含横向测量:横向偏差据span class="inlineequation"> ,相对偏航角据span class="inlineequation"> ,他们的衍生品据span class="inlineequation"> 和据span class="inlineequation"> ,他们的积分据span class="inlineequation"> 和据span class="inlineequation"> .据/p>
模拟结束时,横向偏差据span class="inlineequation"> 时,纵速度据span class="inlineequation"> ,或当铅汽车和自助车之间的相对距离据span class="inlineequation"> .据/p>
奖励据span class="inlineequation"> ,提供在每个时间步骤据span class="inlineequation"> ,是据/p>
在哪里据span class="inlineequation"> 是前一步的转向输入据span class="inlineequation"> 那据span class="inlineequation"> 为上一个时间步长的加速度输入。这三个逻辑值如下。据/p>
如果仿真终止,则为据span class="inlineequation">
如果横向错误据span class="inlineequation"> ,否则据span class="inlineequation">
如果速度误差据span class="inlineequation"> ,否则据span class="inlineequation">
奖励中的三个逻辑术语鼓励代理程序使横向误差和速度误差小,并且在此期间,如果模拟早期终止,则惩罚代理。据/p>
为Simulink模型创建一个环境界面。金宝app据/p>
创建观察规范。据/p>
observationInfo = rlNumericSpec([9 1],据span style="color:#A020F0">“LowerLimit”据/span>,-inf *那些(9,1),据span style="color:#A020F0">'上限'据/span>,正* (9,1));observationInfo。Name =据span style="color:#A020F0">“观察”据/span>;据/pre>
创建动作规范。据/p>
actionInfo = rlNumericSpec([2 1],据span style="color:#A020F0">“LowerLimit”据/span>,[ - 3; -0.2618],据span style="color:#A020F0">'上限'据/span>, 2, 0.2618);actionInfo。Name =据span style="color:#A020F0">“accel;引导”据/span>;据/pre>
创建环境界面。据/p>
env = rl金宝appSimulinkEnv (mdl agentblk、observationInfo actionInfo);据/pre>
要定义初始条件,请使用匿名功能句柄指定环境复位功能。重置功能据code class="literal">localresetfcn.据/code>,它是在例子的最后定义的,随机的初始位置的引导车,横向偏差,和相对偏航角。据/p>
env.resetfcn = @(in)localresetfcn(in);据/pre>
修复随机生成器种子的再现性。据/p>
rng (0)据/pre>
DDPG代理通过使用批判价值函数表示来近似给定观察和行动的长期奖励。要创建批评家,首先要创建一个深度神经网络,它有两个输入,状态和动作,和一个输出。有关创建深度神经网络值函数表示的更多信息,请参见据A.href="//www.tatmou.com/help/reinforcement-learning/ug/create-policy-and-value-function-representations.html" class="a">创建策略和价值功能表示据/a>.据/p>
l = 100;据span style="color:#228B22">神经元百分数据/span>statePath = [featureInputLayer(9,据span style="color:#A020F0">“归一化”据/span>那据span style="color:#A020F0">'没有'据/span>那据span style="color:#A020F0">'名字'据/span>那据span style="color:#A020F0">“观察”据/span>) fullyConnectedLayer (L,据span style="color:#A020F0">'名字'据/span>那据span style="color:#A020F0">“fc1”据/span>)剥离(据span style="color:#A020F0">'名字'据/span>那据span style="color:#A020F0">“relu1”据/span>) fullyConnectedLayer (L,据span style="color:#A020F0">'名字'据/span>那据span style="color:#A020F0">“取得”据/span>)附加层(2,据span style="color:#A020F0">'名字'据/span>那据span style="color:#A020F0">“添加”据/span>)剥离(据span style="color:#A020F0">'名字'据/span>那据span style="color:#A020F0">“relu2”据/span>) fullyConnectedLayer (L,据span style="color:#A020F0">'名字'据/span>那据span style="color:#A020F0">“一个fc3”文件据/span>)剥离(据span style="color:#A020F0">'名字'据/span>那据span style="color:#A020F0">“relu3”据/span>) fullyConnectedLayer (1,据span style="color:#A020F0">'名字'据/span>那据span style="color:#A020F0">“fc4”据/span>));ActionPath = [FeatureInputLayer(2,据span style="color:#A020F0">“归一化”据/span>那据span style="color:#A020F0">'没有'据/span>那据span style="color:#A020F0">'名字'据/span>那据span style="color:#A020F0">'行动'据/span>) fullyConnectedLayer (L,据span style="color:#A020F0">'名字'据/span>那据span style="color:#A020F0">“fc5”据/span>));criticNetwork = layerGraph (statePath);criticNetwork = addLayers (criticNetwork actionPath);criticNetwork = connectLayers (criticNetwork,据span style="color:#A020F0">“fc5”据/span>那据span style="color:#A020F0">“添加/ in2”据/span>);据/pre>
查看批评批评网络配置。据/p>
图情节(批评性)据/pre>
指定使用批评者的选项据A.href="//www.tatmou.com/help/reinforcement-learning/ref/rlrepresentationoptions.html" class="a"> 使用指定的深度神经网络和选项创建批评家表示。您还必须为评论家指定操作和观察信息,这些信息是从环境接口获得的。有关更多信息,请参阅据A.href="//www.tatmou.com/help/reinforcement-learning/ref/rlqvaluerepresentation.html" class="a"> DDPG代理决定通过使用演员表示来考虑观察的行动。要创建演员,首先创建一个输入的深度神经网络,一个输入,观察和一个输出,动作。据/p>
与批评者同样地构建演员。有关更多信息,请参阅据A.href="//www.tatmou.com/help/reinforcement-learning/ref/rldeterministicactorrepresentation.html" class="a"> 要创建DDPG代理,首先使用据A.href="//www.tatmou.com/help/reinforcement-learning/ref/rlddpgagentoptions.html" class="a"> 然后,使用指定的Actor表示,批评者表示和代理选项创建DDPG代理。有关更多信息,请参阅据A.href="//www.tatmou.com/help/reinforcement-learning/ref/rlddpgagent.html" class="a"> 要培训代理,首先指定培训选项。对于本例,使用以下选项:据/p>
每次训练最多进行一次据code class="literal">10000据/code>每集最多持续一集据code class="literal">maxsteps.据/code>时间步骤。据/p> 在“插曲管理器”对话框中显示培训进度(设置据code class="literal">verb据/code>和据code class="literal">情节据/code>选项)。据/p> 当代理收到累计集奖励时停止培训大于据code class="literal">1700据/code>.据/p> 有关更多信息,请参阅据A.href="//www.tatmou.com/help/reinforcement-learning/ref/rltrainingoptions.html" class="a"> 训练代理人使用据A.href="//www.tatmou.com/help/reinforcement-learning/ref/rl.agent.rlqagent.train.html" class="a"> 要验证经过训练的代理的性能,可以在Simulink环境中通过取消注释以下命令来模拟该代理。金宝app有关代理模拟的更多信息,请参见据A.href="//www.tatmou.com/help/reinforcement-learning/ref/rlsimulationoptions.html" class="a"> 要使用确定性初始条件展示培训的代理,请在Simulink中模拟模型。金宝app据/p>
以下地图显示了当铅轿车在自助车之前70(m)时显示了模拟结果。据/p>
在头35秒内,相对距离大于安全距离(右下图),所以自我赛车会追踪设定的速度(右上图)。为了加速并达到设定的速度,加速度通常是非负的(左上角的图)。据/p> 从35秒到42秒,相对距离大多小于安全距离(右下图),所以自我汽车跟踪最小的领先速度和设定速度。因为引导速度小于设定速度(右上图),为了追踪引导速度,加速度变为非零(左上图)。据/p> 从42秒到58秒,自我赛车会追踪设定的速度(右上图),而加速度保持为零(左上图)。据/p> 从58秒到60秒,相对距离变得小于安全距离(右下图),所以自我汽车减速并跟踪领先速度。据/p> 左下角的图显示了横向偏移。如图所示,侧移在1秒内大大减小。侧偏仍然小于0.05 m。据/p> 关闭Simulink金宝app模型。据/p>
rlrepresentationOptions.据/code>.据/p>
criticOptions = rlRepresentationOptions (据span style="color:#A020F0">'学习'据/span>1 e - 3,据span style="color:#A020F0">'gradientthreshold'据/span>, 1据span style="color:#A020F0">“L2RegularizationFactor”据/span>1的军医);据/pre>
rlQValueRepresentation据/code>.据/p>
评论家= rlqvalueerepresentation(批评,观察invo,afticeinfo,据span style="color:#0000FF">...据/span>“观察”据/span>,{据span style="color:#A020F0">“观察”据/span>},据span style="color:#A020F0">“行动”据/span>,{据span style="color:#A020F0">'行动'据/span>}, criticOptions);据/pre>
rlDeterministicActorRepresentation据/code>.据/p>
[featureInputLayer(9,据span style="color:#A020F0">“归一化”据/span>那据span style="color:#A020F0">'没有'据/span>那据span style="color:#A020F0">'名字'据/span>那据span style="color:#A020F0">“观察”据/span>) fullyConnectedLayer (L,据span style="color:#A020F0">'名字'据/span>那据span style="color:#A020F0">“fc1”据/span>)剥离(据span style="color:#A020F0">'名字'据/span>那据span style="color:#A020F0">“relu1”据/span>) fullyConnectedLayer (L,据span style="color:#A020F0">'名字'据/span>那据span style="color:#A020F0">“取得”据/span>)剥离(据span style="color:#A020F0">'名字'据/span>那据span style="color:#A020F0">“relu2”据/span>) fullyConnectedLayer (L,据span style="color:#A020F0">'名字'据/span>那据span style="color:#A020F0">“一个fc3”文件据/span>)剥离(据span style="color:#A020F0">'名字'据/span>那据span style="color:#A020F0">“relu3”据/span>) fullyConnectedLayer (2据span style="color:#A020F0">'名字'据/span>那据span style="color:#A020F0">“fc4”据/span>) tanhLayer (据span style="color:#A020F0">'名字'据/span>那据span style="color:#A020F0">“tanh1”据/span>)ScalingLayer(据span style="color:#A020F0">'名字'据/span>那据span style="color:#A020F0">“ActorScaling1”据/span>那据span style="color:#A020F0">“规模”据/span>[2.5, 0.2618],据span style="color:#A020F0">“偏见”据/span>, -0.5, 0));actorOptions = rlRepresentationOptions (据span style="color:#A020F0">'学习'据/span>1的军医,据span style="color:#A020F0">'gradientthreshold'据/span>, 1据span style="color:#A020F0">“L2RegularizationFactor”据/span>1的军医);演员= rlDeterministicActorRepresentation (actorNetwork observationInfo actionInfo,据span style="color:#0000FF">...据/span>“观察”据/span>,{据span style="color:#A020F0">“观察”据/span>},据span style="color:#A020F0">“行动”据/span>,{据span style="color:#A020F0">“ActorScaling1”据/span>}, actorOptions);据/pre>
rlddpgagentoptions.据/code>.据/p>
AgentOptions = RLDDPGagentOptions(据span style="color:#0000FF">...据/span>“SampleTime”据/span>Ts,据span style="color:#0000FF">...据/span>'targetsmoothfactor'据/span>1 e - 3,据span style="color:#0000FF">...据/span>'经验BufferLength'据/span>,1e6,据span style="color:#0000FF">...据/span>'贴花因子'据/span>,0.99,据span style="color:#0000FF">...据/span>“MiniBatchSize”据/span>, 64);agentOptions.NoiseOptions.StandardDeviation = [0.6, 0.1];agentOptions.NoiseOptions.StandardDeviationDecayRate = 1 e-5;据/pre>
rlDDPGAgent据/code>.据/p>
代理= rlDDPGAgent(演员、评论家、agentOptions);据/pre>
火车代理据/h3>
rltringOptions.据/code>.据/p>
maxepisodes = 1e4;maxsteps = ceil(tf / ts);trainingopts = rltringOptions(据span style="color:#0000FF">...据/span>“MaxEpisodes”据/span>maxepisodes,据span style="color:#0000FF">...据/span>“MaxStepsPerEpisode”据/span>,maxsteps,据span style="color:#0000FF">...据/span>“详细”据/span>假的,据span style="color:#0000FF">...据/span>'plots'据/span>那据span style="color:#A020F0">“训练进步”据/span>那据span style="color:#0000FF">...据/span>'stoptrinaincriteria'据/span>那据span style="color:#A020F0">'EpisodeReward'据/span>那据span style="color:#0000FF">...据/span>'stoptriningvalue'据/span>, 1700);据/pre>
训练据/code>函数。培训是一个计算密集型的过程,需要几分钟才能完成。为了节省运行此示例的时间,请通过设置加载预先训练过的代理据code class="literal">用圆形据/code>来据code class="literal">假据/code>.训练代理人,套装据code class="literal">用圆形据/code>来据code class="literal">真正的据/code>.据/p>
doTraining = false;据span style="color:#0000FF">如果据/span>用圆形据span style="color:#228B22">培训代理商。据/span>trainingStats =火车(代理,env, trainingOpts);据span style="color:#0000FF">别的据/span>%加载预磨料的代理。据/span>负载(据span style="color:#A020F0">“金宝appSimulinkPFCDDPG.mat”据/span>那据span style="color:#A020F0">“代理”据/span>)据span style="color:#0000FF">结束据/span>
模拟DDPG代理据/h3>
rlSimulationOptions据/code>和据A.href="//www.tatmou.com/help/reinforcement-learning/ref/rl.env.abstractenv.sim.html" class="a">
SIM据/code>.据/p>
%simoptions = rlsimulationoptions('maxsteps',maxsteps);据/span>%体验= SIM(ENV,Agent,SimOptions);据/span>
e1_initial = -0.4;e2_initial = 0.1;x0_lead = 80;sim (mdl)据/pre>
BdClose(MDL)据/pre>
重置功能据/h3>
功能据/span>in = localResetFcn(in) in = setVariable(in,据span style="color:#A020F0">“x0_lead”据/span>40 +兰迪(60,1,1));据span style="color:#228B22">%引导车初始位置的随机值据/span>= setVariable (,据span style="color:#A020F0">'e1_initial'据/span>, 0.5 *(1 + 2 *兰德));据span style="color:#228B22">%横向偏差的随机值据/span>= setVariable (,据span style="color:#A020F0">'e2_initial'据/span>,0.1 *( - 1 + 2 * rand));据span style="color:#228B22">相对偏航角度的%随机值据/span>结束据/span>