这个例子展示了如何在Simulink®中训练一个深度q学习网络(DQN) agent用于车道保持辅助(LKA)。金宝app有关DQN代理的更多信息,请参见深度Q-Network代理商.
此示例的增强学习环境是用于自我车辆动态的简单自行车模型。培训目标是通过调整前转向角来保持沿着车道的中心线行驶的自我车辆。此示例使用与相同的车辆模型相同基于模型预测控制的车道保持辅助系统(模型预测控制工具箱).自我汽车动力学由下列参数指定。
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]
rad。
u_min = -0.5;u_max = 0.5;
道路的曲率由恒定的0.001( )。横向偏差的初始值为0.2μm,相对横摆角的初始值为-0.1rad。
rho = 0.001;E1_initial = 0.2;e2_initial = -0.1;
打开模型。
mdl =“rlLKAMdl”;Open_System(MDL);AppletBlk = [MDL'/ rl代理'];
对于此模型:
从agent到环境的转向角动作信号为-15°到15°。
从环境中观察到的是横向偏差 ,相对的横摆角 ,他们的衍生品 和 他们的积分 和 .
当出现横向偏差时,模拟终止
奖励 ,每次都提供 ,是
在哪里 是从前一步一步的控制输入 .
为自我车辆创建一个强化学习环境界面。为此,首先创建观察和操作规范。
观察info = rlnumericspec([6 1],'lowerimit',-inf *那些(6,1),'上限',INF * of(6,1));观察info.name ='观察';观察invfo.description =“横向偏差和相对偏航角信息”;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 =观察info.dimension(1);%输入次数(6)问= 24;%神经元数量no = numel(afticeinfo.elements);%输出数(31)dnn = [featureinputlayer(ni,“归一化”那“没有”那'姓名'那“状态”) fullyConnectedLayer(问,'姓名'那'fc1')剥离('姓名'那“relu1”) fullyConnectedLayer(问,'姓名'那'fc2')剥离('姓名'那'relu2') fullyConnectedLayer(不,'姓名'那'fc3'));
查看网络配置。
图绘图(层图(DNN))
指定使用批评者表示的选项rlrepresentationoptions.
.
criticOptions = rlRepresentationOptions ('学习',1e-4,“GradientThreshold”,1,“L2RegularizationFactor”,1E-4);
使用指定的深度神经网络和选项创建批评家表示。您还必须为评论家指定操作和观察信息,这些信息是从环境接口获得的。有关更多信息,请参见rlqvalueerepresentation
.
评论家= rlqvalueerpresentation(dnn,devalogationinfo,afticeinfo,......'观察',{“状态”}, criticOptions);
要创建DQN代理,请首先指定DQN代理选项使用rlDQNAgentOptions
.
agentOptions = rlDQNAgentOptions (......“SampleTime”Ts,......'unmorblebledqn',真的,......“TargetSmoothFactor”,1e-3,......“DiscountFactor”,0.99,......'经验bufferlength',1e6,......'迷你atchsize',64);
然后,使用指定的评论表示和代理选项创建DQN代理。有关更多信息,请参见rlDQNAgent
.
代理= rldqnagent(批评者,代理选项);
要培训代理,首先指定培训选项。对于本例,使用以下选项:
每一集最多5000集,每一集最多持续装天花板(T / T)
时间步骤。
在Episode Manager对话框中显示培训进度(设置情节
选项训练进步
),并禁用命令行显示(设置详细的
选项假
)。
当情节奖励达到时停止训练-1
.
为累积奖励大于的每一集保存一份代理副本-2.5
.
有关更多信息,请参见rlTrainingOptions
.
maxepisodes = 5000;maxsteps =装天花板(T / T);trainingOpts = rlTrainingOptions (......“MaxEpisodes”,maxepisodes,......“MaxStepsPerEpisode”maxsteps,......“详细”假的,......'plots'那'培训 - 进展'那......'stoptrinaincriteria'那'EpisodeReward'那......“StopTrainingValue”, 1......“SaveAgentCriteria”那'EpisodeReward'那......'saveagentvalue',-2.5);
训练代理人使用火车
函数。培训是一个计算密集型的过程,需要几个小时才能完成。为了节省运行此示例的时间,请通过设置加载预先训练过的代理偶然
到假
.自己训练代理人,设置偶然
到真正的
.
doTraining = false;如果偶然%训练代理人。TrainingStats =火车(代理,ENV,Trainpepopts);其他的%加载示例的预训练代理。加载(“金宝appSimulinkLKADQNMulti.mat”那'代理人'的)结尾
要验证经过训练的代理的性能,取消注释以下两行,并在环境中模拟该代理。有关代理模拟的更多信息,请参见rlSimulationOptions
和SIM
.
%simoptions = rlsimulationoptions('maxsteps',maxsteps);%体验= SIM(ENV,Agent,SimOptions);
要在确定性初始条件下展示培训的代理,请在Simulink中模拟模型。金宝app
e1_initial = -0.4;e2_initial = 0.2;SIM(MDL)
如图所示,横向误差(顶部图)和相对偏航角(中间图)都接近于零。车辆从中心线(-0.4米)出发,偏航角误差非零(0.2 rad)。大约2.5秒后,车道保持辅助使小轿车沿中心线行驶。转向角度(下图)显示控制器在大约2秒后达到稳定状态。
关闭Simulink金宝app模型。
如果~ doTraining% bdclose (mdl)结尾
函数在= localresetfcn(in)%重置在= setVariable(在,'e1_initial',0.5 *( - 1 + 2 * rand));%横向偏差的随机值在= setVariable(在,'e2_initial',0.1 *( - 1 + 2 * rand);相对偏航角度的%随机值结尾