公路堵車概率模型 | Nagel-Schreckenberg 交通流模型。
路面上有N輛車,以不同的速度向前行駛,模擬堵車問題有以下假設:
- 假設某輛車的當前車速是V;
- 若前方可見范圍內沒車,則它在下一秒的車速提高到V+1,直到達到規定最高限速;
- 若前方有車,前車距離為d,且d<v, 則它下一秒的車速降低到d-1;
- 每輛車會以概率p隨機減速v-1
# -*- encoding: utf-8
import math
import numpy as np
import matplotlib.pyplot as plt
path = 5000
n = 100
v0 = 5
p = 0.3
Times = 3000
np.random.seed(0)
x = np.random.rand(n) * path # N輛車的起始位置
x.sort()
v = np.tile([v0], n).astype(np.float) # N輛車的初始車速
plt.figure(figsize=(10, 8),facecolor='white')
for t in range(Times):
plt.scatter(x, [t]*n, s=1, c='k', alpha=0.1)
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, 150) # 限速為0-150
x += v # 更新位置
x %= path # 環行公路位置修正
plt.xlim(0, path)
plt.ylim(0, Times)
plt.tight_layout(pad=2)
plt.show()
模擬環行公路堵車.png
【參考資料】
- 鄒博課件