拓冰建站拓冰建站
首页 / 资讯中心 / 正文

基于连续型元胞自动机的自动驾驶混合交通流Matlab仿真实现

最近在折腾自动驾驶混入交通流对道路通行效率影响这个方向把一套连续型元胞自动机Continuous Cellular Automata的Matlab仿真代码完整整理了出来。这套代码实现了自动驾驶车辆与手动驾驶车辆在单车道环形道路上的混合交通流仿真核心机制包含随机慢化、安全距离跟车模型以及基本图、时空图、速度分布等多种图表分析模块。如果你想研究自动驾驶渗透率如何影响交通拥堵、通行能力或者想快速上手CA交通流仿真这份代码和下面的拆解应该能帮你省掉不少弯路。在动手写代码之前我花了很长时间在“离散元胞自动机”和“连续型元胞自动机”之间做选择最终确定了连续型方案。原因很简单经典NaSch模型这类离散CA把道路划分成等长的格子车辆速度和位置都是一格一格的整数虽然计算效率高、规则简单但在模拟自动驾驶时特别别扭——自动驾驶的核心特征是能对速度和车距做精细连续控制而离散CA里一个时间步至少改变一个格子根本体现不出这种连续调节能力。连续型CA把速度和位置当作连续实数处理车辆可以在一秒内加速0.5 m/s或减速0.3 m/s物理上更贴近真实跟车行为。更关键的是混合流场景里两类车的控制特性差异很大。手动驾驶车辆反应时间更长、速度波动更大、随机慢化明显而自动驾驶车辆反应快、控制稳定、几乎不出现无中生有的减速。这种差异在连续型CA里可以通过不同的加速度上限、安全反应时间、随机慢化概率来刻画非常直观。离散CA想做到同样的效果必须把格子长度设计得很小计算量会成倍上涨反而不划算。1. 为什么混合流仿真我选了连续型元胞自动机1.1 离散元胞自动机和连续型的本质区别元胞自动机做交通流仿真的思路大家应该不陌生把道路分成有限个格子每个格子要么被车占据要么为空所有车辆按照一套局部规则同步更新。经典NaSch模型有四步加速、减速、随机慢化、位置更新每一步都非常简单每辆车只需要看一眼前车的状态就能决定自己的行为。这种模型最大的优势是计算极快几百万辆车跑起来也没压力而且能复现很多真实交通现象比如自发堵车、时走时停的交通流。但它的局限也很明显。速度是整数的意味着车辆的最小速度变化量就是1个格子/时间步。如果格子长度取5米那车辆的速度只能是5的倍数米每秒30 m/s和25 m/s之间有5 m/s的空档这种分辨率在宏观统计上没问题但放到自动驾驶跟车策略分析里就不够用了。另外离散CA里车辆位置严格绑定格子视觉上总有一种“跳格子”的感觉和真实的连续运动存在偏差。连续型CA在规则框架上和离散CA一脉相承仍然以“加速、减速、随机慢化、位置更新”为核心逻辑但把速度和位置全部改为连续的。车辆位置是一个实数坐标速度为实数跟车约束通过车间距直接计算不再依赖格子。这样既保留了CA规则简单、更新高效的特点又获得了更细腻的行为表达能力。我实际跑下来的感受是连续型CA在复现“车流从自由流过渡到拥堵流”这一基本相变时和离散CA结果趋势一致但在混合流场景下能看出更多微观细节比如自动驾驶车辆如何通过提前平缓减速来避免后方形成冲击波。1.2 连续型CA建模混合流的核心优势混合流仿真的核心任务是回答一个问题当自动驾驶车辆按照不同比例混入手动驾驶车流时道路的平均速度、流量、拥堵程度会怎么变化要回答这个问题模型必须能够体现两类车辆的行为差异而连续型CA优势明显。首先自动驾驶车辆在连续型CA中可以设置更小的安全反应时间τ比如0.5秒手动驾驶车辆设置1.2秒。反应时间直接决定跟车安全距离τ越小车辆在相同速度下需要的车头间距就越小道路能容纳的车辆就越多通行能力自然更高。这在离散CA中很难体现因为格子长度把空间离散化了τ的连续变化无法映射到格子级规则上。其次自动驾驶车辆的随机慢化概率可以设置得极低。所谓随机慢化就是即使前车没有减速后车也可能因为驾驶员走神或判断误差而莫名其妙地踩一脚刹车这是元胞自动机模型中产生自发拥堵的关键机制。手动驾驶员的慢化概率通常在0.2到0.5之间而自动驾驶系统按固定算法运行这个概率可以压到0.02甚至0。这种差异如果放到离散CA中因为速度变化量最小是1格/步随机慢化对自动驾驶车辆的影响依然存在但连续型CA可以把“随机干扰幅度”也做成连续值比如慢化时速度随机减少0到2 m/s更符合实际。最后连续型CA的车辆位置没有格子约束可以任意设置初始位置和车辆密度统计流量、密度、速度等宏观量时不需要做格子到实际距离的换算。我测试下来在Matlab里做N辆车由稀疏到密度的扫描实验连续型CA代码更简洁统计出的基本图曲线也更光滑。2. 模型设计与参数选型2.1 车辆状态更新规则设计这套连续型CA模型采用单车道周期性边界条件也就是把道路首尾连成一个环形车辆总数固定、没有出入口适合研究稳态交通流。每辆车在任意时刻有两个状态量位置x_i和速度v_i。车辆编号按位置从小到大排列前方车辆就是编号加1的那辆最后一辆车的前车是编号1的车加上一个道路长度L。每个时间步的更新分四步进行和NaSch模型同构但全部换成连续量期望加速。车辆希望在不超过最大速度v_max的前提下尽量提速所以期望速度v_des min(v_max, v_i a_i * dt)。这里的a_i是车辆i的加速度上限AV和HV取不同值。安全跟车限制。车辆不能撞到前车要保证在反应时间τ内即使前车突然急刹自己也能刹停。简化处理时安全速度v_safe gap / τ其中gap x_lead - x_i - L_veh即前车位置减去本车位置再减去车身长度。此时车辆的实际目标速度取期望速度和安全速度的较小值v_target min(v_des, v_safe)。随机慢化。车辆以概率p_slow对目标速度施加干扰如果随机数小于p_slow则v_i_new max(0, v_target - Δv)。这里的Δv是慢化幅度取1.5或2 m/s比较合适太小了扰动不明显太大了容易出现不必要的急刹。位置更新。v_i v_i_newx_i x_i v_i * dt。这四步简单清晰但已经能复现自由流、同步流、宽运动堵塞等典型交通现象。选择这种规则组合而不是直接用IDM等连续跟驰模型是因为CA框架的并行更新特性更好所有车辆同时根据上一时刻的状态计算下一步避免了车辆跟驰模型中常见的“前方车辆位置已更新导致后方车辆过反应”的问题也更容易实现自动驾驶和手动驾驶的混合控制策略。2.2 自动驾驶和手动驾驶的关键差异参数混合流仿真的重点就是把两类车的参数区分开。我经过多轮测试和文献对照最终采用的参数组合如下表所示参数手动驾驶车辆HV自动驾驶车辆AV取值说明最大速度 v_max30 m/s35 m/sAV可稍微激进一点但不至于脱离实际最大加速度 a1.5 m/s²3.0 m/s²AV的电机响应快加速能力强最大减速度 b3.0 m/s²6.0 m/s²AV制动系统反应快、减速度大安全反应时间 τ1.2 s0.5 s这是影响通行能力最关键的参数之一随机慢化概率 p_slow0.300.02驾驶员容易分心自动驾驶控制稳定车身长度 L_veh4.5 m4.5 m统一取普通小客车长度这张表最值得琢磨的是随机慢化概率和安全反应时间。手动驾驶的0.3意味着平均每3秒左右就可能出现一次无端减速这个频率在真实高速公路上其实不算高很多驾驶员在疲劳状态下慢化概率会更高。自动驾驶的0.02则体现了一个理想的控制策略除了传感器噪声引起的极小概率扰动外几乎不会做出无意义的减速动作。安全反应时间τ的差异更是直接影响通行能力。简单算一笔账当两辆车都以30 m/s行驶时HV需要保持的安全车距是30×1.236米而AV只需要30×0.515米。换算成流量就是单车道每小时能通过的HV数量约为3600/(36/30)3000辆而AV可以做到3600/(15/30)7200辆。当然这是极端理想值实际跟车时还有车身长度和扰动的影响但方向是很明确的——自动驾驶通过缩短有效车头时距来提升道路容量。2.3 随机慢化的引入方式随机慢化是整个模型中“制造拥堵”的发动机它的实现方式值得单独说。在经典NaSch模型里随机慢化是速度减1一个格子的速度这是一个非常强的扰动。在连续型CA里我采用了“概率触发连续幅度干扰”的方案每个时间步生成一个0到1的均匀随机数若小于p_slow则该车辆的目标速度在原有基础上再减去Δv。这里有一个测试中遇到的经验Δv取定值2 m/s时HV在高速工况下减速幅度占比不大低速时则容易直接减到0造成急停从而引发后方车辆连锁减速反而放大了拥堵。后来我把Δv改成与当前速度相关的形式Δv min(2, 0.15 * v_target)低速时干扰幅度更小道路上的“幽灵堵车”现象反而更自然不会再出现那种隔几分钟就一次猛烈顿挫的失真感。随机慢化还有一个容易被忽视的作用它会直接影响基本图的形状。假如所有车辆都不慢化模型会退化成一个确定性纯跟车模型流量-密度关系会变成一条尖锐的倒V折线和真实交通流那种圆润的、有明显过渡区的曲线差异很大。加入随机慢化后自由流和拥堵流之间存在一个过渡带流量曲线开始出现分支这正是很多交通流论文里讨论的亚稳态和滞后现象。所以做混合流研究时HV的随机慢化参数一定要保留否则模型会过于理想化。3. Matlab代码实现与核心逻辑3.1 代码整体框架这套Matlab代码的设计目标是模块化和易扩展整个工程分成三个文件参数配置文件、主仿真脚本、绘图与分析函数。实际运行时只需要在命令行里调用主脚本所有图表会自动生成并保存到当前目录。主脚本的核心流程分四步设置仿真参数。包括道路长度L、仿真时长T、时间步长dt、车辆总数N、自动驾驶渗透率r、各类车辆参数等。这里为了做密度扫描通常外层再套一层for循环让N从10逐步增加到100。初始化车辆状态。在环形道路上随机放置N辆车为每辆车随机分配类型AV或HV并按照位置从小到大排序。这一步有个小陷阱如果完全随机撒点可能会出现两辆车初始就重叠的情况所以初始化后要做一次碰撞检测把间距小于最小安全距离的车辆重新调整位置。运行主循环。对每个时间步所有车辆根据2.1节的四条规则同步更新。为了消除初始状态带来的瞬态效应前20%的时间步只更新状态不记录数据之后的稳态数据用于统计分析。调用绘图函数。绘制时空图、基本图、速度分布图、渗透率影响曲线等并把数据保存为.mat文件方便后续分析。3.2 主循环实现与并行更新主循环是代码的核心我把它拆开来看。车辆状态用数组存储x是N×1的位置向量v是N×1的速度向量type是N×1的类型向量1表示AV0表示HV。由于环形道路上的车辆相对位置会随时间变化每个时间步都要重新排序并计算前车位置。以下是主循环的核心代码加了详细注释for t 1:T_steps % 每步按位置排序保证车辆编号沿道路顺序排列 [x_sorted, idx] sort(x); v_sorted v(idx); type_sorted type(idx); % 计算每辆车与前方车辆的间距 gap % 对第1到N-1辆车前车就是下一辆对第N辆前车是第1辆L x_lead [x_sorted(2:end); x_sorted(1) L]; gap x_lead - x_sorted - L_veh; % 减去车身长度 % 第一步期望加速 a_max type_sorted * a_AV (1 - type_sorted) * a_HV; v_max_i type_sorted * v_max_AV (1 - type_sorted) * v_max_HV; v_des min(v_max_i, v_sorted a_max * dt); % 第二步安全跟车限制 tau_i type_sorted * tau_AV (1 - type_sorted) * tau_HV; v_safe max(0, gap ./ tau_i); v_target min(v_des, v_safe); % 第三步随机慢化 p_slow_i type_sorted * p_slow_AV (1 - type_sorted) * p_slow_HV; slow_flag rand(N, 1) p_slow_i; delta_v min(2, 0.15 * v_target); % 慢化幅度与速度相关 v_target max(0, v_target - slow_flag .* delta_v); % 第四步位置更新并行更新所有车辆同时更新位置 v v_target; x x_sorted v * dt; end这段代码有两点需要注意。第一整个过程是严格按照并行更新规则来的所有车辆的v_target计算都基于当前时间步的初始状态计算完之后才统一更新x。这样避免了串行更新中前车位置改变导致后车误判的问题也是CA模型的精髓。第二用type_sorted做向量化运算避免了写for循环逐辆车更新在车辆数量几千以内时运行速度飞快做参数扫描时能节省大量时间。3.3 密度扫描与统计量计算研究混合流对道路通行能力的影响免不了要跑“密度扫描”。我通常让车辆总数N从10变化到100步长2对每一个N值独立跑一次完整仿真再统计这个密度下的平均流量和平均速度。统计方法要特别注意起点和终点的取舍。我的做法是总仿真时长取600秒dt0.1秒一共6000步。前2000步作为预热阶段用来“甩掉”初始状态的影响只统计后4000步的数据。因为环形道路上车辆守恒密度ρ N / L是固定的统计量只需要算两个空间平均速度v_mean mean(v)和流量q ρ * v_mean。有人可能会问流量不应该是统计单位时间通过某个截面的车辆数吗为什么直接用密度乘以速度在周期边界条件下这两种定义在长时间平均意义下是等价的。因为所有车辆都在环上转圈一段时间内通过任一断面的车辆数等于密度乘以该时间段的平均速度再乘以时间所以用q ρ × v_mean计算既方便又准确。实测下来这个统计方法和断面临时统计的结果误差在1%以内。下面是统计部分的代码片段% 预热阶段不计入统计 for t warmup_steps : T_steps % ... 主循环更新 ... if mod(t, 10) 0 v_mean_series [v_mean_series, mean(v)]; end end % 计算宏观统计量 rho N / L; v_mean_avg mean(v_mean_series); q_mean rho * v_mean_avg;跑完所有N值后把rho和q_mean分别存到数组中就能画出一条完整的流量-密度曲线也就是交通流研究里最重要的基本图。循环结束后代码会把这些数据保存在一个结构体里并对不同渗透率的实验结果做对比分析。4. 多种图表分析怎么用4.1 基本图流量-密度关系怎么看基本图能回答交通工程里的核心问题道路在什么密度下能达到最大流量自动驾驶渗透率提升之后这个最大流量能增加多少。我一般同时跑三组仿真全部HV、30%AV渗透率、100%AV渗透率然后把三条流量-密度曲线画在同一张图里效果非常直观。实测下来纯HV场景的最大流量通常在1800到2200辆/小时左右峰值出现在密度约25到35辆/公里区间超过这个密度后流量开始下降进入拥堵区。而100%AV场景的最大流量可以突破3000辆/小时且峰值密度更高说明自动驾驶车辆能在更密集的车流中维持较高速度。解读基本图有一个关键技巧注意拥堵支路的形状。纯HV场景的拥堵支路通常是一条逐渐下降的曲线流量随密度增大而线性下滑AV混入后拥堵支路会变得更加平缓说明即使进入拥堵状态AV也能通过更平稳的跟车行为维持一定的流量。这就是所谓“提高拥堵流的通行效率”比自由流部分的速度提升更值得关注。4.2 时空图直观看到交通扰动传播时空图是判断模型是否正常的“照妖镜”。横轴是道路位置纵轴是时间每辆车画成一条轨迹线。自由流状态下所有轨迹线都是平行斜线间距均匀一旦出现拥堵轨迹线会聚集成深色的拥堵带能清晰看到高速车流进入拥堵区域后减速、通过后重新加速的过程。在混合流仿真中时空图能暴露一个很有趣的现象当前方有一辆手动驾驶车因为随机慢化而减速时后面跟随的自动驾驶车辆会提前平滑减速而不是像手动车那样急刹。结果就是拥堵扰动在穿越AV车辆时会被吸收不再向后传播形成一段“静默区”。这是我做这套仿真最开始感兴趣的地方也是时空图最大的价值——它把微观驾驶行为如何影响宏观交通波传播的过程完整呈现出来了。绘制时空图时如果N30、T600秒车辆的轨迹点数量是30×6000180000用Matlab的plot会有点卡。我的经验是每10个时间步只记录一个点画出来的轨迹一样清晰但文件大小和渲染速度改善很多。4.3 速度分布和渗透率影响分析除了基本图和时空图我还会额外生成两类图表来辅助分析。一类是速度分布直方图。把所有车辆在稳态阶段的速度样本收集起来按AV和HV分组画直方图。结果通常是这样HV的速度分布比较分散标准差能达到5 m/s左右因为随机慢化导致频繁加减速AV的速度分布非常集中几乎都贴着最大速度附近标准差只有1到2 m/s。这类图能直观说明“自动驾驶让车速更稳定”对写报告或者做汇报特别有用。另一类是渗透率-平均速度曲线。固定车辆总数N比如取N30对应密度30辆/公里处于自由流向拥堵过渡的敏感区间然后把AV渗透率从0到1按0.1步长扫描每个渗透率跑20次取平均速度画成一条曲线。结果通常是一条随渗透率单调递增的曲线在渗透率从0.2增加到0.4时平均速度提升最明显超过0.6以后增速放缓。这说明小规模混入自动驾驶就能获得明显的效率收益但收益存在边际递减效应。5. 常见问题与调试经验5.1 车辆重叠与追尾参数调优的第一道坎我第一次跑这套连续型CA模型时最常遇到的bug就是车辆位置更新后出现重叠也就是后车位置超过了前车。排查下来原因基本就一个安全反应时间τ设置得太小导致v_safe gap / τ算出来的允许速度过大。举个例子前车距离只有20米τ如果取0.3秒v_safe就是66.7 m/s远超实际速度上限相当于安全限制直接失效。修正方法有两个方向一是把τ设定在合理范围HV不要小于1.0秒AV不要小于0.4秒二是在位置更新后加一步重叠检测如果出现x_i x_lead就把后车速度强制设为前车速度并让位置紧贴前车尾部。我实际验证下来第二种做法虽然简单粗暴但能有效防止数值发散适合做长时间仿真。5.2 统计结果不稳定瞬态效应和随机波动做密度扫描时有一段时间结果特别乱流量-密度曲线像一条断断续续的碎线完全没有文献里那种光滑趋势。查了半天发现是统计区间的问题有些密度下车流需要在环上跑好几圈才能进入稳态如果预热时间不够初始状态的影响会污染统计数据。解决办法是把预热时间占总仿真时长的比例从20%提高到30%同时把总时长延长到900秒。另外随机慢化具有很强的不确定性同一组参数每次运行结果都有波动。为了保证曲线平滑我强烈建议每个密度点重复计算10到20次然后取平均这在Matlab里只需要在外部套一层for循环代价很小但对结论稳定性帮助极大。5.3 参数调节和复现如何让实验结果可复现CA模型里随机慢化用了rand函数每次运行结果都不同。这个问题在学术研究里很致命——审稿人拿到你的代码跑一遍结果和你报告里的对不上这显然不行。解决方法是每次仿真前固定随机种子rng(2025)这样整个仿真流程完全可复现。但要注意做密度扫描和渗透率扫描时每个工况要使用不同的随机种子避免所有工况受同一个随机序列影响导致参数变化和随机性混在一起分不清。另外我来分享一个调试心得连续型CA的参数耦合性很强改一个参数往往会引发连锁反应。比如降低HV的随机慢化概率后HV的平均速度上升跟车距离变大反而可能让道路容量下降。所以调参时一定不要心急每次只动一个参数记录结果变化再从全局角度审视是否合理。我习惯把所有实验的配置和结果记录在一个Excel表里哪组参数对应哪个图一目了然。这套代码目前已经可以支持单车道混合流的基础研究如果后续想扩展可以考虑加入换道规则、开放边界条件、或者把自动驾驶车辆模型从规则型升级成IDM或ACC跟驰模型再把代码与路况数据对接。不过那是另一个话题了。先把基本框架跑通、把图表看明白比任何花哨的扩展都重要。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门