主要内容gydF4y2Ba

训练RL代理的自适应巡航控制约束强制gydF4y2Ba

这个例子展示了如何使用约束强制块的引导探索来训练自适应巡航控制(ACC)的强化学习(RL)代理。gydF4y2Ba

概述gydF4y2Ba

在这个例子中,目标是让自驾汽车以设定的速度行驶,同时通过控制纵向加速度和制动与前车保持安全距离。此示例使用与gydF4y2Ba训练DDPG Agent进行自适应巡航控制gydF4y2Ba(强化学习工具箱)gydF4y2Ba的例子。gydF4y2Ba

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

%设置随机种子。gydF4y2Barng (gydF4y2Ba“默认”gydF4y2Ba)gydF4y2Ba%的参数gydF4y2BaX0_lead = 50;gydF4y2Ba%前车初始位置(m)gydF4y2BaV0_lead = 25;gydF4y2Ba前车初速度% (m/s)gydF4y2BaX0_ego = 10;gydF4y2Ba%自我车初始位置(m)gydF4y2BaV0_ego = 20;gydF4y2Ba自车初速度% (m/s)gydF4y2BaD_default = 10;gydF4y2Ba%默认间距(m)gydF4y2BaT_gap = 1.4;gydF4y2Ba%时间间隔(秒)gydF4y2BaV_set = 30;gydF4y2Ba%驱动组速度(m/s)gydF4y2BaAmin_ego = -3;gydF4y2Ba驾驶员舒适的最小加速度(m/s^2)gydF4y2BaAmax_ego = 2;gydF4y2Ba驾驶员舒适的最大加速度(m/s^2)gydF4y2BaTs = 0.1;gydF4y2Ba%采样时间(s)gydF4y2BaTf = 60;gydF4y2Ba%持续时间(秒)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 是ego汽车加速命令。下式描述了动作和状态下的安全信号。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 Agent块的数据收集模型的目的是确保数据收集期间使用的环境模型、动作和观察信号配置以及模型重置功能与后续Agent训练期间使用的匹配。gydF4y2Ba

随机外部作用信号在范围内均匀分布[10,6];也就是说,ego的最大制动功率为- 10m /s^2,最大加速功率为6m /s^2。gydF4y2Ba

对于训练,来自环境的四个观测值是车辆之间的相对距离,前车和自我车的速度,以及自我车的加速度。为这些值定义一个连续的观察空间。gydF4y2Ba

obsInfo = rlNumericSpec([4 1]);gydF4y2Ba

代理输出的动作是加速命令。创建具有加速度限制的相应连续动作空间。gydF4y2Ba

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

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

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

接下来,创建一个DDPG强化学习代理,它支持连续的操作和观察,使用金宝appgydF4y2BacreateDDPGAgentBACCgydF4y2Bahelper函数。该函数基于操作和观察规范创建评论家和参与者表示,并使用这些表示创建DDPG代理。gydF4y2Ba

agent = createDDPGAgentACC(Ts,obsInfo,actInfo);gydF4y2Ba

要收集数据,请使用gydF4y2BacollectDataACCgydF4y2Bahelper函数。该函数模拟环境和代理,并收集产生的输入和输出数据。得到的训练数据有九列。gydF4y2Ba

  • 两辆车之间的相对距离gydF4y2Ba

  • 先导车速度gydF4y2Ba

  • 自我车速gydF4y2Ba

  • Ego汽车实际加速度gydF4y2Ba

  • 自我加速命令gydF4y2Ba

  • 下一个时间步中两辆车之间的相对距离gydF4y2Ba

  • 在下一个时间步中领先车速gydF4y2Ba

  • 在下一个时间步中自我车的速度gydF4y2Ba

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

对于本例,加载预先收集的训练数据。如果需要自行收集数据,请设置gydF4y2BacollectDatagydF4y2Ba来gydF4y2Ba真正的gydF4y2Ba.gydF4y2Ba

collectData = false;gydF4y2Ba如果gydF4y2BacollectData count = 1000;data = collectDataACC(env,agent,count);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

提取状态并输入数据。gydF4y2BaI = data(1:1000,[4,3,1,2,5]);gydF4y2Ba在下一个时间步中提取相对距离的数据。gydF4y2BaD =数据(1:1000,6);gydF4y2Ba计算从状态和输入到相对距离的关系。gydF4y2Bad = I\d;gydF4y2Ba提取数据为实际的自我车速度。gydF4y2BaV =数据(1:1000,8);gydF4y2Ba计算状态和输入到自我车速的关系。gydF4y2BaRv = I\v;gydF4y2Ba

方法验证所学习的约束gydF4y2BavalidateConstraintACCgydF4y2Bahelper函数。这个函数使用学习到的约束来处理输入的训练数据。然后将网络输出与训练输出进行比较,并计算均方根误差(RMSE)。gydF4y2Ba

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

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

训练具有约束执行的代理gydF4y2Ba

要使用约束强制来训练代理,请使用gydF4y2BarlACCwithConstraintgydF4y2Ba模型。该模型在将加速命令应用到环境之前约束来自代理的命令。gydF4y2Ba

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

要查看约束实现,请打开constraint子系统。这里,模型生成的值gydF4y2Ba fgydF4y2Ba 我gydF4y2Ba 而且gydF4y2Ba ggydF4y2Ba 我gydF4y2Ba 从线性约束关系。模型将这些值连同约束边界一起发送到约束强制块。gydF4y2Ba

使用此模型创建RL环境。动作规范与约束学习环境相同。对于训练,环境产生三个观测值:速度误差的积分、速度误差和自我车速度。gydF4y2Ba

环境子系统生成一个gydF4y2Ba结束gydF4y2Ba违反关键约束时的信号——要么自我车的速度为负(向后移动),要么相对距离小于零(自我车与前车相撞)。RL代理块使用这个信号提前终止训练集。gydF4y2Ba

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

由于对训练的观察规范不同,您还必须创建一个新的DDPG代理。gydF4y2Ba

agent = createDDPGAgentACC(Ts,obsInfo,actInfo);gydF4y2Ba

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

Maxepisodes = 5000;maxsteps = ceil(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

培训代理人。训练是一个耗时的过程,因此对于本例,加载一个预训练的代理。如果要亲自训练代理,请设置gydF4y2BatrainAgentgydF4y2Ba来gydF4y2Ba真正的gydF4y2Ba.gydF4y2Ba

trainAgent = false;gydF4y2Ba如果gydF4y2BatrainAgent trainingStats = train(agent,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 = [mdl .gydF4y2Ba' / RL代理'gydF4y2Ba];env = rl金宝appSimulinkEnv(mdl,agentblk,obsInfo,actInfo);env。ResetFcn = @(in)localResetFcn(in);

创建一个新的DDPG代理进行培训。此代理具有与前面培训中使用的代理相同的配置。gydF4y2Ba

agent = createDDPGAgentACC(Ts,obsInfo,actInfo);gydF4y2Ba

使用与约束执行案例中相同的训练选项来训练代理。对于本例,与前面的训练一样,装入预训练的代理。要亲自训练特工,请设置gydF4y2BatrainAgentgydF4y2Ba为true。gydF4y2Ba

trainAgent = false;gydF4y2Ba如果gydF4y2BatrainAgent trainingStats2 = train(agent,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

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

另请参阅gydF4y2Ba

块gydF4y2Ba

相关的话题gydF4y2Ba