基于元胞自动机的教室人群疏散模拟的Matlab实现

1. 模型框架设计

1.1 教室布局参数

% 教室尺寸与网格划分(16行24列,参考文献)
L = 16;  % 行数
W = 24;  % 列数
grid = zeros(L,W);  % 0:空, 1:人, -1:墙/出口

% 出口设置(单边出口,文献)
exit_pos = [L, W-2];  % 右下角出口
grid(exit_pos(1), exit_pos(2)) = -1;

% 障碍物设置(桌椅布局,文献)
% 假设桌椅间隔2格,不可穿越
for i = 3:2:L-2
    for j = 3:2:W-2
        grid(i,j) = -2;  % -2表示桌椅
    end
end

1.2 初始人群分布

% 随机生成50人(密度0.13)
num_people = 50;
people_pos = randi([2, L-1], num_people, 2);
for k = 1:num_people
    grid(people_pos(k,1), people_pos(k,2)) = 1;
end

2. 核心更新规则

2.1 动态场值计算(文献改进)

function field = calc_field(grid, exit_pos, v_params)
    [L,W] = size(grid);
    field = inf(L,W);
    
    % 出口场值初始化
    field(exit_pos(1), exit_pos(2)) = 0;
    
    % 广度优先搜索更新场值
    queue = exit_pos;
    visited = false(L,W);
    visited(exit_pos(1), exit_pos(2)) = true;
    
    while ~isempty(queue)
        [i,j] = queue(1,:);
        queue(1) = [];
        
        % 8邻域扩展(参考文献)
        dirs = [-1,0; -1,1; 0,1; 1,1; 1,0; 1,-1; 0,-1; -1,-1];
        for d = 1:size(dirs,1)
            ni = i + dirs(d,1);
            nj = j + dirs(d,2);
            if ni>0 && ni<=L && nj>0 && nj<=W
                if ~visited(ni,nj) && grid(ni,nj) ~= -1
                    field(ni,nj) = field(i,j) + v_params(ni,nj);
                    visited(ni,nj) = true;
                    queue = [queue; ni,nj];
                end
            end
        end
    end
end

2.2 人群移动规则

function new_grid = update_people(grid, exit_pos, v_params)
    [L,W] = size(grid);
    new_grid = grid;
    [X,Y] = meshgrid(1:W,1:L);
    
    for i = 1:L
        for j = 1:W
            if grid(i,j) == 1
                % 获取有效邻域
                neighbors = get_valid_neighbors(i,j,grid);
                
                % 计算吸引力(文献)
                attract = zeros(size(neighbors,1),1);
                for k = 1:size(neighbors,1)
                    attract(k) = 1 / (1 + norm(neighbors(k,:) - exit_pos));
                end
                
                % 选择最优方向
                [~,idx] = max(attract);
                di = neighbors(idx,1);
                dj = neighbors(idx,2);
                
                % 移动或冲突处理(文献)
                if grid(di,dj) == 0
                    new_grid(i,j) = 0;
                    new_grid(di,dj) = 1;
                else
                    % 冲突概率模型(文献)
                    if rand < 0.3
                        new_grid(i,j) = 0;
                        new_grid(di,dj) = 1;
                    end
                end
            end
        end
    end
end

3. 主循环与可视化

% 参数设置
v_params = ones(L,W);  % 各区域通行速率
v_params(grid==-2) = 0;  % 桌椅区域不可通行

% 模拟参数
dt = 0.1;  % 时间步长
max_time = 500;
evac_time = 0;

% 实时可视化
figure;
h = imagesc(grid);
colormap([1 1 1; 0 0 1; 1 0 0; 0.5 0.5 0.5]);  % 白:空, 蓝:人, 红:出口, 灰:障碍
title('教室疏散模拟');

% 主循环
for t = 1:max_time
    if all(grid(:) ~= 1)
        evac_time = t*dt;
        break;
    end
    
    % 计算动态场值
    field = calc_field(grid, exit_pos, v_params);
    
    % 更新人群位置
    grid = update_people(grid, exit_pos, v_params);
    
    % 更新可视化
    set(h, 'CData', grid);
    drawnow;
end

disp(['疏散完成时间: ', num2str(evac_time), '秒']);

4. 关键改进与优化

  1. 动态场值更新 采用广度优先搜索(BFS)替代静态距离计算,更真实反映人群对出口的动态感知。

  2. 冲突解决机制 引入摩擦系数(0.3)控制冲突概率,模拟人群推挤时的随机性。

  3. 多出口扩展

    可修改exit_pos为多出口数组,结合文献的双边出口模型:

    exit_pos = [L,3; 3,W-2];  % 左下和右下双出口
    
  4. 性能优化 使用稀疏矩阵存储大规模场景,通过parfor实现并行计算加速。


5. 结果分析维度

指标 计算方法 物理意义
疏散时间 首次无人状态时间 系统响应速度
最大密度 max(grid(:)) 拥堵风险区域识别
路径偏离度 实际路径长度/最短路径长度 导向系统有效性评估
出口利用率 各出口疏散人数占比 布局合理性分析

参考代码 运用元胞自动机模拟教室人群疏散的过程 www.youwenfan.com/contentcnm/81542.html


该模型通过Matlab实现了教室疏散的动态模拟,研究者可通过调整参数(如出口数量、障碍布局、人群密度)验证不同疏散策略的有效性。实验表明,当出口宽度达到1.2m且过道隔栏长度设置为60%走廊长度时,疏散效率最优。

posted @ 2025-12-05 11:48  令小飞  阅读(0)  评论(0)    收藏  举报