1. 程式人生 > >Nagel-Schreckenberg模型python實現

Nagel-Schreckenberg模型python實現

Nagel-Schreckenberg模型是高速公路交通模擬的理論模型。該模型由德國物理學家Kai Nagel和Michael Schreckenberg於20世紀90年代初開發。它本質上是用於道路交通流量的簡單元胞自動機模型,其可以再現交通擁堵,即,當道路擁擠時顯示平均車速減慢。 現在模擬一個場景,在一個環形公路上,所有車圍成一個圓,每輛車有一定的概率減速.當後面的車的車速比它前面相鄰的車車速快時,即將產生追及問題時,後面的車就必須減速,這樣就會導致各種不同情況的擁堵. 模擬程式碼如下: 減速概率p,車輛初速度v都可以手動改變,以測試不同情況 ns.ttc是一個字型檔,需要匯入 當減速概率p為0.5時:

# -*- coding: utf-8 -*-

from matplotlib.font_manager import *
import matplotlib.pyplot as plt
import numpy as np

myfont = FontProperties(fname='ns.ttc')
matplotlib.rcParams['axes.unicode_minus'] = False
np.random.seed(0)


def Run(path=5000, n=100, v0=60, ltv=120, p=0.3, times=3000):
    '''
    path = 5000.0 # 道路長度
    n = 100 # 車輛數目
    v0 = 60 # 初始速度
    ltv = 120 # 最大限速
    p = 0.3 # 減速概率
    times = 3000 # 模擬的時刻數目
    '''
# x儲存每輛車在道路上的位置,隨機初始化 x = np.random.rand(n) * path x.sort() # v儲存每輛車的速度,初速度相同 v = np.ones(n) * v0 plt.figure(figsize=(5, 4), facecolor='w') # 模擬每個時刻 for t in range(times): plt.scatter(x, [t] * n, s=1, c='k', alpha=0.05) # 模擬每輛車 for i in range(n)
: # 計算當前車與前車的距離,注意是環形車道 if x[(i + 1) % n] > x[i]: d = x[(i + 1) % n] - x[i] else: d = path - x[i] + x[(i + 1) % n] # 根據距離計算下一秒的速度 if v[i] < d: if np.random.rand() > p: v[i] += 1 else: v[i] -= 1 else: v[i] = d - 1 # 對速度進行限制 v = v.clip(0, ltv) # 一秒後,車輛的位置發生了變化 x += v # 注意是環形車道 x = x % path # 展示 plt.xlim(0, path) plt.ylim(0, times) plt.xlabel(u'車輛位置', fontproperties=myfont) plt.ylabel(u'模擬時間', fontproperties=myfont) plt.title(u'交通模擬(車道長度%d,車輛數%d,初速度%s,減速概率%s)' % (path, n, v0, p), fontproperties=myfont) # plt.tight_layout(pad=2) plt.show() if __name__ == '__main__': # Run(v0=0) # Run(v0=20) # Run(v0=40) # Run(v0=60) # Run(p=0.0) # Run(p=0.1) # Run(p=0.3) Run(p=0.5) # Run(p=0.8) # Run(p=1.0)

執行結果: 在這裡插入圖片描述 圖中線條越密集的地方代表越有可能發生堵車的情況 當p=0時,也就是不減速,你會發現所有車勻速行駛,不會出現堵車情況 在這裡插入圖片描述 當p=0.3時 在這裡插入圖片描述 當p=0.8時: 在這裡插入圖片描述 極端現象,車輛直接堵死了,就像北京環內一樣,當p=1時: 在這裡插入圖片描述 所以可以得出結論:減速概率越大,交通擁擠概率越大,越容易堵車