據 Nagel-Schreckenberg 模型,車輛的運動滿足以下規則:
- 1. 假設當前速度是 v ,和前一輛車的距離為d。
- 2. 如果 d > v,它在下一秒的速度會提高到 v + 1 ,直到達到規定的最高限速。
- 3. 如果 d <= v,那么它在下一秒的速度會降低到 d - 1 。
- 4. 前三條完成后,司機還會以概率 p 隨機減速1個單位,速度不會為負值。
- 5. 基於以上幾點,車輛向前移動v(這里的v已經被更新)個單位。
根據以下幾點預測查看車輛的車流情況
python代碼:
#!/usr/bin/env python # -*- coding: utf-8 -*- # @File : Nagel-Schreckenberg(交通流)模型.py # @Author: 趙路倉 # @Date : 2020/3/1 # @Desc : # @Contact : 398333404@qq.com import matplotlib from matplotlib.font_manager import * import matplotlib.pyplot as plt import numpy as np plt.rcParams['font.sans-serif'] = ['SimHei'] 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'車輛位置') plt.ylabel(u'模擬時間') plt.title(u'交通模擬(車道長度%d,車輛數%d,初速度%s,減速概率%s)' % (path, n, v0, p)) # plt.tight_layout(pad=2) plt.show() if __name__ == '__main__': # Run(p=0.3) Run(p=0.2)
結果: