这个例子展示了如何在Simulink®中训练一个深度q学习网络(DQN) agent用于车道保持辅助(LKA)。金宝app有关DQN代理的更多信息,请参见深度Q网络代理.
本示例的强化学习环境是一个简单的ego车辆动力学自行车模型。培训目标是通过调整前转向角使ego车辆沿着车道中心线行驶。本示例使用与中相同的车辆模型基于模型预测控制的车道保持辅助系统(模型预测控制工具箱).自我汽车动力学由下列参数指定。
m = 1575;车辆总质量(kg)工业区= 2875;偏航惯性矩% (mNs^2)如果= 1.2;%重心到前轮胎的纵向距离(m)lr=1.6;%重心到后胎纵向距离(m)Cf = 19000;前轮转弯刚度百分比(N/rad)Cr=33000;后轮转弯刚度百分比(N/rad)Vx = 15;纵速度百分比(m/s)
定义采样时间Ts
和仿真时间T
几秒钟之内。
t = 0.1;T = 15;
LKA系统的输出是自我汽车的前转向角度。为了模拟自我汽车的物理限制,限制转向角度的范围[-0.5, 0.5]
拉德。
u_min = -0.5;u_max = 0.5;
道路的曲率由常数0.001定义( ).横向偏差的初始值为0.2 m,相对偏航角的初始值为–0.1 rad。
rho=0.001;e1_初始值=0.2;e2_初始值=-0.1;
打开模型。
mdl=“rlLKAMdl”;开放式系统(mdl);代理语言=[mdl“/RL代理”];
对于此型号:
从agent到环境的转向角动作信号为-15°到15°。
从环境中观察到的是横向偏差 ,相对偏航角 ,他们的衍生品 和 ,以及它们的积分 和 .
当出现横向偏差时,模拟终止
奖励 ,在每个时间步提供 ,是
哪里 是来自上一时间步的控制输入 .
为自我车辆创建一个强化学习环境界面。为此,首先创建观察和操作规范。
observationInfo=rlNumericSpec([6 1],“LowerLimit”,-inf*one(6,1),“上限”,inf*one(6,1));observationInfo.Name=“观察”; 观测信息描述=“横向偏差和相对偏航角信息”;actionInfo = rlFiniteSetSpec((15:15) *π/ 180);actionInfo。Name =“转向”;
然后,创建环境接口。
env = rl金宝appSimulinkEnv (mdl agentblk、observationInfo actionInfo);
该界面有一个离散的行动空间,代理人可以应用31个可能的转向角度之一从-15度到15度。观测结果是包含侧向偏差、相对偏航角以及它们对时间的导数和积分的六维矢量。
要定义横向偏差和相对偏航角的初始条件,请使用匿名函数句柄指定环境重置函数。此重置函数随机化横向偏差和相对偏航角的初始值。
env。ResetFcn = @(在)localResetFcn(的);
修复随机生成器种子的再现性。
rng(0)
DQN代理使用价值函数表示,在给定观察和行动的情况下,近似长期奖励。
DQN代理可以使用多输出Q值批评近似器,通常效率更高。多输出近似器将观察值作为输入,将状态动作值作为输出。每个输出元素表示从观察值指示的状态采取相应离散动作的预期累积长期报酬投入。
要创建批评家,首先创建一个包含一个输入(六维观察状态)和一个包含31个元素(均匀分布的转向角为-15到15度)的输出向量的深度神经网络。有关创建深度神经网络值函数表示的更多信息,请参阅创建策略和值函数表示.
nI=观测信息尺寸(1);%输入次数(6)问= 24;%神经元数目否=numel(actionInfo.Elements);%产出数量(31)dnn=[featureInputLayer(nI,“归一化”,“没有”,“姓名”,“状态”) fullyConnectedLayer(问,“姓名”,“fc1”)雷卢耶(“姓名”,“relu1”) fullyConnectedLayer(问,“姓名”,“fc2”)雷卢耶(“姓名”,“relu2”) fullyConnectedLayer(不,“姓名”,“fc3”));
查看网络配置。
图形绘图(图层图(dnn))
使用指定批评家表示的选项rlRepresentationOptions
.
criticOptions = rlRepresentationOptions (“LearnRate”,1e-4,“GradientThreshold”,1,“L2RegularizationFactor”,1e-4);
使用指定的深度神经网络和选项创建批评家表示。您还必须为评论家指定操作和观察信息,这些信息是从环境接口获得的。有关更多信息,请参见rlQValueRepresentation
.
批评家=rlQValueRepresentation(dnn、observationInfo、actionInfo、,...“观察”, {“状态”}, criticOptions);
要创建DQN代理,请首先使用指定DQN代理选项rlDQNAgentOptions
.
agentOptions = rlDQNAgentOptions (...“SampleTime”Ts,...“UsedDoubledQn”符合事实的...“TargetSmoothFactor”,1e-3,...“DiscountFactor”,0.99,...“经验缓冲长度”,1e6,...“MiniBatchSize”,64);
然后,使用指定的评论表示和代理选项创建DQN代理。有关更多信息,请参见rlDQNAgent
.
代理=rlDQNAgent(评论家、代理);
要培训代理,首先指定培训选项。对于本例,使用以下选项:
每一集最多5000集,每一集最多持续装天花板(T / T)
时间步长。
在“事件管理器”对话框中显示培训进度(设置情节
选项训练进步
),并禁用命令行显示(设置详细的
选项假
)。
当情节奖励达到时停止训练–1
.
为累积奖励大于的每一集保存一份代理副本–2.5
.
有关更多信息,请参见rlTrainingOptions
.
maxepisodes = 5000;maxsteps =装天花板(T / T);trainingOpts = rlTrainingOptions (...“MaxEpisodes”,每集,...“MaxStepsPerEpisode”maxsteps,...“详细”假的,...“情节”,“培训进度”,...“停止培训标准”,“情节报酬”,...“StopTrainingValue”, 1...“SaveAgentCriteria”,“情节报酬”,...“SaveAgentValue”,-2.5);
训练代理人使用火车
函数。培训是一个计算密集型的过程,需要几个小时才能完成。为了节省运行此示例的时间,请通过设置加载预先训练过的代理溺爱
到假
.自己训练代理人,设置溺爱
到真正的
.
doTraining = false;如果溺爱%培训代理人。培训状态=培训(代理人、环境、培训点);其他的%加载示例的预训练代理。装载(“金宝appSimulinkLKADQNMulti.mat”,“代理人”)终止
要验证经过训练的代理的性能,取消注释以下两行,并在环境中模拟该代理。有关代理模拟的更多信息,请参见rlSimulationOptions
和模拟
.
%simOptions=rlSimulationOptions('MaxSteps',MaxSteps);%经验=模拟(环境、代理、模拟选项);
为了在确定性初始条件下演示经过训练的agent,请在Simulink中模拟该模型。金宝app
e1_初始值=-0.4;e2_初始值=0.2;sim(mdl)
如图所示,横向误差(顶部图)和相对偏航角(中间图)都接近于零。车辆从中心线(-0.4米)出发,偏航角误差非零(0.2 rad)。大约2.5秒后,车道保持辅助使小轿车沿中心线行驶。转向角度(下图)显示控制器在大约2秒后达到稳定状态。
关闭Simulink金宝app模型。
如果~ doTraining% bdclose (mdl)终止
函数in=localResetFcn(in)%重置in=设置变量(in,“e1_首字母”,0.5*(-1+2*兰德));%横向偏差的随机值in=设置变量(in,“e2_首字母”,0.1*(-1+2*兰德));%相对偏航角的随机值终止