Louvre_Evacuation
题目来源:2019年 美赛 D题
完整代码请见:https://github.com/izcat/Louvre_Evacuation
2019 ICM
Problem D: Time to leave the Louvre
问题背景
法国发生的恐怖袭击越来越多,在许多热门目的地,亟需一个应对紧急情况的疏散计划。
你们的ICM团队正在帮助设计在法国巴黎卢浮宫的疏散计划。
总的来说,疏散的目标是让所有的人都撤离,尽快安全离开大楼。
接到疏散通知后,为了尽快清空建筑,每个人尽可能的通过一个最佳出口。
问题要求
建立一个卢浮宫紧急疏散模型,以满足:
- 当出现突发意外事件时,指导游客人群从卢浮宫疏散 (evacuate visitors from the museum)
- 探讨安保/急救人员进入策略 (allow emergency personnel to enter the building)
- 确定人流移动的瓶颈 (identify potential bottlenecks limiting movement towards the exits)
- 模型考虑各种威胁 (a broad set of considerations and various types of potential threats)
My Work:
不考虑个体行为的情况下,可以将卢浮宫抽象为二维平面图,记录各个关键节点、出口、节点之间的长度、路径信息等,建立图论模型,求解最短路、网络流等,从而得到疏散时间,瓶颈等结果。
从人群疏散的角度看,查阅资料,我们发现目前疏散模型大致有两种处理方式,元胞自动机模型和社会力模型。
本程序主要模拟了人员疏散的撤离情况。
编程目的
- 研究人群在一般空间的流动情况
- 出口数量、分布对疏散时间的影响
- 障碍物对人员流动的影响
- 定量求解人流密度,确定疏散瓶颈
算法思想
利用元胞自动机实现 (社会力模型人员会在地图上重叠)
- 初始化地图,地图为矩形区域,基本信息包含长Length、宽Width、若干出口Exit、障碍物Barrier等
- 基于该论文,出口距离在地图上反映为势能的高低,初始化地图的势能
- 初始化人群,人群随机分布在地图的合法区域内
- 疏散模拟:
- 移动方向:每个人优先选择最短路进行撤离,考虑使用Moore型元胞,有8个移动方向
- 移动速度:一定区域内(周围8个邻居元胞)人流密度决定人员的移动速度 (待改进:统计可视角度内的人流密度)
模拟结果
人员疏散过程模拟
热力图
反映瓶颈位置
使用Python编程实现人员疏散模拟
包含三个模块 main.py
map.py
people.py
main.py
界面实现,包含GUI类,显示地图、人员、疏散情况等信息
map.py
地图类,地图以点(px, py)集形式保存出口Exit位置及障碍物Barrier位置
出口对地图的势能初始化:利用BFS算法实现,多个出口取最小势能
people.py
包含两个类,Person类和People类,前者只有移动速度、位置等基本属性,后者包含了整个地图信息,人流密度等,方便指引每个人的移动
有待改进之处
模型人员移动策略可以修改为:
- 只设置一定比例的人员(作为安保/疏导人员)能够自动走到出口
- 其他人员随机走动/从众心理跟着人流走动
考虑人员增加更多属性,如年龄、性别、是否结队等
- 不同年龄人群移动速度不同
- 家人、朋友等同行人员等使用相同的移动策略
- 男性群体可能更理性,倾向于走最短路径/避让人群
编程收获
- 再次熟悉使用了
pkinter
实现GUI,并再次利用plt作图(热力图) - 深刻领会了 Python 的赋值、引用、拷贝问题 :可变对象之间的赋值是传引用,不可变对象的赋值是传值。详见博客
- 求解最短路要注意连通性!!!初始距离设为无穷大可避免出现更新距离问题(不连通的区块距离为0导致错误)
- 对矩阵np.array的访问,下标为浮点数只会报Warning,改了好久值类型dtype才发现下标为浮点数!
原文地址:https://www.cnblogs.com/izcat/p/12169268.html
时间: 2024-10-27 18:55:44