这个例子展示了如何在Simulink®中训练深度确定性策略梯度(DDPG)代理用于路径跟踪控制(PFC)。万博1manbetx有关DDPG代理的更多信息,请参见据一种href="//www.tianjin-qmedu.com/uk/help/reinforcement-learning/ug/ddpg-agents.html" class="a">深度确定性策略梯度代理据/a>.据/p>
本例的强化学习环境是用于自我汽车的简单自行车模型和用于引导汽车的简单纵向模型。训练目标是让自我车以设定的速度行驶,同时通过控制纵向加速和制动来保持与领先车的安全距离,同时通过控制前转向角度来使自我车保持在车道中心线上行驶。有关PFC的更多信息,请参见据一种href="//www.tianjin-qmedu.com/uk/help/mpc/ref/pathfollowingcontrolsystem.html" class="a">路径跟踪控制系统据/a>(模型预测控制工具箱)据/span>.自我汽车动力学由下列参数指定。据/p>
指定两辆车的初始位置和速度。据/p>
指定静止默认间距(米),时间间隙(S),和驾驶员设定的速度(米/秒)。据/p>
为了模拟车辆动态的物理限制,约束加速度范围据code class="literal">(3 2)据/code>(米/秒^ 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之间(米/秒^ 2)。转向动作信号取-15度(-0.2618弧度)和15度(0.2618弧度)之间的值。据/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模型的环境界面。万博1manbetx据/p>
创建观察规范。据/p>
observationInfo = rlNumericSpec([9 1],据span style="color:#A020F0">“LowerLimit”据/span>,-INF *也是(9,1),据span style="color:#A020F0">'UpperLimit用户'据/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">'UpperLimit用户'据/span>, 2, 0.2618);actionInfo。Name =据span style="color:#A020F0">“accel;引导”据/span>;据/pre>
创建环境接口。据/p>
env = rl万博1manbetxSimulinkEnv (mdl agentblk、observationInfo actionInfo);据/pre>
要定义初始条件,使用匿名函数句柄指定环境复位功能。复位功能据code class="literal">localresetfcn.据/code>,它是在例子的最后定义的,随机的初始位置的引导车,横向偏差,和相对偏航角。据/p>
env.resetfcn = @(in)localresetfcn(in);据/pre>
修复随机生成器种子的再现性。据/p>
rng (0)据/pre>
DDPG代理通过使用批判价值函数表示来近似给定观察和行动的长期奖励。要创建批评家,首先要创建一个深度神经网络,它有两个输入,状态和动作,和一个输出。有关创建深度神经网络值函数表示的更多信息,请参见据一种href="//www.tianjin-qmedu.com/uk/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>)reluLayer(据span style="color:#A020F0">'姓名'据/span>那据span style="color:#A020F0">“relu1”据/span>) fullyConnectedLayer (L,据span style="color:#A020F0">'姓名'据/span>那据span style="color:#A020F0">“取得”据/span>)additionLayer(2,据span style="color:#A020F0">'姓名'据/span>那据span style="color:#A020F0">“添加”据/span>)reluLayer(据span style="color:#A020F0">'姓名'据/span>那据span style="color:#A020F0">“relu2”据/span>) fullyConnectedLayer (L,据span style="color:#A020F0">'姓名'据/span>那据span style="color:#A020F0">“一个fc3”文件据/span>)reluLayer(据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>
图图(criticNetwork)据/pre>
指定使用评论家表示选项据一种href="//www.tianjin-qmedu.com/uk/help/reinforcement-learning/ref/rlrepresentationoptions.html" class="a"> 使用指定的深度神经网络和选项创建批评家表示。您还必须为评论家指定操作和观察信息,这些信息是从环境接口获得的。有关更多信息,请参阅据一种href="//www.tianjin-qmedu.com/uk/help/reinforcement-learning/ref/rlqvaluerepresentation.html" class="a"> 甲DDPG代理决定哪个动作通过使用一个演员表示采取给定的观测。要创建演员,第一个输入,观察,和一个输出,动作创造深层神经网络。据/p>
同样构建演员评论家。有关更多信息,请参阅据一种href="//www.tianjin-qmedu.com/uk/help/reinforcement-learning/ref/rldeterministicactorrepresentation.html" class="a"> 要创建DDPG代理,首先使用据一种href="//www.tianjin-qmedu.com/uk/help/reinforcement-learning/ref/rlddpgagentoptions.html" class="a"> 然后,创建使用指定的演员表示,批评者表示,与代理选项DDPG剂。有关更多信息,请参阅据一种href="//www.tianjin-qmedu.com/uk/help/reinforcement-learning/ref/rlddpgagent.html" class="a"> 要培训代理,首先指定培训选项。对于本例,使用以下选项:据/p>
每次训练最多进行一次据code class="literal">10000据/code>每集最多持续一集据code class="literal">maxsteps据/code>时间步长。据/p> 在“插曲管理器”对话框中显示培训进度(设置据code class="literal">详细据/code>和据code class="literal">情节据/code>选项)。据/p> 当代理收到比累计插曲回报更大停止训练据code class="literal">1700据/code>.据/p> 有关更多信息,请参阅据一种href="//www.tianjin-qmedu.com/uk/help/reinforcement-learning/ref/rltrainingoptions.html" class="a"> 训练代理人使用据一种href="//www.tianjin-qmedu.com/uk/help/reinforcement-learning/ref/rl.agent.rlqagent.train.html" class="a"> 要验证经过训练的代理的性能,可以在Simulink环境中通过取消注释以下命令来模拟该代理。万博1manbetx有关代理模拟的更多信息,请参见据一种href="//www.tianjin-qmedu.com/uk/help/reinforcement-learning/ref/rlsimulationoptions.html" class="a"> 要使用确定性的初始条件展示训练剂,模拟在Simulink模型。万博1manbetx据/p>
下图显示的模拟结果时,领头的车是70(M)提前自我汽车。据/p>
在头35秒内,相对距离大于安全距离(右下图),所以自我赛车会追踪设定的速度(右上图)。为了加速并达到设定的速度,加速度通常是非负的(左上角的图)。据/p> 从35秒到42秒,相对距离大多小于安全距离(右下图),所以自我汽车跟踪最小的领先速度和设定速度。因为引导速度小于设定速度(右上图),为了追踪引导速度,加速度变为非零(左上图)。据/p> 从42秒到58秒,自我赛车会追踪设定的速度(右上图),而加速度保持为零(左上图)。据/p> 从58秒到60秒,相对距离变得小于安全距离(右下图),所以自我汽车减速并跟踪领先速度。据/p> 左下角的图显示了横向偏移。如图所示,侧移在1秒内大大减小。侧偏仍然小于0.05 m。据/p> 关闭Simulink万博1manbetx模型。据/p>
rlRepresentationOptions据/code>.据/p>
criticOptions = rlRepresentationOptions (据span style="color:#A020F0">'LearnRate'据/span>1 e - 3,据span style="color:#A020F0">'GradientThreshold'据/span>,1,据span style="color:#A020F0">“L2RegularizationFactor”据/span>1的军医);据/pre>
rlQValueRepresentation据/code>.据/p>
评论家= rlQValueRepresentation(criticNetwork,observationInfo,actionInfo,据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>)reluLayer(据span style="color:#A020F0">'姓名'据/span>那据span style="color:#A020F0">“relu1”据/span>) fullyConnectedLayer (L,据span style="color:#A020F0">'姓名'据/span>那据span style="color:#A020F0">“取得”据/span>)reluLayer(据span style="color:#A020F0">'姓名'据/span>那据span style="color:#A020F0">“relu2”据/span>) fullyConnectedLayer (L,据span style="color:#A020F0">'姓名'据/span>那据span style="color:#A020F0">“一个fc3”文件据/span>)reluLayer(据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">'LearnRate'据/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>'ExperienceBufferLength'据/span>,1E6,据span style="color:#0000FF">...据/span>'贴花因子'据/span>,0.99,据span style="color:#0000FF">...据/span>“MiniBatchSize”据/span>,64);agentOptions.NoiseOptions.Variance = [0.6; 0.1];AgentOptions.NoiseOptions.varedceCayrate = 1E-5;据/pre>
rlDDPGAgent据/code>.据/p>
代理= rlDDPGAgent(演员、评论家、agentOptions);据/pre>
火车代理据/h3>
rltringOptions.据/code>.据/p>
maxepisodes = 1E4;maxsteps =小区(TF / TS);trainingOpts = rlTrainingOptions(据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>'StopTrainingCriteria'据/span>那据span style="color:#A020F0">'EpisodeReward'据/span>那据span style="color:#0000FF">...据/span>'StopTrainingValue'据/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">“万博1manbetxSimulinkPFCDDPG.mat”据/span>那据span style="color:#A020F0">“代理”据/span>)据span style="color:#0000FF">结尾据/span>
模拟DDPG代理据/h3>
rlSimulationOptions据/code>和据一种href="//www.tianjin-qmedu.com/uk/help/reinforcement-learning/ref/rl.env.abstractenv.sim.html" class="a">
SIM据/code>.据/p>
%simOptions = rlSimulationOptions( 'MaxSteps',maxsteps);据/span>%的经验= SIM(ENV,代理,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>