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才發現下標為浮點數!