一:开发环境

我们先来看看我的开发环境,用到的东西还是比较简单的:

作者:嘟粥yyds

时间:2022年12月20日

集成开发工具:PyCharm 2021.1.3

集成开发环境:python  3.10.6

第三方模块:numpy、matplotlib

二:项目介绍

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

三:项目源代码

import numpy as np
from matplotlib import pyplot as plt
import time

start = time.time()
path = 5000  # 道路长度
n = 100  # 车辆数目
v0 = 90  # 初始速度
p = 0.3  # 车辆减速概率
Times = 6000  # 模拟的时刻数目,时刻越长所耗时间越长


np.random.seed(0)
x = np.random.rand(n) * path  # 保存每辆车在道路上的位置,随机进行初始化
x.sort()
v = np.tile([v0], n).astype(np.float64)  # 保存每辆车的速度,并且初速度相同

plt.figure(figsize=(8, 6), 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
    # 对速度进行限制(最高速度不得超过120)
    v = v.clip(0, 120)
    # 一秒后,车辆的位置发生变化
    x += v
    x %= path
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.xlim(0, path)
plt.ylim(0, Times)
plt.xlabel('车辆位置')
plt.ylabel('模拟时间')
plt.title(f'Nagel-Schreckenberg模型模拟(车道长度:{path},车辆数:{n},初速度:{v0},减速概率:{p})')
end = time.time()
plt.text(1800, 6400, s=f'Running time: {(end - start)} seconds', fontsize=15, color='red')

plt.show()

四:运行结果

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

当p=0时,也就是不减速,所有的车将匀速行驶,不会发生堵车

交通编程PYTHON 交通建模仿真python_开发语言

当p=0.3时

交通编程PYTHON 交通建模仿真python_人工智能_02

 当p =0.8时

交通编程PYTHON 交通建模仿真python_交通编程PYTHON_03

当p=1.0时,及另一极端情况,会发现车辆直接堵死了 

 

交通编程PYTHON 交通建模仿真python_python_04

 写在最后:减速的概率越大,交通拥堵的概率也就越大,越容易堵车