为什么会堵车:频繁减速惹的祸!

一条平直的公路上,为什么会堵车?上世纪90年代美国科学家提出了Nagel Schreckenberg交通流量模型,这是一个使用了很多假设的简化模型,类似于自动元胞机。后来,该模型的扩展版本被应用于美国的实际道路交通, 并取得了较好的成果。

Nagel Schreckenberg交通流量模型的假设:

1、环形公路、单车道,无交通信号灯
2、道路长度为N,随机放置n辆车,每辆车按不同的速度形式
3、对于某一个时刻的每一辆车,速度为v,距离前车位置为d:
(1)如果v小于d, 则下一秒的速度增加为v+1,直到达到最高限速
(2)如果v大于或等于d, 则下一秒速度减为d-1
4、每辆车以概率P随机减速为v-1


下面用python模拟了这个过程:

1、不同初速度对堵车的影响:

为什么会堵车:频繁减速惹的祸!
为什么会堵车:频繁减速惹的祸!

为什么会堵车:频繁减速惹的祸!

为什么会堵车:频繁减速惹的祸!

图中,颜色比较深的地方说明发生了堵车。可以看出,在随机减速概率为0.3的情况下,无论初始速度多少,都会引起堵车。

2、不同减速概率的影响

为什么会堵车:频繁减速惹的祸!

为什么会堵车:频繁减速惹的祸!

为什么会堵车:频繁减速惹的祸!

为什么会堵车:频繁减速惹的祸!

为什么会堵车:频繁减速惹的祸!
可以看出,随着减速概率的增加,堵车会越来越重。不随机减速则不会堵车,当减速概率达0.8的时候,堵车已经非常严重了。

这说明啥问题呢?开车不要随便减速哦~


附代码:

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False

np.random.seed(0)

def go(path=5000,n=100,v0=60,ltv=120,p=0.3,times=3000):
    
    '''
    path = 5000.0 # 道路长度
    n = 100 # 车辆数目
    v0 = 60 # 初始速度
    ltv = 150 # 最大限速
    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('车辆位置', fontsize=14)
    plt.ylabel('模拟时间', fontsize=14)
    plt.title('交通模拟(车道长度%d,车辆数%d,初速度%s,减速概率%s)' % (path,n,v0,p), fontsize=14)
    #plt.tight_layout(pad=2)
    plt.show()

if __name__ == '__main__':
    go(v0=0)
    go(v0=20)
    go(v0=40)
    go(v0=60)
    
    go(p=0.0)
    go(p=0.1)
    go(p=0.3)
    go(p=0.5)
    go(p=0.8)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值