zoukankan      html  css  js  c++  java
  • [Python机器学习]Nagel-Schreckenberg(交通流)模型

    据 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)

    结果:

  • 相关阅读:
    项目实战从 0 到 1 学习之Flink (24)Flink将kafka的数据存到redis中
    LeetCode107. 二叉树的层次遍历 II
    LeetCode102. 二叉树的层序遍历
    LeetCode341. 扁平化嵌套列表迭代器
    【总结】二叉树的前中后序遍历(递归和非递归)
    LeetCode145. 二叉树的后序遍历
    LeetCode94. 二叉树的中序遍历
    LeetCode144. 二叉树的前序遍历
    LeetCode71. 简化路径
    LeetCode150. 逆波兰表达式求值
  • 原文地址:https://www.cnblogs.com/zlc364624/p/12392656.html
Copyright © 2011-2022 走看看