一、元胞自动机火灾烟雾蔓延模型设计
1. 元胞空间定义
- 网格划分:将超市平面图离散化为二维正方形网格(如0.5m×0.5m/元胞),每个元胞代表一个空间单元。
- 状态变量:
- 火灾状态:未燃烧(0)、燃烧中(1)、已烧毁(2)。
- 烟雾浓度:0-100%的连续值,影响能见度与人员逃生速度。
- 温度场:与燃烧元胞相邻区域的温度梯度。
2. 演化规则设计
- 火势传播规则:
- 基础蔓延概率:
P
f
i
r
e
=
P
b
a
s
e
⋅
(
1
+
k
w
⋅
W
)
⋅
(
1
+
k
s
⋅
S
)
P_{fire} = P_{base} \cdot (1 + k_w \cdot W) \cdot (1 + k_s \cdot S)
Pfire=Pbase⋅(1+kw⋅W)⋅(1+ks⋅S)
其中, W W W为风速修正因子, S S S为坡度修正因子, k w , k s k_w, k_s kw,ks为权重系数。 - 动态燃料影响:可燃物密度高的区域燃烧时间更长,火势传播更快。
- 基础蔓延概率:
P
f
i
r
e
=
P
b
a
s
e
⋅
(
1
+
k
w
⋅
W
)
⋅
(
1
+
k
s
⋅
S
)
P_{fire} = P_{base} \cdot (1 + k_w \cdot W) \cdot (1 + k_s \cdot S)
Pfire=Pbase⋅(1+kw⋅W)⋅(1+ks⋅S)
- 烟雾扩散规则:
- 垂直扩散:3-4 m/s(模拟“烟囱效应”)。
- 水平扩散:0.5-0.8 m/s,受障碍物阻挡时扩散速度降低。
- 浓度衰减:随时间呈指数衰减: C ( t ) = C 0 ⋅ e − λ t C(t) = C_0 \cdot e^{-\lambda t} C(t)=C0⋅e−λt, λ \lambda λ为通风系数。
3. 物理参数校准
- 火源参数:
- 初始热释放速率(HRR):根据可燃物类型选择(如木材300 kW/m²,塑料800 kW/m²)。
- 火焰蔓延速度:慢速(5 mm/s)至极快(50 mm/s)。
- 烟雾毒性模型:
- CO浓度阈值:50 ppm(安全),200 ppm(致命)。
- 能见度衰减公式: V = 10 / ( C ⋅ K ) V = 10/(C \cdot K) V=10/(C⋅K), K K K为烟雾消光系数(通常取8 m⁻¹)。
二、人员疏散元胞自动机模型
1. 行人行为建模
- 状态定义:
- 空闲(0)、行人(1)、障碍物(-1)、出口(2)。
- 扩展属性:移动速度、恐慌系数、路径记忆。
- 移动规则:
- 方向吸引力:
A
i
=
α
⋅
D
e
x
i
t
+
β
⋅
C
c
r
o
w
d
A_i = \alpha \cdot D_{exit} + \beta \cdot C_{crowd}
Ai=α⋅Dexit+β⋅Ccrowd
D e x i t D_{exit} Dexit为到出口的归一化距离, C c r o w d C_{crowd} Ccrowd为周围人群密度吸引力。 - 避障逻辑:采用Moore邻居检测8方向可通行性。
- 恐慌效应:烟雾浓度超阈值时,移动速度增加但方向随机性增强。
- 方向吸引力:
A
i
=
α
⋅
D
e
x
i
t
+
β
⋅
C
c
r
o
w
d
A_i = \alpha \cdot D_{exit} + \beta \cdot C_{crowd}
Ai=α⋅Dexit+β⋅Ccrowd
2. 冲突解决机制
- 竞争占点原则:当多个行人目标元胞冲突时,按优先级分配:
- 距离出口更近的行人优先。
- 速度更快的行人优先。
- 随机选择(模拟无序竞争)。
3. 动态环境耦合
- 烟雾影响:
- 能见度低于5m时,路径选择概率下降30%。
- CO浓度超过100 ppm时,人员移动速度降低50%。
- 火势阻断:燃烧元胞自动标记为不可通行障碍物。
三、Matlab GUI实现方案
1. 界面设计(使用App Designer)
- 控件布局:
- 可视化区域:Axes组件显示超市平面、火势及人群动态。
- 参数输入:Edit Field设置火源位置、人员密度、通风条件等。
- 控制按钮:Start/Pause/Reset控制仿真流程。
- 实时更新:
function updatePlot(app) % 火灾状态矩阵更新 imagesc(app.UIAxes, fireMatrix); % 人员位置叠加 hold(app.UIAxes, 'on'); scatter(app.UIAxes, peopleX, peopleY, 'g','filled'); hold(app.UIAxes, 'off'); end
2. 核心算法结构
% 主仿真循环
for t = 1:maxTime
% 火势蔓延计算
fireMatrix = updateFire(fireMatrix, wind, slope);
% 烟雾扩散计算
smokeMatrix = diffuseSmoke(smokeMatrix, vents);
% 人员移动决策
[peoplePos, exits] = movePeople(peoplePos, exits, smokeMatrix);
% GUI刷新
updatePlot();
pause(0.1); % 控制仿真速度
end
3. 性能优化策略
- 矩阵化运算:避免循环,使用conv2函数实现邻居状态统计。
- 并行计算:将火灾与疏散计算分配到不同parfor线程。
- LOD渲染:当元胞数量>10^4时,采用动态细节层次(LOD)简化绘制。
四、数据准备与验证
1. 超市平面图获取
- 数据来源:
- 建筑图纸网站(如筑图网、建E网)下载DWG/CAD文件。
- 手动绘制简化平面图(标注货架、出口、通道)。
- 格式转换:使用
dxf2matlab
工具将CAD图层转为二进制障碍矩阵。
2. 模型验证方法
- 历史数据对比:与FDS模拟结果或真实火灾记录对比蔓延速度误差(要求<15%)。
- 敏感性分析:测试关键参数(如风速、人员密度)对疏散时间的影响。
- 正交实验设计:采用L9(3^4)正交表评估参数交互作用。
五、完整代码框架示例
% 初始化
function initializeSimulation(app)
% 读取平面图数据
app.layout = imread('supermarket_map.png');
% 初始化火源
app.fireMatrix = zeros(size(app.layout));
app.fireMatrix(50,50) = 1; % 初始火源位置
% 生成随机人员
app.peoplePos = randi([1,size(app.layout,1)], 100, 2);
end
% 火势更新函数
function fireMatrix = updateFire(fireMatrix, windDir)
kernel = [0.05 0.2 0.05; 0.2 0 0.2; 0.05 0.2 0.05]; % 蔓延核
newFire = conv2(fireMatrix>0, kernel, 'same');
fireMatrix(newFire>0.15 & fireMatrix==0) = 1; % 点燃新元胞
fireMatrix(fireMatrix==1) = 2; % 标记为已燃烧
end
% 人员移动函数
function [peoplePos] = movePeople(peoplePos, exits, smoke)
for i = 1:size(peoplePos,1)
% 计算到各出口的吸引力
dist = vecnorm(exits - peoplePos(i,:), 2, 2);
[~, target] = min(dist);
% 选择移动方向
dx = sign(exits(target,1) - peoplePos(i,1));
dy = sign(exits(target,2) - peoplePos(i,2));
% 更新位置(需添加碰撞检测)
peoplePos(i,:) = peoplePos(i,:) + [dx, dy];
end
end