首页 > 编程语言 > 详细

[Python机器学习]Nagel-Schreckenberg(交通流)模型

时间:2020-03-01 22:57:59      阅读:107      评论:0      收藏:0      [点我收藏+]

据 Nagel-Schreckenberg 模型,车辆的运动满足以下规则:

  • 1.   假设当前速度是 v ,和前一辆车的距离为d。
  • 2.   如果 d > v,它在下一秒的速度会提高到 v + 1 ,直到达到规定的最高限速。
  • 3.   如果 d <= v,那么它在下一秒的速度会降低到 d - 1 。
  • 4.   前三条完成后,司机还会以概率 p 随机减速1个单位,速度不会为负值。
  • 5.   基于以上几点,车辆向前移动v(这里的v已经被更新)个单位。

根据以下几点预测查看车辆的车流情况

python代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File  : Nagel-Schreckenberg(交通流)模型.py
# @Author: 赵路仓
# @Date  : 2020/3/1
# @Desc  :
# @Contact : 398333404@qq.com

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

plt.rcParams[font.sans-serif] = [SimHei]
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车辆位置)
    plt.ylabel(u模拟时间)
    plt.title(u交通模拟(车道长度%d,车辆数%d,初速度%s,减速概率%s) % (path, n, v0, p))
    # plt.tight_layout(pad=2)
    plt.show()


if __name__ == __main__:
    # Run(p=0.3)
    Run(p=0.2)

结果:

技术分享图片

 

[Python机器学习]Nagel-Schreckenberg(交通流)模型

原文:https://www.cnblogs.com/zlc364624/p/12392656.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!