基于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