前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >线性跟驰模型

线性跟驰模型

作者头像
福贵
发布2018-12-17 15:01:08
1.4K0
发布2018-12-17 15:01:08
举报
文章被收录于专栏:合集

Python是世界上最好的语言。

代码语言:javascript
复制
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)))
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-11-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python与MySQL 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档