主要内容gydF4y2Ba

火车RL代理自适应巡航控制与约束执行gydF4y2Ba

这个例子展示了如何训练强化学习(RL)代理自适应巡航控制系统(ACC)使用指导勘探和约束执行块。gydF4y2Ba

概述gydF4y2Ba

在这个例子中,我们的目标是做一个自我在一组汽车旅行速度,同时保持一定的安全距离领先汽车通过控制纵向加速和刹车。下面的例子使用了相同的车辆模型和参数gydF4y2Ba火车DDPG代理自适应巡航控制的功能gydF4y2Ba(强化学习工具箱)gydF4y2Ba的例子。gydF4y2Ba

设置随机种子和配置模型参数。gydF4y2Ba

%设置随机种子。gydF4y2Barng (gydF4y2Ba“默认”gydF4y2Ba)gydF4y2Ba%的参数gydF4y2Bax0_lead = 50;gydF4y2Ba%初始位置领先汽车(m)gydF4y2Bav0_lead = 25;gydF4y2Ba%初始速度领先汽车(米/秒)gydF4y2Bax0_ego = 10;gydF4y2Ba%初始位置为自我汽车(m)gydF4y2Bav0_ego = 20;gydF4y2Ba%自我汽车初始速度(米/秒)gydF4y2BaD_default = 10;gydF4y2Ba%默认间距(m)gydF4y2Bat_gap = 1.4;gydF4y2Ba%的时间差距(s)gydF4y2Bav_set = 30;gydF4y2Ba%司机让速度(米/秒)gydF4y2Baamin_ego = 3;gydF4y2Ba%最小加速度司机安慰(m / s ^ 2)gydF4y2Baamax_ego = 2;gydF4y2Ba司机安慰%最大加速度(m / s ^ 2)gydF4y2Bat = 0.1;gydF4y2Ba%样本时间(年代)gydF4y2BaTf = 60;gydF4y2Ba% (s)持续时间gydF4y2Ba

学习约束方程gydF4y2Ba

ACC应用程序、安全信号自我汽车速度gydF4y2Ba vgydF4y2Ba 和相对距离gydF4y2Ba dgydF4y2Ba 车和车之间的自我。在这个例子中,这些信号的约束gydF4y2Ba 10gydF4y2Ba ≤gydF4y2Ba vgydF4y2Ba ≤gydF4y2Ba 30.gydF4y2Ba 。gydF4y2Ba 5gydF4y2Ba 和gydF4y2Ba dgydF4y2Ba ≥gydF4y2Ba 5gydF4y2Ba 。约束取决于以下州gydF4y2Ba xgydF4y2Ba :自我车实际加速度,自我汽车速度、相对距离,导致汽车的速度。gydF4y2Ba

这个动作gydF4y2Ba ugydF4y2Ba 是自我汽车加速度的命令。以下方程描述了安全信号的动作和状态。gydF4y2Ba

(gydF4y2Ba vgydF4y2Ba kgydF4y2Ba +gydF4y2Ba 1gydF4y2Ba dgydF4y2Ba kgydF4y2Ba +gydF4y2Ba 1gydF4y2Ba ]gydF4y2Ba =gydF4y2Ba (gydF4y2Ba fgydF4y2Ba 1gydF4y2Ba (gydF4y2Ba xgydF4y2Ba kgydF4y2Ba )gydF4y2Ba fgydF4y2Ba 2gydF4y2Ba (gydF4y2Ba xgydF4y2Ba kgydF4y2Ba )gydF4y2Ba ]gydF4y2Ba +gydF4y2Ba (gydF4y2Ba ggydF4y2Ba 1gydF4y2Ba (gydF4y2Ba xgydF4y2Ba kgydF4y2Ba )gydF4y2Ba ggydF4y2Ba 2gydF4y2Ba (gydF4y2Ba xgydF4y2Ba kgydF4y2Ba )gydF4y2Ba ]gydF4y2Ba ugydF4y2Ba kgydF4y2Ba

约束执行块接受约束的形式gydF4y2Ba fgydF4y2Ba xgydF4y2Ba +gydF4y2Ba ggydF4y2Ba xgydF4y2Ba ugydF4y2Ba ≤gydF4y2Ba cgydF4y2Ba 。对于这个示例,这个约束函数的系数如下。gydF4y2Ba

fgydF4y2Ba xgydF4y2Ba =gydF4y2Ba (gydF4y2Ba - - - - - -gydF4y2Ba fgydF4y2Ba 1gydF4y2Ba (gydF4y2Ba xgydF4y2Ba kgydF4y2Ba )gydF4y2Ba - - - - - -gydF4y2Ba fgydF4y2Ba 2gydF4y2Ba (gydF4y2Ba xgydF4y2Ba kgydF4y2Ba )gydF4y2Ba fgydF4y2Ba 1gydF4y2Ba (gydF4y2Ba xgydF4y2Ba kgydF4y2Ba )gydF4y2Ba ]gydF4y2Ba ,gydF4y2Ba ggydF4y2Ba xgydF4y2Ba =gydF4y2Ba (gydF4y2Ba - - - - - -gydF4y2Ba ggydF4y2Ba 1gydF4y2Ba (gydF4y2Ba xgydF4y2Ba kgydF4y2Ba )gydF4y2Ba - - - - - -gydF4y2Ba ggydF4y2Ba 2gydF4y2Ba (gydF4y2Ba xgydF4y2Ba kgydF4y2Ba )gydF4y2Ba ggydF4y2Ba 1gydF4y2Ba (gydF4y2Ba xgydF4y2Ba kgydF4y2Ba )gydF4y2Ba ]gydF4y2Ba ,gydF4y2Ba cgydF4y2Ba =gydF4y2Ba (gydF4y2Ba - - - - - -gydF4y2Ba 10gydF4y2Ba - - - - - -gydF4y2Ba 5gydF4y2Ba 30.gydF4y2Ba 。gydF4y2Ba 5gydF4y2Ba ]gydF4y2Ba

学习未知函数gydF4y2Ba fgydF4y2Ba 我gydF4y2Ba 和gydF4y2Ba ggydF4y2Ba 我gydF4y2Ba ,你必须首先从环境中收集的训练数据。要做到这一点,首先创建一个RL环境使用gydF4y2BarlLearnConstraintACCgydF4y2Ba模型。gydF4y2Ba

mdl =gydF4y2Ba“rlLearnConstraintACC”gydF4y2Ba;open_system (mdl)gydF4y2Ba

在这个模型中,RL代理块不产生行动。相反,它被配置为通过一个随机的外部行为环境。使用数据收集模型的目的的RL代理块是确保环境模型,行动和观测信号配置,和模型重置函数中使用数据收集与后续代理培训期间使用。gydF4y2Ba

随机的外部动作信号均匀分布范围(10 6);即自我汽车的最大制动功率为-10 m / s ^ 2的最大加速度功率6米/秒^ 2。gydF4y2Ba

培训的四个观测从环境中车辆之间的相对距离,铅和自我的汽车的速度,和自我汽车加速度。为这些值定义一个连续观测空间。gydF4y2Ba

obsInfo = rlNumericSpec (1 [4]);gydF4y2Ba

动作输出的加速度是命令。创建一个相应的连续动作空间加速度限制。gydF4y2Ba

actInfo = rlNumericSpec ([1],gydF4y2Ba“LowerLimit”gydF4y2Ba3,gydF4y2Ba“UpperLimit”gydF4y2Ba2);gydF4y2Ba

创建一个RL环境这个模型。指定一个重置函数来设置一个随机位置领先汽车在每个训练集或模拟。gydF4y2Ba

agentblk = [mdlgydF4y2Ba' / RL代理'gydF4y2Ba];env = rl金宝appSimulinkEnv (mdl agentblk、obsInfo actInfo);env。ResetFcn = @(in)localResetFcn(in);

接下来,创建一个DDPG强化学习代理,支持连续操作和观察,使用金宝appgydF4y2BacreateDDPGAgentBACCgydF4y2Bahelper函数。这个函数创建评论家和演员表示基于行动和观测规范和使用表示创建一个DDPG代理。gydF4y2Ba

代理= createDDPGAgentACC (Ts、obsInfo actInfo);gydF4y2Ba

收集数据,使用gydF4y2BacollectDataACCgydF4y2Bahelper函数。这个函数模拟环境和代理和收集产生的输入和输出数据。结果训练数据有9列。gydF4y2Ba

  • 车之间的相对距离gydF4y2Ba

  • 导致汽车速度gydF4y2Ba

  • 自我的车速度gydF4y2Ba

  • 自我汽车实际加速度gydF4y2Ba

  • 自我加速命令gydF4y2Ba

  • 汽车之间的相对距离下一个时间步gydF4y2Ba

  • 导致汽车速度在接下来的时间步骤gydF4y2Ba

  • 自我汽车速度在接下来的时间步骤gydF4y2Ba

  • 自我汽车实际加速度下一个时间步gydF4y2Ba

对于这个示例,负载precollected训练数据。自己收集数据,设置gydF4y2BacollectDatagydF4y2Ba来gydF4y2Ba真正的gydF4y2Ba。gydF4y2Ba

collectData = false;gydF4y2Ba如果gydF4y2BacollectData数= 1000;data = collectDataACC (env,代理,数);gydF4y2Ba其他的gydF4y2Ba负载gydF4y2BatrainingDataACCgydF4y2Ba数据gydF4y2Ba结束gydF4y2Ba

对于这个示例,自我的动力汽车,汽车是线性的。因此,您可以找到一个安全信号的约束最小二乘解;也就是说,gydF4y2Ba vgydF4y2Ba =gydF4y2Ba RgydF4y2Ba vgydF4y2Ba 我gydF4y2Ba 和gydF4y2Ba dgydF4y2Ba =gydF4y2Ba RgydF4y2Ba dgydF4y2Ba 我gydF4y2Ba ,在那里gydF4y2Ba 我gydF4y2Ba 是gydF4y2Ba (gydF4y2Ba xgydF4y2Ba kgydF4y2Ba ;gydF4y2Ba ugydF4y2Ba kgydF4y2Ba ]gydF4y2Ba 。gydF4y2Ba

%提取状态和输入数据。gydF4y2Ba我=数据(1:1000 [4、3、1、2、5]);gydF4y2Ba%提取数据的相对距离下一个时间步。gydF4y2Bad =数据(1:1000 6);gydF4y2Ba%计算从国家的关系和相对距离的输入。gydF4y2BaRd =我\ d;gydF4y2Ba%提取数据实际自我汽车速度。gydF4y2Bav =数据(1:1000 8);gydF4y2Ba%计算关系的自我状态和输入汽车的速度。gydF4y2Ba房车=我\ v;gydF4y2Ba

验证了约束使用gydF4y2BavalidateConstraintACCgydF4y2Bahelper函数。这个函数处理输入训练数据使用学到的约束。然后比较网络输出与训练输出和计算均方误差(RMSE)。gydF4y2Ba

validateConstraintACC(数据、Rd Rv)gydF4y2Ba
测试数据RMSE相对距离= 8.118162 e-04测试数据RMSE自我速度= 1.721814 e15汽油gydF4y2Ba

小RMSE值表明成功的约束的学习。gydF4y2Ba

火车与约束执行代理gydF4y2Ba

训练与约束执行代理,使用gydF4y2BarlACCwithConstraintgydF4y2Ba模型。这个模型约束加速度命令从代理之前将它应用到环境。gydF4y2Ba

mdl =gydF4y2Ba“rlACCwithConstraint”gydF4y2Ba;open_system (mdl)gydF4y2Ba

查看约束实现,打开约束子系统。在这里,该模型生成的值gydF4y2Ba fgydF4y2Ba 我gydF4y2Ba 和gydF4y2Ba ggydF4y2Ba 我gydF4y2Ba 从线性约束关系。模型将这些值随着约束边界约束执行块。gydF4y2Ba

使用这个模型创建一个RL环境。操作规范为constraint-learning环境是一样的。培训、环境产生三个观察:速度误差的积分,速度误差,ego-car速度。gydF4y2Ba

环境子系统生成一个gydF4y2Ba结束gydF4y2Ba信号时关键约束violated-either自我汽车负速度(向后移动)或相对距离小于零(自我汽车碰撞导致汽车)。RL代理块使用这个信号提前终止训练集。gydF4y2Ba

obsInfo = rlNumericSpec (1 [3]);agentblk = [mdlgydF4y2Ba' / RL代理'gydF4y2Ba];env = rl金宝appSimulinkEnv (mdl agentblk、obsInfo actInfo);env。ResetFcn = @(in)localResetFcn(in);

由于观测规范是不同的培训,您必须创建一个新的DDPG代理。gydF4y2Ba

代理= createDDPGAgentACC (Ts、obsInfo actInfo);gydF4y2Ba

为培训代理指定选项。培训代理最多5000集。停止训练,如果事件超过260的奖励。gydF4y2Ba

maxepisodes = 5000;maxsteps =装天花板(Tf / Ts);trainingOpts = rlTrainingOptions (gydF4y2Ba…gydF4y2Ba“MaxEpisodes”gydF4y2Bamaxepisodes,gydF4y2Ba…gydF4y2Ba“MaxStepsPerEpisode”gydF4y2Bamaxsteps,gydF4y2Ba…gydF4y2Ba“详细”gydF4y2Ba假的,gydF4y2Ba…gydF4y2Ba“阴谋”gydF4y2Ba,gydF4y2Ba“训练进步”gydF4y2Ba,gydF4y2Ba…gydF4y2Ba“StopTrainingCriteria”gydF4y2Ba,gydF4y2Ba“EpisodeReward”gydF4y2Ba,gydF4y2Ba…gydF4y2Ba“StopTrainingValue”gydF4y2Ba,260);gydF4y2Ba

培训代理。培训是一个耗时的过程,所以对于这个示例,加载一个pretrained代理。培训代理商自己相反,集gydF4y2BatrainAgentgydF4y2Ba来gydF4y2Ba真正的gydF4y2Ba。gydF4y2Ba

trainAgent = false;gydF4y2Ba如果gydF4y2BatrainAgent trainingStats =火车(代理,env, trainingOpts);gydF4y2Ba其他的gydF4y2Ba负载gydF4y2BarlAgentConstraintACCgydF4y2Ba代理gydF4y2Ba结束gydF4y2Ba

下图显示了训练的结果。gydF4y2Ba

自gydF4y2Ba总数量的步骤gydF4y2Ba=的产物gydF4y2Ba集数量gydF4y2Ba和gydF4y2Ba集的步骤gydF4y2Ba,每一个训练集运行到最后没有提前终止。因此,约束执行块确保汽车从不违背自我的关键约束。gydF4y2Ba

运行培训代理并查看仿真结果。gydF4y2Ba

x0_lead = 80;sim (mdl);gydF4y2Ba

火车代理没有约束gydF4y2Ba

看到训练的好处与约束执行代理,你可以训练代理没有约束和比较训练结果约束执行情况。gydF4y2Ba

培训代理商没有约束,使用gydF4y2BarlACCwithoutConstraintgydF4y2Ba模型。这个模型适用于直接从代理的操作环境,和代理和观测规范使用相同的行动。gydF4y2Ba

mdl =gydF4y2Ba“rlACCwithoutConstraint”gydF4y2Ba;open_system (mdl)gydF4y2Ba

使用这个模型创建一个RL环境。gydF4y2Ba

agentblk = [mdlgydF4y2Ba' / RL代理'gydF4y2Ba];env = rl金宝appSimulinkEnv (mdl agentblk、obsInfo actInfo);env。ResetFcn = @(in)localResetFcn(in);

创建一个新的DDPG代理培训。这个代理有相同的配置中使用的代理之前的训练。gydF4y2Ba

代理= createDDPGAgentACC (Ts、obsInfo actInfo);gydF4y2Ba

火车代理使用相同的训练选项约束执法情况。对于这个示例,与之前的训练,加载一个pretrained代理。训练自己代理,集gydF4y2BatrainAgentgydF4y2Ba为true。gydF4y2Ba

trainAgent = false;gydF4y2Ba如果gydF4y2BatrainAgent trainingStats2 =火车(代理,env, trainingOpts);gydF4y2Ba其他的gydF4y2Ba负载gydF4y2BarlAgentACCgydF4y2Ba代理gydF4y2Ba结束gydF4y2Ba

下图显示了训练的结果。gydF4y2Ba

自gydF4y2Ba总数量的步骤gydF4y2Ba小于产品的gydF4y2Ba集数量gydF4y2Ba和gydF4y2Ba集的步骤gydF4y2Ba培训包括事件,提前终止由于约束违反。gydF4y2Ba

运行培训代理和仿真结果。gydF4y2Ba

x0_lead = 80;sim (mdl)gydF4y2Ba

bdclose (gydF4y2Ba“rlLearnConstraintACC”gydF4y2Ba)bdclose (gydF4y2Ba“rlACCwithConstraint”gydF4y2Ba)bdclose (gydF4y2Ba“rlACCwithoutConstraint”gydF4y2Ba)gydF4y2Ba

当地的重置功能gydF4y2Ba

函数gydF4y2Ba= localResetFcn(中)gydF4y2Ba%的初始位置重置领导的车。gydF4y2Ba= setVariable (,gydF4y2Ba“x0_lead”gydF4y2Ba40 +兰迪(60,1,1));gydF4y2Ba结束gydF4y2Ba

另请参阅gydF4y2Ba

块gydF4y2Ba

相关的话题gydF4y2Ba