基于MATLAB的室内人员疏散模拟代码,使用元胞自动机(Cellular Automata, CA)实现:

1. 初始化参数

% 定义网格尺寸
gridSizeX = 50;
gridSizeY = 50;

% 定义人员数量和初始位置
numPeople = 100;
peoplePositions = randi([1, gridSizeX], numPeople, 2);

% 定义出口位置
exitPosition = [25, gridSizeY]; % 假设出口在底部中央

% 初始化网格,0表示空,1表示人员,-1表示出口
grid = zeros(gridSizeX, gridSizeY);
grid(exitPosition(1), exitPosition(2)) = -1;

% 初始化人员状态
for i = 1:numPeople
    grid(peoplePositions(i, 1), peoplePositions(i, 2)) = 1;
end

2. 更新规则

function newGrid = updateGrid(grid, exitPosition)
    % 获取网格尺寸
    [gridSizeX, gridSizeY] = size(grid);
    
    % 初始化新网格
    newGrid = grid;
    
    % 遍历每个元胞
    for i = 1:gridSizeX
        for j = 1:gridSizeY
            % 如果当前元胞是人员
            if grid(i, j) == 1
                % 获取邻居元胞
                neighbors = getNeighbors(grid, i, j);
                
                % 计算每个邻居元胞的吸引力
                attractiveness = calculateAttractiveness(grid, neighbors, exitPosition);
                
                % 选择吸引力最大的邻居元胞
                [~, idx] = max(attractiveness);
                chosenNeighbor = neighbors(idx);
                
                % 如果选择的邻居元胞是出口,则人员疏散成功
                if chosenNeighbor == exitPosition
                    newGrid(i, j) = 0;
                else
                    % 否则,人员移动到选择的邻居元胞
                    newGrid(i, j) = 0;
                    newGrid(chosenNeighbor(1), chosenNeighbor(2)) = 1;
                end
            end
        end
    end
end

function neighbors = getNeighbors(grid, i, j)
    % 获取当前元胞的邻居元胞
    neighbors = [];
    [gridSizeX, gridSizeY] = size(grid);
    
    % 上下左右四个邻居
    if i > 1
        neighbors = [neighbors; [i-1, j]];
    end
    if i < gridSizeX
        neighbors = [neighbors; [i+1, j]];
    end
    if j > 1
        neighbors = [neighbors; [i, j-1]];
    end
    if j < gridSizeY
        neighbors = [neighbors; [i, j+1]];
    end
end

function attractiveness = calculateAttractiveness(grid, neighbors, exitPosition)
    % 计算每个邻居元胞的吸引力
    attractiveness = zeros(size(neighbors, 1), 1);
    for k = 1:size(neighbors, 1)
        % 距离出口越近,吸引力越大
        attractiveness(k) = -norm(neighbors(k, :) - exitPosition);
    end
end

3. 主函数

function indoor_evacuation_simulation()
    % 定义网格尺寸
    gridSizeX = 50;
    gridSizeY = 50;

    % 定义人员数量和初始位置
    numPeople = 100;
    peoplePositions = randi([1, gridSizeX], numPeople, 2);

    % 定义出口位置
    exitPosition = [25, gridSizeY]; % 假设出口在底部中央

    % 初始化网格,0表示空,1表示人员,-1表示出口
    grid = zeros(gridSizeX, gridSizeY);
    grid(exitPosition(1), exitPosition(2)) = -1;

    % 初始化人员状态
    for i = 1:numPeople
        grid(peoplePositions(i, 1), peoplePositions(i, 2)) = 1;
    end

    % 模拟疏散过程
    for t = 1:100
        % 更新网格状态
        grid = updateGrid(grid, exitPosition);
        
        % 绘制当前状态
        imagesc(grid);
        colormap([1 1 1; 0 0 1; 1 0 0]); % 空元胞为白色,人员为蓝色,出口为红色
        drawnow;
    end
end

jllllyuz
554 声望36 粉丝