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

結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM