線性跟馳模型

Python是世界上最好的語言。

import random
import math

a0 = 6  # 車的正常加速度m/s^2
MAX_SPEED = 36  # 最大行駛速度m/s
L = 10  # 停車安全距離m
v0 = 20  # 車輛平均行駛速度,可視爲車輛正常情況下速度m/s
scenes = ['被搶道', '跟馳', '停車啓動', '隨行', '靠近', '停車']
# 不會改變的參數
"""
在整個過程,前車與後車正常減速相同
"""


def action(scene, v1, v2):  # 實際操作
    t = 10  # 假設場景持續時間
    a1 = 0
    """
    對六種微觀場景進行參數改變
    """
    if scene == scenes[0]:  # 被搶道的參數改變
        x2 = 0
        x1 = random.uniform(L, s0 - L)
        v1 = v0
        v2 = v0
        a1 = 0
    if scene == scenes[1]:  # 跟馳的參數改變
        x2 = 0
        x1 = x2 + v2 * T
        v1 = v0
        v2 = v0
        if random.random() < 1 / 2:  # 隨機生成加速和減速兩種跟馳場景
            a1 = a0
        if random.random() >= 1 / 2:
            a1 = -a0
    if scene == scenes[2]:  # 停車起步的參數改變
        a1 = a0
        v1 = 0
        v2 = 0
        x2 = 0
        x1 = x2 + v2 * T
    if scene == scenes[3]:  # 隨行的參數改變
        v1 = v0
        v2 = v0
        x2 = 0
        x1 = x2 + v2 * T
        a1 = a0
    if scene == scenes[4]:  # 靠近的參數改變
        v1 = random.randint(0, v0)
        a1 = a0
        v2 = v0
        x2 = 0
        x1 = x2 + v2 * T
    if scene == scenes[5]:  # 停車的參數改變
        v1 = v0
        v2 = v0
        a1 = -a0
        x2 = 0
        x1 = x2 + v2 * T
    if v1 <= 0:
        v1 = 0
    if v2 <= 0:
        v2 = 0
    for i in range(0, t):
        if x1 - x2 < 125:
            a2 = ld * (v1 - v2)  # 車頭間距受到前車影響
        if i != 0:
            v2 = v2 + a2 * T
        v1 = v1 + a1 * T
        if i == 0:
            x1 = L + v2 * T
        x1 = x1 + v1 * T
        x2 = x2 + v2 * T
        if math.fabs(v1 - v2) <= 0.2:  # 車速差距較小,結束循環,以速度相等作爲結束的標誌
            return v1, v2, x1, x2
        if v2 > MAX_SPEED:  # 後車車速大於MAX_SPEED,結束迭代
            return v1, v2, x1, x2
        if v1 <= 0:
            v1 = 0
            return v1, v2, x1, x2
        if v2 <= 0:
            v2 = 0  # 任何一個值爲0,結束迭代
            return v1, v2, x1, x2
    return v1, v2, x1, x2  # 定義各部分迭代結束


for i in range(0, 100):  # 定義輸出情況個數
    state = True  # 定義初運行正常
    v1, v2 = v0, v0  # v1前車速度 v2後車速度
    a1, a2 = a0, a0  # 前車加速度m/s^2 後車加速度m/s^2
    T = random.random() + 0.2  # 時間間隔,即反應時間s,設定爲0.2s-1.2s
    C = random.random() * 2  # 設定C的值爲0-2
    ld = C / T  # 反應強度λ
    if ld > 1 or ld < 0.1:
        continue  # 剔除太小的反應強度值
    x2 = 0
    x1 = x2 + v2 * T  # 設定初始前後車間距
    s0 = L + v2 * T  # 車輛以正常速度行駛狀態中的車頭間距m,安全距離
    scene = random.choice(scenes)  # 隨機產生場景
    v1, v2, x1, x2 = action(scene, v1, v2)
    print("------------\n")
    if v2 > MAX_SPEED:
        state = False
        print("按照此模型,{}將可能導致後車速度超過了最大限制".format(scene))
    if v2 * T + L > x1 - x2:
        state = False
        print("按照此模型,{}將可能導致車輛相撞".format(scene))
    print("此時λ的值:{:.3}    T的值:{:.3}".format(ld, T))
    if state:
        print("可以正常運行")
    else:
        print("模型在該情況出錯")
    print("運行一段時間後各參數的值:v1:{}m/s    v2:{}m/s    x1:{}m    x2:{}m".format(round(v1, 2), round(v2, 2), round(x1, 2),
                                                                         round(x2, 2)))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章