模拟环行公路堵车问题

公路堵车概率模型 | 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

【参考资料】

  1. 邹博课件
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容