模拟环行公路堵车问题
2017-05-02 本文已影响13人
Albert_Sun
公路堵车概率模型 | 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
【参考资料】
- 邹博课件