python元胞自动机模拟交通_大师兄带你复现 -gt; 难度超高的二维CA元胞自动机模型...
最近過上了在家躺著就為祖國做貢獻的生活。
然而,熱心的知友們找我私信,詢問“怎么畫二維CA(元胞自動機)模型的仿真界面呀?”“菜鳥如何做CA仿真?”
剛交完稿子不再被老板催更的我不想辜負你們的期待,又跑回來爆肝啦。
放心閱覽,干貨滿滿!
這期想和大家說叨說叨二維CA的那些事。我本來是不太精通CA的,但好在我有素(yi)未(jing)謀(bi)面(ye)的大師兄,留下了他優(yōu)秀的博士論文作為參考,就讓我們跟著大師兄來一起仿真吧!
大師兄的參考文獻:薛書琦. 若干情境下行人走行及疏散行為的實驗和仿真研究[D].北京交通大學,2018.
大師兄的研究
大師兄在博士期間主要從事對行人運動特性的研究。更具體地,是研究特殊情形下,對向兩組行人流的疏散行為。主要研究場景如下圖所示:
下圖是一個橫向的通道,上下邊緣可以理解為墻壁,左右邊緣是開放邊界,可作為行人疏散的出口。圖中通道被劃分為左、右兩個等待區(qū)域和中間的空白區(qū)域三個部分。左側等待區(qū)被藍色的行人占據(jù),藍色行人只能從通道右側疏散;而右側等待區(qū)被紅色的行人占據(jù),紅色行人只能從左側疏散。當這兩組行人同時向對側移動,必然會造成沖突和擁擠。特別地,當行人流過大時,還可能出現(xiàn)死鎖現(xiàn)象,即兩個方向行人發(fā)生完全阻塞,任何一方都無法繼續(xù)前進。下圖就是一個簡單死鎖的例子。
大師兄的實驗
為了研究對向行人流的特性,大師兄開展了一系列經(jīng)典的設備館實驗。
離散實驗:
實驗規(guī)則:
(1)每個時間步每個人只能向前、向左、向右移或原地不動;
(2)一個元胞只能容納一人,當沖突發(fā)生時,其中一個人原地不動;
(3)開口邊界,左右界為墻壁不可穿越。
無其他約束條件,根據(jù)實驗者自己的判斷進行決策。
實驗結果:
在低密度狀態(tài)下,對向行人很快得到疏散。
在高密度狀態(tài)下,行人疏散顯得比較艱難,且花費了較長的時間。但最終行人全部到達對面,沒有發(fā)生死鎖現(xiàn)象。仔細觀察發(fā)現(xiàn),行人之間存在明顯的協(xié)同現(xiàn)象,遇到對向沖突時會減慢前進的速度,且同一方向的行人會“自動成行”,排起隊伍來有序通過。這也是在實驗當中沒有出現(xiàn)死鎖現(xiàn)象的秘訣。
連續(xù)實驗:
大師兄還做了連續(xù)狀態(tài)下的實驗,并得到了和離散條件下類似的結果。
大師兄的仿真
通過離散時空下對向行人流的實驗,大師兄對行人在離散時空下的運動行為特性有了一個較為清晰的認識,對基本的元胞自動機模型在模擬對向行人流時的局限性以及改進方向有了明確的思路。大師兄仿真實驗的思想是:在對現(xiàn)有基于元胞自動機的對向行人流模型研究總結的基礎上,引入主動慢化和優(yōu)勢通路思想,構建基于行人行為特性的對向行人流模型。
大師兄基于以上思想繪制成一幅精美的仿真流程圖。看懂了大師兄的思路,并有這副邏輯清晰、思維縝密的流程圖作為指引,CA仿真Level 1的小師妹蠢蠢欲動,并決定,復,現(xiàn),它!
小師妹的復現(xiàn)
1 構建仿真場景
復現(xiàn)CA仿真的第一步,首先是構造出大師兄的二維仿真場景。
仔細觀察了大師兄的圖片后,發(fā)現(xiàn)仿真場景主要包括以下要素:
(1)劃分離散區(qū)間的網(wǎng)格線;
(2)可以向對向移動的紅/藍兩組元胞;
(3)劃分等待區(qū)域和中間區(qū)域的分割線。
此外,隨著時間步的推薦,能逐幀刷新每個元胞在不同時間步的位置。為了便于刷新和繪制成圖片,必須把元胞的位置和網(wǎng)格線的大小數(shù)字化。
首先來繪制網(wǎng)格線。下圖的黑色部分是一個坐標軸,L是研究范圍的長度,W是研究范圍的寬度。通過繪制一系列藍色橫線和紅色縱線,就構成了離散空間的網(wǎng)格線。區(qū)域分割線的繪制原理同理,即在對應位置增加兩條縱線即可。(畫圖時注意隱藏坐標軸)
這樣繪制網(wǎng)格線的好處在于,所有網(wǎng)格的中心,即元胞的位置都恰好落在了橫坐標在[1, L]范圍,縱坐標在[1, W]范圍內的整數(shù)點上,便于后續(xù)計算。
# ——————01 加載庫—————————— import matplotlib as mpl import matplotlib.pyplot as plt# ——————02 調參區(qū)————————— # 寬度 w = 10 # 長度 L = 40 # 等待區(qū)長度 Lw = 16# ——————03 創(chuàng)建圖像———————— fig = plt.figure(figsize = (20,3.4)) ax = plt.axes() plt.xlim(0.5,L + 0.5) plt.ylim(0.5,w + 0.5) # 設置坐標刻度 xz = range(1,L + 1) plt.xticks(range(1,L + 1,1),xz) yz = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T'] plt.yticks(range(1,w + 1,1),yz)# 函數(shù):繪制網(wǎng)格線 def plot_line():# 繪制網(wǎng)格線for i in range(1,L):x = [i+0.5,i+0.5]y = [0.5,w + 0.5]plt.plot(x,y,'-k',linewidth = 0.5)for j in range(1,w):x = [0.5,L + 0.5]y = [j+0.5,j+0.5]plt.plot(x,y,'-k',linewidth = 0.5)# 繪制分割線x = [Lw + 0.5,Lw + 0.5]y = [0.5,w + 0.5]plt.plot(x,y,'-g',linewidth = 2)x = [L - Lw + 0.5,L - Lw + 0.5]y = [0.5,w + 0.5]plt.plot(x,y,'-g',linewidth = 2)plot_line()就是繪制網(wǎng)格線的函數(shù),用這兩行代碼顯示一下函數(shù)的效果:
# 顯示圖片 plot_line() plt.show()仿真場景就準備好啦!
2 隨機生成初始元胞
為了便于表示行人的位置,我對空間里的每個元胞編號,從下到上從左往右依次編號為1-W*L,如下圖所示。
假設系統(tǒng)中有N個行人。
- 在不考慮行人速度的條件下,記錄行人的位置信息。即,創(chuàng)建一個長度為N的列表list,列表中的每個元素分別對應這N個行人當前時刻的位置。第i個行人的橫縱坐標分別為:
x[i] = int(list[i] / W) + 1
y[i] = list[i] – (x[i] - 1) * W
- 在考慮行人速度的條件下,記錄行人的位置信息。即,創(chuàng)建一個長度為L*W的列表list,若list中的第i個元素為inf,則第i個元胞為空;若list中的第i個元素不為常數(shù)v,則第i個元胞不為空,且占用該元胞行人的速度為v。
在空間中隨機生成初始元胞的代碼如下:
# ——————01 加載庫——————————————— import numpy as np import random# ——————02 調參區(qū)——————————————— # 系統(tǒng)中的人數(shù)(<=160) numof_z = 80 numof_y = 80 # 點的大小 dx = 10 # 逐幀刷新時間 sxtime = 0.01# ——————04 隨機生成初始元胞——————————# 隨機生成初始元胞(左) num = 0 lisz = [] while num != (numof_z):sjs = random.randint(1,w * Lw)if ((sjs in lisz) == 0):lisz.append(sjs)num += 1 #print(lisz) x1 = [] y1 = [] for i in range(0,len(lisz)):x1.append(int((lisz[i] - 1) / w) + 1)y1.append(lisz[i] - (x1[i] - 1) * w) plt.plot(x1,y1,'ob',markersize = dx)# 隨機生成初始元胞(右) num = 0 lisy = [] while num != (numof_y):sjs = random.randint(w * (L - Lw) + 1,w * L)if ((sjs in lisy) == 0):lisy.append(sjs)num += 1 #print(lisy) x1 = [] y1 = [] for i in range(0,len(lisy)):x1.append(int((lisy[i] - 1) / w) + 1)y1.append(lisy[i] - (x1[i] - 1) * w) plt.plot(x1,y1,'or',markersize = dx) plot_line() plt.pause(sxtime) plt.cla()今天也是被學業(yè)榨干的一天,感覺身體被掏空,這期就先到這里啦!
下期為大家復現(xiàn)基于行人行為特性的更新規(guī)則!敬請期待!
更多精彩請看公眾號【交通科研Lab】~
我們是一個有靈魂的團隊,堅持探索,致力于分享交流學習經(jīng)驗。想學習更多交通編程知識的小伙伴快上車~
總結
以上是生活随笔為你收集整理的python元胞自动机模拟交通_大师兄带你复现 -gt; 难度超高的二维CA元胞自动机模型...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python语音命名规则_python语
- 下一篇: oracle两列合并成一列_POWER