Matlab实现基于元胞自动机模拟室内人员疏散的最基本模型
1 简介
为了消除礼堂的安全隐患,制定 行之有效的应急预案,有必要对礼堂人群疏散运动进行研究,掌握礼堂人群疏散的一般特点和规律.采用基于二维元胞自动机模型对某高校礼堂发生人群疏散运动进 行仿真,找出影响礼堂人群疏散效率的关键因素,为高校礼堂设计提供支持;为高校礼堂制定突发事件应急预案提供参考.
2 部分代码
function [Occupied, DynField, cur_evacuated] = myUpdate(OccupiedOld, DynFieldOld, StatField, params)
% 在这个函数里面将完成障碍物静止与人员移动
% 这个函数能跑通,本来的update不知道为什么跑不通。
global neibrs;
global neighborFlags;
global inverseNeighbors;
global inverseNeighborFlags;
neibrs = [-1 0 ; +1 0 ; 0 -1; 0 +1; 0 0];
neighborFlags = [1, 2, 4, 8, 16, 0];
inverseNeighbors = [2 1 4 3 0]; % 与neibrs互为倒置关系,会在move的32行体现出来
inverseNeighborFlags(1) = 0; % 跟前面的 neighborFlags 相对应
inverseNeighborFlags(2) = 1;
inverseNeighborFlags(4) = 2;
inverseNeighborFlags(8) = 3;
inverseNeighborFlags(16) = 4; % 0 1 0 2 0 0 0 3 0 0 0 0 0 0 0 4
[n, m] = size(OccupiedOld); % 即 n = m = 50.
Occupied = OccupiedOld; % 这里的OccupiedOld就是更新前的Occupied,即evacuation.m中的Occupied。
DynField = DynFieldOld; % 同上。
miu = params(5); % friction parameter = 0.1
cur_evacuated = 0;
for i = 2: n-1 % 因为1和n是墙
for j = 2: m-1 % 1和m是墙
if(OccupiedOld(i,j) == 0 || OccupiedOld(i,j) == 100) % 找到不是空和障碍物的(i,j)
continue; % 即布置了人的(i,j),不然一直对i,j进行循环
end
% 每循环出一个有人的(i,j),就进一次move,确定移动的方向
[moveI, moveJ, id] = move(OccupiedOld, DynFieldOld, StatField, i, j, params);
if(id ~= 0) % if we moved - to door or to empty cell ,如果不是停步不前,对应的是move里面id=5
id = neighborFlags(id+1);
DynField(i, j) = DynField(i, j)+1; % 该位置有人经过,则Dyn+1
Occupied(i, j) = 0; % 这一点的人走了过后,这个位置的Occupied就又重置为0了
%if not door keep tracking who is in
if ((moveI>1) && (moveI<n) && (moveJ>1) && (moveJ<m)) % 如果这个点的下一步,即moveI和moveJ都还在房间内
Occupied(moveI,moveJ) = bitor(Occupied(moveI, moveJ),id); % bitor 是按位逻辑或运算,赋值为之后的惯性方向寻找做铺垫
else
cur_evacuated = cur_evacuated + 1;
end
end
end
end
% resolve conflicts 解决冲突,miu的概率所有人原地不动
% if several pedestrains decided to move to the same cell
% with probability miu all pedestrains stay on thier previous places
% and with probability 1 - miu one random pedestrain moves
for i = 2: n-1
for j = 2: m-1
if(Occupied(i,j) == 0) % 找到不是0的即已经被占据的(i,j)
continue;
end
candidates = zeros(1);
cnt = 1;
for k=1:4 % 为什么k只需要是1:4?
and_ = bitand(Occupied(i,j), neighborFlags(k+1)); % bitand 是按位逻辑且运算
if(and_ == neighborFlags(k+1)) % if somebody entered cell
candidates(cnt) = k; % from direction of k-th neighbor
cnt = cnt + 1;
end
end
if(length(candidates) > 1)
event = rand(1);
if(event > miu) % one moves
% chose moving with equal probability
move_id = randi(length(candidates));
Occupied(i, j) = neighborFlags(candidates(move_id)+1);
if( (i <= 1) || (i >= n) || (j <= 1) || (j >= m)) %if door
cur_evacuated = cur_evacuated-length(candidates)+1;
end
for k=1:length(candidates)
if(k ~= move_id)
[moveI, moveJ] = getNeighbor(i, j, candidates(k));
DynField(moveI, moveJ) = DynField(moveI, moveJ)-1;
Occupied(moveI,moveJ) = 1;
end
end
else % nobody moves
Occupied(i,j) = 0;
if((i <= 1) || (i >= n) || (j <= 1) || (j >= m)) % if door
cur_evacuated = cur_evacuated - length(candidates);
end
for k=1:length(candidates)
[moveI, moveJ] = getNeighbor(i, j, candidates(k));
DynField(moveI, moveJ) = DynField(moveI, moveJ)-1;
Occupied(moveI,moveJ) = 1;
end
end
end
end
end
%update Dynamic field
alpha = params(3); % diffusion of dynamic field
delta = params(4); % decay of dynamic field
for i = 2: n -1
for j = 2: m -1
eventDecay = rand(1);
if(DynField(i,j) == 0) % D must be non-negative
continue;
end
if(eventDecay < delta)
DynField(i, j) = DynField(i, j) - 1; % decay
end
if(DynField(i,j) == 0) % D must be non-negative 非负
continue;
end
eventDiffuse = rand(1);
if(eventDiffuse < alpha)
DynField(i, j) = DynField(i, j) - 1; % diffuse
% choose neight to which boson will move
nightborToDecay = randi(4);
[moveI, moveJ] = getNeighbor(i, j, nightborToDecay);
DynField(moveI, moveJ) = DynField(moveI, moveJ) + 1;
end
end
end
% Occupied=zeros(50,50);
% DynField=zeros(50,50);
% cur_evacuated=0;
end
3 仿真结果
4 参考文献
[1]梅圣显. 基于元胞自动机模型的公共场所人员应急疏散研究. Diss. 哈尔滨工业大学.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。
Matlab实现基于元胞自动机模拟室内人员疏散的最基本模型相关推荐
- 【元胞自动机】基于元胞自动机模拟双通道人群疏散含Matlab源码
1 简介 为了消除礼堂的安全隐患,制定行之有效的应急预案,有必要对礼堂人群疏散运动进行研究,掌握礼堂人群疏散的一般特点和规律.采用基于二维元胞自动机模型对某高校礼堂发生人群疏散运动进行仿真,找出影响礼 ...
- 【元胞自动机】基于元胞自动机模拟晶体生长附matlab代码
1 内容介绍 基于溶质扩散和界面能的作用,考虑成分过冷,曲率过冷,界面能各 向异性和界面扰动等因素,建立了单个等轴枝晶的生长模型.采用元胞自动机(cellular automata)方法模拟了枝晶生长 ...
- 【元胞自动机】基于元胞自动机模拟商场人流量matlab代码
1 简介 本文属于计算机科学和交通工程的交叉领域,涉及一种基于元胞自动机的商场行人微观仿真方法,首先对商场行人区域网格化处理,得到元胞自动机模型相应的元胞空间,并将其划分为一些凸多边形区域;其次判断每 ...
- 【元胞自动机】基于元胞自动机模拟3D森林火灾模型含Matlab源码
1 简介 森林火灾威胁森林安全,导致生命财产与环境损失,动态模拟森林火灾对于预判森林火灾发展趋势,减少森林火灾危害,科学开展森林火灾灭火工作具有重要理论与现实意义.为更加形象,直观地展示林火三维可视化 ...
- 【元胞自动机】基于元胞自动机模拟大型商场人流疏散含Matlab源码
1 简介 基于元胞自动机的场强模型在二维平面行人流疏散问题的研究中已得到了广泛应用.已有模型主要描述行人基于出口位置并跟随其余行人进行疏散的行为特征,未充分考虑火灾蔓延和局部拥堵对行为选择的影响,难以 ...
- 【元胞自动机】基于元胞自动机模拟行人通过斑马线matlab代码
1 简介 近年来,伴随着我国社会经济的快速发展和人们生活水平的普遍提高,整个社会对交通运输的需求日益增加,带来了交通运输业的空前繁忙和各种车辆的迅猛增加,这也使得我国复杂的交通流组成和相对落后的交通流 ...
- 【元胞自动机】基于元胞自动机模拟双车道交通流模型含靠右行驶matlab源码
元胞自动机的初步理解 对元胞自动机的初步认识\ 元胞自动机(CA)是一种用来仿真局部规则和局部联系的方法.典型的元\ 胞自动机是定义在网格上的,每一个点上的网格代表一个元胞与一种有限的状\ 态.变化规 ...
- 【元胞自动机】基于元胞自动机模拟HIV传染matlab源码
一.模型 介绍 元胞自动机就是类似于一个系统,各个单元,即元胞都有联系,但整体的系统又对各个小的单元产生影响,这影响便可定义为规则.而我们的目的就是找到这些规则来进行预测未来系统的发展.(通过计算机的 ...
- 【元胞自动机】基于元胞自动机模拟交通事故道路通行量matlab源码
一.简介 元胞自动机(CA)是一种用来仿真局部规则和局部联系的方法.典型的元胞自动机是定义在网格上的,每一个点上的网格代表一个元胞与一种有限的状态.变化规则适用于每一个元胞并且同时进行.典型的变化规则 ...
- 【元胞自动机】基于元胞自动机模拟城市小区开放对周边道路通行的影响研究matlab代码
1 简介 本文通过建立关于车辆通行的模型,解决了研究小区开放对周边道路通行的影响问题.假设小区内部为单车道,周边道路为三车道.以元胞自动机理论为基础,建立了关于车辆通行的模型.对南京市凤凰和美小区开放 ...
最新文章
- 个人建议之PHP面试的准备
- 建立与ftp服务器的连接——完成版(java)
- g intel linux 汇编_Linux 下的C和Intel 汇编语言混用
- {HTML5}JQueryMobile页面跳转参数的传递解决方案
- Http响应码及其含义--摘自apache官网
- 一种基于谷歌浏览器加载activex控件的解决方法与流程技术_Office控件使用总踩雷?畅写Office带你云端飞行...
- 看雪 2016CrackMe 攻防大赛 - 1-Crack_Me-凉飕飕
- iris数据集_sklearn日志(二)训练集和测试集划分
- linux中物理cpu、逻辑cpu以及core、vcore
- php对文件排序,php – 使用filemtime()和usort()对文件进行排序会产生随机结果
- linux下编译C++程序无法链接Mysql的问题
- 集成电路的设计 —— 引脚
- Premiere Pro 中的键盘快捷键
- Flutter的isolate异步线程机制及使用实战详解
- VMware克隆虚拟机镜像、导入镜像,图文教程
- Flutter中使用WebView内打开scheme链接 调用其他程序
- iar编译器添加c语言标准库,用IAR编译器开发DS80C400
- 决战面试(二)智力题考察
- 代码行为异常容错机制与自我调节
- hadoop环境搭建(详解)