Nagel-Schreckenberg(交通流)模型——python实现

本文详细代码见我的github仓库 AI_ML_DataAnalysis_DataVisualization_Classic-Examples

Nagel-Schreckenberg模型是高速公路交通模拟的理论模型。该模型由德国物理学家Kai Nagel和Michael Schreckenberg于20世纪90年代初开发。它本质上是用于道路交通流量的简单元胞自动机模型,其可以再现交通拥堵,即,当道路拥挤时显示平均车速减慢。
现在模拟一个场景,在一个环形公路上,所有车围成一个圆,每辆车有一定的概率减速.当后面的车的车速比它前面相邻的车车速快时,即将产生追及问题时,后面的车就必须减速,这样就会导致各种不同情况的拥堵.
模拟代码如下:
减速概率p,车辆初速度v都可以手动改变,以测试不同情况
ns.ttc是一个字库,需要导入
当减速概率p为0.5时:

# -*- coding: utf-8 -*-

from matplotlib.font_manager import *
import matplotlib.pyplot as plt
import numpy as np

myfont = FontProperties(fname='ns.ttc')
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'车辆位置', fontproperties=myfont)
    plt.ylabel(u'模拟时间', fontproperties=myfont)
    plt.title(u'交通模拟(车道长度%d,车辆数%d,初速度%s,减速概率%s)' % (path, n, v0, p), fontproperties=myfont)
    # plt.tight_layout(pad=2)
    plt.show()


if __name__ == '__main__':
    # Run(v0=0)
    # Run(v0=20)
    # Run(v0=40)
    # Run(v0=60)

    # Run(p=0.0)
    # Run(p=0.1)
    # Run(p=0.3)
    Run(p=0.5)
# Run(p=0.8)
# Run(p=1.0)

运行结果:

在这里插入图片描述

图中线条越密集的地方代表越有可能发生堵车的情况

当p=0时,也就是不减速,你会发现所有车匀速行驶,不会出现堵车情况

在这里插入图片描述

当p=0.3时

在这里插入图片描述

当p=0.8时:

在这里插入图片描述

极端现象,车辆直接堵死了,就像北京环内一样,当p=1时:

在这里插入图片描述

所以可以得出结论:减速概率越大,交通拥挤概率越大,越容易堵车

  • 8
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是一个 MATLAB 代码,可以生成一个带有周期性边界条件的时空演化图,初始时刻车流密度为 0.25,迭代公式为: $$ v_i(t+1) = \min\left(v_i(t)+1, m_i(t), v_{i+1}(t)-1\right) $$ 其中 $v_i(t)$ 表示时刻 $t$ 时第 $i$ 辆车的速度,$m_i(t)$ 表示第 $i$ 辆车的最大速度,即 $v_{\max}$,$L$ 表示道路长度,假设车辆长度为 $1$,时间步长为 $1$。 ```matlab % 设置参数 L = 100; % 道路长度 vmax = 5; % 车辆最大速度 p = 0.25; % 初始时刻车流密度 time = 100; % 模拟时长 dt = 1; % 时间步长 % 初始化车辆位置和速度 x = zeros(L, 1); v = zeros(L, 1); for i = 1:L if rand() < p v(i) = randi([1, vmax]); end end % 开始模拟 for t = 1:time % 计算车辆间距 d = diff([x; x(1)]); % 更新速度 for i = 1:L v(i) = min(v(i) + 1, min(d(i), v(mod(i, L)+1)-1), vmax); end % 更新位置 x = mod(x + v, L); % 绘图 plot(x, repmat(t, L, 1), 'bo'); axis([0 L 0 time+1]); xlabel('Position'); ylabel('Time'); drawnow; end ``` 这个代码使用了 Nagel-Schreckenberg 模型来模拟车辆的运动,其中车辆的速度受到前方车辆的影响,并且在一定概率下会减速。在每个时间步长中,程序首先计算车辆间距,并根据间距来更新车辆速度。然后,程序根据更新后的速度来更新车辆位置,并绘制时空演化图。 需要注意的是,由于这个模型是随机的,因此每次运行程序得到的结果可能会有所不同。同时,这个模型也比较简单,可能无法完全反映真实的交通流动情况,仅供参考。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值