【元胞自动机】基于元胞自动机模拟双通道人群疏散含Matlab源码
1 简介
为了消除礼堂的安全隐患,制定行之有效的应急预案,有必要对礼堂人群疏散运动进行研究,掌握礼堂人群疏散的一般特点和规律。采用基于二维元胞自动机模型对某高校礼堂发生人群疏散运动进行仿真,找出影响礼堂人群疏散效率的关键因素,为高校礼堂设计提供支持;为高校礼堂制定突发事件应急预案提供参考。
2 部分代码
% 函数populate - 分配占用并随机填充
% pedestrins, doors and obstacles
% Occupied的初始化
% 在The Seed里面,表面上将Doors定义为nDoors行2列的矩阵,实际上Doors是宽度行2列的矩阵。
% 例如,只有一个宽度为7的横向的门,则Doors是7行2列的矩阵,每一行对应于门的一个cell。
function [Occupied,Doors,Obstacles] = populate(population, gridDims)
n = gridDims(1); % 房间的长
m = gridDims(2); % 房间的宽
% nDoors = paramsDoors(1); % nDoors = 2
% lengths = paramsDoors(2);
Occupied = zeros(n, m); % 将Occupied网格初始化为n*m的全为0的网格
% 边界是被墙体占据的,绘制四面墙体
Occupied(1,:) = 1;
Occupied(n,:) = 1;
Occupied(:,1) = 1;
Occupied(:,m) = 1;
% 门
Doors=[23,50;24,50;25,50;26,50;27,50;28,50];
for i=1:size(Doors)
Occupied(Doors(i,1),Doors(i,2))=0;
end
% 房间之间的墙体
Occupied(21,:) = 100;
Occupied(30,:) = 100;
for i=2:21
Occupied(i,17) = 100;
Occupied(i,34) = 100;
end
for i=30:49
Occupied(i,17) = 100;
Occupied(i,34) = 100;
end
a=7;b=24;c=40;
for i=0:3 % 把循环次数改成 3 就可以让所有人都逃出了(消除了死角)
Occupied(21,a+i) = 0;
Occupied(21,b+i) = 0;
Occupied(21,c+i) = 0;
Occupied(30,a+i) = 0;
Occupied(30,b+i) = 0;
Occupied(30,c+i) = 0;
end
% Obstacles的坐标矩阵
nObstacles=0;
for i=2:n-1
for j=2:m-1
if Occupied(i,j)==100
nObstacles=nObstacles+1;
continue
end
end
end
Obstacles=zeros(nObstacles,2);
a=1;
for i=2:n-1
for j=2:m-1
if Occupied(i,j)==100
Obstacles(a,1)=i;
Obstacles(a,2)=j;
a=a+1;
end
end
end
% populate after obstacles has been generated 在障碍物产生后填充(这一部分我移到calcStatField.m的最后面去了)
populated=0;
while(populated ~= population) % population 是在 evacuation 里面设置好的
i = randi(n-2) + 1; % 减去二是减去墙体占据的两格空间
j = randi(m-2) + 1; % 随机取房间内的一个cell
if(Occupied(i, j) == 0)
Occupied(i, j) = 1; % 这一整个while循环就是用来放人的!
populated = populated + 1; % 我需要把这个步骤放在S场计算完之后。
end
end
% % gen random doors
% cnt = 1;
% for i = 1: nDoors
% event1 = rand(1);
% event2 = rand(1);
%
% if(event1 <= 0.5) % vertical door
%
% id = randi(m-2 - lengths(i)) + 1; % start y pos 这里的id是[2,48-随机宽度]之间的值
% idI = 1; % idI 是什么?
% if(event2 > 0.5) % left or right wall
% idI = n; % 这是怎么靠这两个event来分左右墙的?
% end
%
% for j = 0:lengths(i)-1 % append in right direction
% Occupied(idI, id+j) = 0; % 这个地方应该是在设置门这个区域的对应值吧
% Doors(cnt,:) = [idI, id+j];
% cnt = cnt + 1;
% end
%
% else % horizontal door
%
% id = randi(n-2-lengths(i)) + 1; % start x pos
% idJ = 1;
% if(event2 > 0.5) % bottom or up wall
% idJ = m;
% end
%
% for j = 0: lengths(i)-1 % append in top direction
% Occupied(id+j, idJ) = 0;
% Doors(cnt,:) = [id+j, idJ];
% cnt = cnt+1;
% end
% end
% end
% gen random obstacles
% Obstacles = zeros(size(ObstacleLengths, 1), 2);
% cnt = 1;
% for i = 1: nObstacles
%
% event1 = rand(1);
% if(event1 <= 0.33) % vertical obsracle
% idJ = randi(m-4 - ObstacleLengths(i)) + 2; % not to obstruct the door
% idI = randi(n-4) + 2; % not to obstract the door
%
% for j = 0:ObstacleLengths(i)-1
% if(Occupied(idI, idJ+j) ~= 0)
% break;
% end
% Occupied(idI, idJ+j) = 100;
% Obstacles(cnt,:) = [idI, idJ+j];
% cnt = cnt + 1;
% end
%
% elseif (event1 <=0.66) % horizontal obstacle 水平障碍
%
% idJ = randi(m-4) + 2; % not to obstuct the door 不阻碍门
% idI = randi(m-4 - obstaclesLengths(i)) + 2; % not to obstuct the door
%
% for j = 0:obstaclesLengths(i)-1
% if(Occupied(idI+j, idJ) ~= 0)
% break;
% end
% Occupied(idI+j, idJ) = 100;
% Obstacles(cnt,:) = [idI+j, idJ];
% cnt = cnt + 1;
% end
% else % diagonal obstacle
%
% idJ = randi(m-4 - obstaclesLengths(i)) + 2; % not to obstuct the door
% idI = randi(m-4 - obstaclesLengths(i)) + 2; % not to obstuct the door
%
% for j = 0:obstaclesLengths(i)-1
% if(Occupied(idI+j, idJ+j) ~= 0)
% break;
% end
% Occupied(idI+j, idJ+j) = 100;
% Obstacles(cnt,:) = [idI+j, idJ+j];
% cnt = cnt + 1;
% end
% end
% end
% % populate after obstacles has been generated 在障碍物产生后填充(这一部分我移到calcStatField.m的最后面去了)
% while(populated ~= population) % population 是在 evacuation 里面设置好的
%
% i = randi(n-2) + 1; % 减去二是减去墙体占据的两格空间
% j = randi(m-2) + 1; % 随机取房间内的一个cell
%
% if(Occupied(i, j) == 0)
% Occupied(i, j) = 1; % 这一整个while循环就是用来放人的!
% populated = populated + 1; % 我需要把这个步骤放在S场计算完之后。
% end
% end
end
3 仿真结果
4 参考文献
[1]林煌涛等. "基于元胞自动机模型的礼堂人群疏散仿真." 现代计算机 (2013).
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。
【元胞自动机】基于元胞自动机模拟双通道人群疏散含Matlab源码相关推荐
- 【物理应用】基于matlab模拟井筒多相流【含Matlab源码 2152期】
⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[物理应用]基于matlab模拟井筒多相流[含Matlab源码 2152期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: 付 ...
- 【光学】基于matlab模拟拉盖尔高斯【含Matlab源码 2167期】
⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab模拟拉盖尔高斯[含Matlab源码 2167期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: 付费专 ...
- 信号检测:基于双稳随机共振的微弱信号检测含Matlab源码
信号检测:基于双稳随机共振的微弱信号检测含Matlab源码 双稳随机共振是一种有效的微弱信号检测方法,广泛应用于各个领域.本文将介绍如何使用Matlab实现基于双稳随机共振的微弱信号检测,并提供相应的 ...
- 【元胞自动机】基于元胞自动机模拟大型商场人流疏散含Matlab源码
1 简介 基于元胞自动机的场强模型在二维平面行人流疏散问题的研究中已得到了广泛应用.已有模型主要描述行人基于出口位置并跟随其余行人进行疏散的行为特征,未充分考虑火灾蔓延和局部拥堵对行为选择的影响,难以 ...
- 【元胞自动机】元胞自动机模拟交通流【含Matlab源码 355期】
⛄一.元胞自动机简介 1 元胞自动机发展历程 最初的元胞自动机是由冯 · 诺依曼在 1950 年代为模拟生物 细胞的自我复制而提出的. 但是并未受到学术界重视. 1970 年, 剑桥大学的约翰 · 何 ...
- 【滤波器】基于低通滤波器语音信号加噪与去噪含Matlab源码
1 简介 1.1 课题的背景与意义 通过语音传递信息是人类最重要.最有效.最常用和最方便的交换信息的形式.让计算机能听懂人类的语言,是人类自计算机诞生以来梦寐以求的想法,用现代手段研究语音信号,使人们 ...
- 【路径规划-TSP问题】基于蚁群算法求解实际地图旅行商问题含Matlab源码
1 内容介绍 旅行商问题的传统求解方法是遗 传算法,此算法收敛速度慢,并不能获得问题的最优解.为了求取旅行商问题的最优解,本文在阐述蚁群算法的基本原理,模型以及在旅行商问题中的实现过程的基 础上,提出 ...
- 【BP预测】基于布谷鸟算法优化BP神经网络数据回归预测含Matlab源码
1 简介 锂电池健康状态(SOH)的预测是电动汽车锂电池管理系统的最重要的关键技术之一;传统的误差逆向传播(BP)神经网络容易使权值和阈值陷入局部最优,从而导致预测结果不精确;结合布谷鸟搜索算法(CS ...
- 【语音识别】基于过零特征实现电话按键语音识别含Matlab源码
1 简介 近年来,随着科学技术的迅猛发展,语音识别技术被广泛应用于各行各业.本文在分析和总结前人研究的基础上,提出了基于多特征参数混合的研究思路,以此来解决在识别率和鲁棒性方面存在的问题.由此可见,如 ...
最新文章
- cmake (4)引用子目录的库
- 前端学习(1362):学生档案信息管理4
- Eclipse中Maven项目出现红色感叹号问题
- 栈的顺序存储及实现(二)
- HashSet 与HashMap底层实现
- java默认virtual_mac jdk配置(系统默认or自己配置)
- ubuntu报警邮件服务简单搭建
- 深度学习笔记(一)——损失函数
- 阶段3 1.Mybatis_09.Mybatis的多表操作_1 mybatis表之间关系分析
- NOIP2013普及组复赛 解题分析
- 如何查看当前计算机硬盘状态,win7系统下如何查看硬盘状态
- java 图片与base64相互转化
- 为什么弃用lofter
- 多元统计分析及R语言建模(第五版)——第3章多元数据的直观表示课后习题
- 计算机无法进入bios模式,win7进入bios设置界面_win7无法进入bios设置解决办法
- 在 UltraEdit 或 UEStudio 中执行 DOS 或 Windows 命令
- 01背包与完全背包的区分
- 单摆模型,控制器及其MATLAB图形仿真
- 银联unionpay取消订单与超时时间
- PHP基本语法--php基础最详细教程
热门文章
- 计算机原码 反码 和 补码
- 《鸟哥的私房菜基础篇》第四版学习笔记——第0章 计算机概论
- 阿里云windows服务器重置密码并连接远程桌面
- in-place运算总结
- 漏洞通告 | Atlassian Confluence存在远程代码执行漏洞,悬镜云鲨RASP天然免疫防护...
- this指向,并改变this指向
- PHP2cgoto加密解密
- Android开发 assets目录
- Ubuntu18.04安装教程——超详细的图文教程
- Linux上重置MySQL密码 错误 ERROR 1045 (28000): Access denied for user ‘‘root‘‘@‘‘localhost‘‘ (using passw...