元胞自动机 + 社会力模型:一种高效的人员疏散仿真方法
摘要:本文介绍了一种将元胞自动机(Cellular Automaton, CA)与社会力模型(Social Force Model, SFM)深度耦合的行人疏散仿真方法。该方法在 MATLAB 中实现,通过离散网格处理空间碰撞与路径规划,同时利用连续力学方程驱动个体运动,兼顾了计算效率与物理真实性。仿真结果显示,200 名行人在 20m×30m 的封闭空间内,约 18.6 秒即可完成 90.5% 的有效疏散。
一、研究背景与问题动机
1.1 为什么需要行人疏散仿真?
人员密集场所的应急疏散一直是公共安全领域的核心课题。从地铁车站、体育场馆到大型商场,一旦发生火灾、地震或其他突发事件,如何在最短时间内将人群安全引导至出口,直接关系到生命财产的损失程度。传统的疏散方案往往依赖经验公式和静态设计规范,难以准确刻画真实场景中行人之间的复杂交互行为。
1.2 现有方法的局限性
行人仿真领域主要存在两类经典模型:
- 元胞自动机模型(CA):将空间离散化为网格,行人以"跳跃"方式在网格间移动。优点是计算效率高、碰撞避免机制天然内嵌;缺点是运动过于离散化,难以描述速度连续变化和个体受力细节。
- 社会力模型(SFM):基于牛顿力学,将行人运动视为受多种社会力和物理力驱动的连续过程。优点是物理真实性强,能刻画"拥挤""推搡"等微观行为;缺点是计算开销大,且缺乏对空间占用的刚性约束,容易出现行人重叠甚至穿透墙壁的现象。
1.3 耦合思路:取长补短
本文提出的核心思想是:以元胞自动机的离散网格作为空间管理与碰撞检测的骨架,以社会力模型的连续力学方程作为个体运动的动力引擎。两者各司其职、深度耦合,既保留了 CA 的高效空间管理优势,又借助 SFM 赋予了行人连续、真实的运动特征。
二、模型架构与主要功能
2.1 系统整体架构
本仿真系统由四大模块构成:
| 模块 | 功能 | 对应代码段 |
|---|---|---|
| 场景初始化模块 | 构建房间几何、出口、障碍物,初始化行人位置 | 初始化场景 |
| 静态地面场计算模块 | 基于 BFS 计算每个网格到最近出口的最短距离 | computeSFF |
| 社会力计算模块 | 综合计算驱动力、排斥力、摩擦力、引导力 | computeForces |
| 可视化与统计模块 | 2D/3D 实时渲染、密度热图、疏散统计曲线 | updatePlots / showFinalResults |
2.2 核心功能一览
- 多出口场景建模:支持在任意墙壁位置设置多个出口,系统自动为每位行人分配最近出口。
- 障碍物规避:矩形障碍物自动映射到离散网格,并通过排斥力场影响行人路径。
- 五种力的耦合计算:驱动力、行人排斥力、墙壁排斥力、障碍物排斥力、地面场引导力。
- 丰富的可视化输出 :
- 二维俯视图(含速度色标与方向矢量)
- 三维透视图(含墙壁、障碍物、行人球体模型)
- 行人密度热图 + 平均速度矢量场
- 疏散统计面板(剩余人数、累计疏散、瞬时疏散率)
- 疏散效能评估:输出总疏散时间、疏散率、各出口分担比例、疏散时间分布直方图。
三、算法步骤与技术路线
3.1 算法总流程
Step 1: 参数配置(房间尺寸、行人数量、力模型参数)
↓
Step 2: 初始化网格(0=空地, 1=墙, 2=障碍物, 3=出口)
↓
Step 3: 随机生成行人位置(避免重叠)
↓
Step 4: 计算静态地面场(SFF)------ BFS 最短路径
↓
Step 5: 为每位行人分配最近出口
↓
Step 6: 【主循环】计算社会力 → 更新速度/位置 → 碰撞检测 → 检查出口
↓
Step 7: 记录统计数据 → 可视化更新
↓
Step 8: 重复 Step 6~7 直至所有行人疏散或超时
↓
Step 9: 输出最终统计结果与图表
3.2 静态地面场(Static Floor Field, SFF)
静态地面场是 CA 模型的经典组件,用于编码"到出口的距离信息"。本系统采用**广度优先搜索(BFS)**从所有出口格子向外扩散,计算每个空地格子到最近出口的欧几里得距离:
matlab
SFF(cy, cx) = SFF(cy, cx) + norm(dirs(d,:)) * p.cellSize
其中 dirs 包含 8 个方向(4 邻域 + 4 对角),对角方向的距离权重为 sqrt(2)。SFF 值越小,表示该位置离出口越近,后续将作为引导力的一部分驱动行人向出口移动。
3.3 社会力计算流程
对于每一位活跃行人 i,按以下顺序计算合力:
- 驱动力:朝向分配出口的自驱动力
- 行人排斥力 :来自其他行人
j的指数衰减排斥力 + 身体接触弹性力 + 滑动摩擦力 - 墙壁排斥力:来自四面墙壁的指数衰减排斥力
- 障碍物排斥力:来自矩形障碍物的最近点排斥力
- 地面场引导力:沿 SFF 梯度下降方向的辅助引导力
3.4 位置更新与碰撞检测
matlab
v_new = v_old + (F / mass) * dt
x_new = x_old + v_new * dt
更新后的位置需通过 validatePos 函数验证:
- 是否在房间边界内(考虑行人半径)
- 是否与障碍物发生碰撞
- 是否落在墙壁或障碍物网格上
若验证失败,则速度清零、位置保持不变,实现"刚性碰撞"效果。
四、公式原理与参数设定
4.1 社会力模型核心公式
本系统基于 Helbing 等人提出的经典社会力模型框架,其基本运动方程为:
midv⃗idt=F⃗idrive+∑j≠iF⃗ijped+∑wF⃗iwwall+F⃗iSFFm_i \frac{d\vec{v}i}{dt} = \vec{F}i^{drive} + \sum{j \neq i} \vec{F}{ij}^{ped} + \sum_{w} \vec{F}_{iw}^{wall} + \vec{F}_i^{SFF}midtdv i=F idrive+j=i∑F ijped+w∑F iwwall+F iSFF
(1)自驱动力(Driving Force)
F⃗idrive=mi⋅vi0e⃗i−v⃗iτ\vec{F}_i^{drive} = m_i \cdot \frac{v_i^0 \vec{e}_i - \vec{v}_i}{\tau}F idrive=mi⋅τvi0e i−v i
其中:
- vi0v_i^0vi0 为行人期望速度
- e⃗i\vec{e}_ie i 为指向目标出口的单位方向向量
- τ\tauτ 为松弛时间,表征行人调整速度的快慢
(2)行人排斥力(Pedestrian Repulsion)
F⃗ijped=Aped⋅exp(rij−dijBped)⋅n⃗ij\vec{F}{ij}^{ped} = A{ped} \cdot \exp\left(\frac{r_{ij} - d_{ij}}{B_{ped}}\right) \cdot \vec{n}_{ij}F ijped=Aped⋅exp(Bpedrij−dij)⋅n ij
当发生身体接触(dij<rijd_{ij} < r_{ij}dij<rij)时,追加:
F⃗ijbody=kbody⋅gij⋅n⃗ij+κ⋅gij⋅Δvijt⋅t⃗ij\vec{F}{ij}^{body} = k{body} \cdot g_{ij} \cdot \vec{n}{ij} + \kappa \cdot g{ij} \cdot \Delta v_{ij}^t \cdot \vec{t}_{ij}F ijbody=kbody⋅gij⋅n ij+κ⋅gij⋅Δvijt⋅t ij
其中 gij=max(0,rij−dij)g_{ij} = \max(0, r_{ij} - d_{ij})gij=max(0,rij−dij) 为重叠量,t⃗ij\vec{t}{ij}t ij 为切向单位向量,Δvijt\Delta v{ij}^tΔvijt 为相对速度的切向分量。
(3)墙壁排斥力(Wall Repulsion)
F⃗iwwall=Awall⋅exp(−dwBwall)⋅n⃗w\vec{F}{iw}^{wall} = A{wall} \cdot \exp\left(-\frac{d_w}{B_{wall}}\right) \cdot \vec{n}_wF iwwall=Awall⋅exp(−Bwalldw)⋅n w
其中 dwd_wdw 为行人与墙壁的垂直距离,仅在 dw<0.8 md_w < 0.8\,\text{m}dw<0.8m 时激活。
(4)地面场引导力(SFF Guidance)
F⃗iSFF=80⋅(−∇SFF∣∇SFF∣)\vec{F}_i^{SFF} = 80 \cdot \left(-\frac{\nabla SFF}{|\nabla SFF|}\right)F iSFF=80⋅(−∣∇SFF∣∇SFF)
通过有限差分计算 SFF 的空间梯度,产生一个恒定的、指向出口方向的辅助力。
4.2 参数设定表
| 参数 | 符号 | 数值 | 物理意义 |
|---|---|---|---|
| 房间宽度 | WWW | 20 m | 仿真空间 Y 方向尺寸 |
| 房间长度 | LLL | 30 m | 仿真空间 X 方向尺寸 |
| 元胞大小 | Δx\Delta xΔx | 0.5 m | 离散网格分辨率 |
| 行人总数 | NpedN_{ped}Nped | 200 | 仿真人群规模 |
| 行人半径 | rpedr_{ped}rped | 0.25 m | 个体空间占用 |
| 期望速度均值 | vˉ0\bar{v}_0vˉ0 | 1.4 m/s | 正常行走速度 |
| 期望速度标准差 | σv0\sigma_{v0}σv0 | 0.2 m/s | 个体速度差异 |
| 行人质量 | mmm | 70 kg | 平均体重 |
| 松弛时间 | τ\tauτ | 0.5 s | 速度响应时间常数 |
| 行人排斥强度 | ApedA_{ped}Aped | 2000 N | 心理排斥力幅值 |
| 行人排斥范围 | BpedB_{ped}Bped | 0.08 m | 排斥力衰减特征长度 |
| 墙壁排斥强度 | AwallA_{wall}Awall | 3000 N | 墙壁排斥力幅值 |
| 墙壁排斥范围 | BwallB_{wall}Bwall | 0.05 m | 墙壁排斥特征长度 |
| 身体弹性系数 | kbodyk_{body}kbody | 120000 kg/s² | 接触变形刚度 |
| 滑动摩擦系数 | κ\kappaκ | 240000 kg/(m·s) | 切向摩擦阻尼 |
| 时间步长 | Δt\Delta tΔt | 0.02 s | 数值积分步长 |
| 最大模拟时间 | TmaxT_{max}Tmax | 100 s | 仿真终止条件 |
| 速度上限 | vmaxv_{max}vmax | 3.0 m/s | 防止数值发散 |
| SFF 引导力系数 | --- | 80 N | 地面场引导力强度 |
五、运行环境与代码实现
5.1 运行环境
- MATLAB R2018a 及以上版本
- 无需额外工具箱(纯 MATLAB 脚本实现)
- 内存占用约 200 MB(200 人 × 5000 步)
- 单核运行,约 20 分钟完成一次完整仿真(含实时可视化)
5.2 代码结构
matlab
CA_SFM_Evacuation.m % 主函数
├── 参数配置区 % 场景、行人、力模型、模拟参数
├── 初始化区 % 网格生成、行人放置、SFF 计算
├── 主循环区 % 力计算 → 运动更新 → 统计 → 可视化
├── computeSFF() % BFS 计算静态地面场
├── computeForces() % 五种力的耦合计算
├── validatePos() % 位置碰撞验证
├── checkExit() % 出口检测与状态更新
├── initFigures() % 图形窗口初始化
├── updatePlots() % 实时可视化更新
├── drawWall() % 3D 墙壁绘制辅助函数
└── showFinalResults() % 最终统计图表输出
5.3 关键代码片段
社会力计算核心循环:
matlab
for i = 1:N
% 1) 自驱动力
Fx(i) = Fx(i) + (ped.v0(i)*ex - ped.vx(i)) / p.tau * p.mass;
Fy(i) = Fy(i) + (ped.v0(i)*ey - ped.vy(i)) / p.tau * p.mass;
% 2) 行人排斥力(含接触力与摩擦力)
for j = 1:N
f = p.A_ped * exp((rij - d) / p.B_ped);
if d < rij
Fx(i) = Fx(i) + p.k_body * gij * nx + p.kappa * gij * dv * tx2;
end
end
% 3) 墙壁排斥力
% 4) 障碍物排斥力
% 5) 地面场引导力
end
六、仿真结果与分析








6.1 场景设置
- 房间尺寸:20 m × 30 m
- 出口:2 个(底部中央 2m 宽、右侧中部 2m 宽)
- 障碍物:1 个矩形柱子(2m × 3m,位于房间中部偏左)
- 行人:200 名,初始随机均匀分布
6.2 疏散过程动态
| 时间节点 | 剩余人数 | 已疏散 | 疏散阶段特征 |
|---|---|---|---|
| t = 0.0 s | 200 | 0 | 初始状态,行人静止 |
| t = 1.9 s | 195 | 5 | 早期疏散,人群开始移动 |
| t = 4.0 s | 162 | 38 | 快速疏散期,密度较高 |
| t = 8.0 s | 89 | 111 | 疏散高峰,出口出现拥堵 |
| t = 12.0 s | 47 | 153 | 疏散减速,剩余人员分散 |
| t = 16.0 s | 24 | 176 | 尾部疏散,障碍物附近滞留 |
| t = 20.0 s | 19 | 181 | 基本稳定,19 人被困 |
| t = 100.0 s | 19 | 181 | 仿真终止,疏散率 90.5% |
6.3 关键发现
-
疏散时间分布:大部分行人在 5~10 秒内完成疏散,符合"先快后慢"的典型特征。少数行人因靠近障碍物或处于远离出口的角落,疏散时间延长至 15 秒以上。
-
出口分担不均:底部中央出口(出口 1)承担了约 63% 的疏散量,右侧出口(出口 2)约 37%。这反映了"最近出口优先"分配策略在实际场景中可能导致负载不均衡。
-
障碍物影响:房间中央的柱子对疏散路径产生了显著干扰。从最终状态图可见,有 19 名行人被困在障碍物附近无法找到有效路径,这是模型在障碍物绕行策略上的一个改进空间。
-
瞬时疏散率峰值:疏散率在初期(t ≈ 2~5 s)达到峰值,约 30~40 人/秒(平滑后),随后迅速下降。这与真实疏散场景中"瓶颈效应"导致的前期高峰、后期长尾现象一致。
七、应用场景与拓展方向
7.1 直接应用场景
- 建筑消防设计评估:在建筑设计阶段,通过仿真评估不同出口布局、宽度对疏散效率的影响,优化安全出口数量和位置。
- 大型活动安保预案:演唱会、体育赛事等临时性密集人群活动,提前模拟疏散方案,识别潜在瓶颈区域。
- 地铁站台疏散优化:分析不同列车到站频率、站台宽度条件下的乘客疏散时间,为运营调度提供数据支撑。
- 应急演练数字化:替代部分实体演练,以低成本、可重复的方式测试不同应急策略的效果。
7.2 模型拓展方向
| 拓展方向 | 实现思路 |
|---|---|
| 动态障碍物 | 引入可移动障碍物(如翻倒的家具、车辆),更新 SFF 计算逻辑 |
| 恐慌情绪建模 | 在期望速度 v0v_0v0 中引入恐慌系数,高恐慌时速度提升但决策能力下降 |
| 多楼层疏散 | 扩展为三维网格,增加楼梯、电梯等垂直通道模型 |
| 群体行为 | 引入"跟随效应",行人倾向于跟随前方密度较低的方向 |
| 真实场景标定 | 利用视频监控数据提取真实行人轨迹,标定模型参数 |
| 并行加速 | 将力计算部分改写为 GPU 并行,支持万人级大规模仿真 |
八、总结
本文详细介绍了一种元胞自动机与社会力模型耦合的人员疏散仿真方法。该方法通过离散网格管理空间占用,通过连续力学方程驱动个体运动,在计算效率与物理真实性之间取得了良好的平衡。
核心创新点:
- 将 CA 的 SFF 地面场作为 SFM 的辅助引导力,实现了离散路径规划与连续运动的无缝衔接
- 五种力的分层计算策略,使模型既能刻画微观交互,又能保持数值稳定性
- 丰富的可视化输出,为疏散过程的机理分析提供了直观工具
局限与改进:障碍物绕行策略有待加强,可考虑引入动态路径重规划机制;行人出口分配采用静态最近原则,可拓展为基于实时拥堵程度的动态分配。
代码获取:本文所述 MATLAB 代码为完整可运行脚本,包含参数配置、核心算法、可视化输出等全部功能。读者可根据实际场景调整房间尺寸、出口位置、障碍物布局及行人参数,快速开展定制化疏散仿真研究。私信回复元胞自动机 + 社会力模型:一种高效的人员疏散仿真方法获取
本文基于 MATLAB 仿真代码与输出结果撰写,所有图表数据均来自实际运行结果。