此示例显示如何在Simulink®中培训用于车道保持辅助(LKA)的深度Q学习网络(DQN)代理。金宝app有关DQN代理商的更多信息,请参阅深Q-Network代理.
本例的强化学习环境是一个简单的自我车辆动力学自行车模型。训练的目标是通过调整前转向角度来使自我车辆沿着车道的中心线行驶。这个例子使用了与在使用模型预测控制的车道保持辅助系统(模型预测控制工具箱).自我汽车动力学由以下参数指定。
m = 1575;总载体质量(千克)IZ = 2875;%惯性矩(MNS ^ 2)如果= 1.2;重心到前胎纵向距离百分比(m)lr = 1.6;%重心到后胎纵向距离(m)cf = 19000;前轮转弯刚度百分比(N/rad)Cr = 33000;后轮胎的%转弯刚度(n / rad)Vx = 15;%纵向速度(m / s)
定义样本时间Ts
和仿真持续时间T
在几秒钟内。
ts = 0.1;T = 15;
LKA系统的输出是自我汽车的前转向角度。为了模拟自我汽车的物理限制,限制转向角度的范围[-0.5,0.5]
rad。
u_min = -0.5;U_MAX = 0.5;
道路的曲率定义为常数0.001 ( )。横向偏差的初始值为0.2 m,相对偏航角的初始值为-0.1 rad。
ρ= 0.001;e1_initial = 0.2;e2_initial = -0.1;
打开模型。
mdl ='rllkamdl';Open_System(MDL);AppletBlk = [MDL' / RL代理'];
对于这个模型:
来自代理到环境的转向角动作信号为-15度至15度。
来自环境的观察是横向偏差 ,相对偏航角 ,他们的衍生品 和 ,以及它们的积分 和 .
横向偏差时终止模拟
奖励 ,提供在每个时间步骤 , 是
在哪里 控制输入是否来自前一个时间步骤 .
为自我车辆创建强化学习环境界面。为此,首先创建观察和行动规范。
observationInfo = rlNumericSpec([6 1],“LowerLimit”,负无穷* (6,1),“UpperLimit”,正* (6,1));observationInfo。Name =“观察”;observationInfo。描述=“关于横向偏差和相对偏航角的信息”;ActionInfo = rlfinitesetspec(( - 15:15)* pi / 180);ActionInfo.name =.“转向”;
然后,创建环境接口。
env = rl金宝appSimulinkEnv (mdl agentblk、observationInfo actionInfo);
该界面有一个离散的行动空间,代理人可以应用31个可能的转向角度之一从-15度到15度。观测结果是包含侧向偏差、相对偏航角以及它们对时间的导数和积分的六维矢量。
要定义横向偏差和相对偏航角的初始条件,请使用匿名功能手柄指定环境复位功能。该复位功能随机化横向偏差和相对偏航角的初始值。
env.resetfcn = @(in)localresetfcn(in);
修复随机发生器种子以进行再现性。
rng (0)
DQN代理使用价值函数批判表示来近似给定的观察和行动的长期回报。
DQN代理可以使用多输出q值批判逼近器,这通常更有效。多输出近似器将观察值作为输入,状态行为值作为输出。每个输出元素表示从观察输入所指示的状态中采取相应离散行动的预期累积长期回报。
要创建批评家,首先创建一个具有一个输入(六维观察状态)和一个具有31个元素(从-15到15度均匀间隔的转向角度)的输出向量的深度神经网络。有关创建深度神经网络值函数表示的更多信息,请参见创建策略和价值功能表示.
倪= observationInfo.Dimension (1);%输入数(6)问= 24;神经元百分数没有=元素个数(actionInfo.Elements);%输出数量(31)dnn = [featureputlayer (nI,'正常化','没有任何',“名字”,'状态') fullyConnectedLayer(问,“名字”,“fc1”) reluLayer (“名字”,'relu1') fullyConnectedLayer(问,“名字”,“取得”) reluLayer (“名字”,“relu2”)全康连接层(不,“名字”,“一个fc3”文件)];
查看网络配置。
图绘制(layerGraph(款)
为使用的批评家表示指定选项rlRepresentationOptions
.
QuandOptions = rlrepresentationOptions(“LearnRate”1的军医,'gradientthreshold',1,'l2regularizationfactor'1的军医);
使用指定的深度神经网络和选项创建批读表示。您还必须指定从环境界面获取的批评的操作和观察信息。有关更多信息,请参阅rlQValueRepresentation
.
评论家= rlQValueRepresentation(款、observationInfo actionInfo,...“观察”, {'状态'},批评);
要创建DQN代理,请首先指定DQN代理选项使用rlDQNAgentOptions
.
agentOptions = rlDQNAgentOptions (...'采样时间'Ts,...“UseDoubleDQN”,真的,...'targetsmoothfactor'1 e - 3,...'贴花因子', 0.99,...“ExperienceBufferLength”1 e6,...“MiniBatchSize”, 64);
然后,使用指定的评论表示和代理选项创建DQN代理。有关更多信息,请参阅rldqnagent.
.
代理= rlDQNAgent(评论家,agentOptions);
要培训代理,首先指定培训选项。对于此示例,请使用以下选项:
每次运行每个培训集,最多有5000个剧集,每一集最多持续CEIL(T / TS)
时间的步骤。
在“插曲管理器”对话框中显示培训进度(设置绘图
选项培训进展
),并禁用命令行显示(设置verb
选项错误的
)。
剧集奖励到达时停止培训1
.
为每个集中的累计奖励的副本保存代理的副本大于-2.5
.
有关更多信息,请参阅rltringOptions.
.
maxepisodes = 5000;maxsteps = ceil(t / ts);trainingopts = rltringoptions(...'maxepisodes'maxepisodes,...“MaxStepsPerEpisode”,maxsteps,...'verbose'假的,...“阴谋”,“训练进步”,...“StopTrainingCriteria”,“EpisodeReward”,...'stoptriningvalue',-1,...'SaveAgentCriteria',“EpisodeReward”,...“SaveAgentValue”, -2.5);
训练代理人使用火车
功能。培训是一种计算密集型进程,需要几个小时才能完成。要在运行此示例的同时节省时间,请通过设置加载预制代理doTraining
来错误的
.训练代理人,套装doTraining
来真正的
.
doTraining = false;如果doTraining培训代理商。trainingStats =火车(代理,env, trainingOpts);别的%加载预磨料的代理。负载(“金宝appSimulinkLKADQNMulti.mat”,'代理人')结尾
要验证培训的代理的性能,请取消注释以下两行并在环境中模拟代理。有关代理模拟的更多信息,请参阅rlSimulationOptions
和sim卡
.
% simOptions = rlSimulationOptions('MaxSteps', MaxSteps);% experience = sim(env,agent,simOptions);
为了演示在确定性初始条件下训练的agent,在Simulink中对模型进行仿真。金宝app
e1_initial = -0.4;e2_initial = 0.2;sim (mdl)
当绘图显示时,横向误差(顶部图)和相对横摆角(中图)被驱动接近零。车辆从中心线(-0.4米)的开始,并具有非零偏航角误差(0.2 rad)。车道保持辅助使自助式汽车在约2.5秒后沿着中心线行驶。转向角(底部图)表明控制器在大约2秒后达到稳定状态。
关闭Simulink金宝app模型。
如果〜偶然%bdclose(mdl)结尾
功能= localResetFcn(中)%重置= setVariable (,“e1_initial”, 0.5 *(1 + 2 *兰德));横向偏差的%随机值= setVariable (,“e2_initial”, 0.1 *(1 + 2 *兰德));%相对偏航角的随机值结尾