You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PTV Vissim 基于条件更改车辆类别路径的脚本编写咨询

PTV Vissim 车辆路径动态切换实现方案

你可以通过Vissim COM接口编写Python脚本实现该功能,核心逻辑是实时监听指定类别车辆的点位通过状态,满足通过数量阈值后为车辆重新分配目标路径,具体实现步骤和代码如下:

前置配置要求

在运行脚本前,需要先在Vissim路网中完成基础元素配置:

  • 为需要触发路径切换的车辆设置独立的车辆类别,避免和普通社会车辆逻辑混淆,记录该类别的编号
  • 在车辆初始行驶路径上按需求布设指定数量的labs检测点位,记录所有点位的检测器编号
  • 在最后一个labs点位的下游、路径分叉口上游位置,预先配置好两套静态路径决策:一套是车辆初始默认行驶路径,另一套是待切换的目标路径,记录目标路径对应的路径决策点ID、目标路径ID

实现脚本(Python版)

import win32com.client as win32

# -------------------------- 请根据自身路网修改以下参数 --------------------------
TARGET_VEH_CLASS = 10          # 需触发路径切换的车辆类别编号
LABS_DETECTOR_IDS = [1,2,3]    # 需要依次经过的labs点位检测器编号,按行驶顺序排列
PATH_DECISION_ID = 5           # 路径切换位置的静态路径决策点ID
TARGET_PATH_ID = 2             # 切换后目标路径的ID
SIMULATION_SPEED = 10          # 仿真运行倍速
# -----------------------------------------------------------------------------

# 连接Vissim COM接口
vissim = win32.Dispatch("Vissim.Vissim")
net = vissim.Net
# 初始化车辆通过点位计数字典,key为车辆ID,value为已通过的labs点位数量
veh_pass_count = {}

# 启动仿真
vissim.Simulation.SetAttValue("SimSpeed", SIMULATION_SPEED)
sim_period = vissim.Simulation.AttValue("SimPeriod")

for sim_step in range(int(sim_period / vissim.Simulation.AttValue("SimRes"))):
    vissim.Simulation.RunSingleStep()
    
    # 遍历所有labs检测器,读取当前仿真步通过的车辆
    for det_id in LABS_DETECTOR_IDS:
        detector = net.Detectors.ItemByKey(det_id)
        # 获取当前步该检测器上的所有车辆
        for veh in detector.Vehs:
            veh_id = veh.AttValue("No")
            veh_class = veh.AttValue("VehType")
            # 只处理目标类别车辆
            if veh_class != TARGET_VEH_CLASS:
                continue
            # 初始化车辆计数
            if veh_id not in veh_pass_count:
                veh_pass_count[veh_id] = 0
            # 按顺序校验通过点位,避免跳点计数
            expected_det_index = veh_pass_count[veh_id]
            if det_id == LABS_DETECTOR_IDS[expected_det_index]:
                veh_pass_count[veh_id] += 1
                # 满足通过所有labs点位的条件时,执行路径切换
                if veh_pass_count[veh_id] == len(LABS_DETECTOR_IDS):
                    # 给车辆分配指定的目标路径
                    veh.SetPath(net.PathDecisions.ItemByKey(PATH_DECISION_ID).Paths.ItemByKey(TARGET_PATH_ID))
                    # 计数完成后从字典中移除该车辆,减少内存占用
                    del veh_pass_count[veh_id]
    
    # 清理已经驶出路网的车辆计数数据
    all_current_veh_ids = [veh.AttValue("No") for veh in net.Vehs.GetAll()]
    for stored_veh_id in list(veh_pass_count.keys()):
        if stored_veh_id not in all_current_veh_ids:
            del veh_pass_count[stored_veh_id]

使用注意事项

  • 所有labs检测点位必须布设在路径决策点的上游,若车辆驶过决策点后才触发计数,将无法完成路径修改
  • 若需要对不同车辆设置不同的点位通过阈值、不同的目标路径,可扩展veh_pass_count字典的存储结构,为每辆车单独存储规则
  • 脚本运行前请确保已经在Vissim中加载了对应路网,且Vissim没有被其他进程占用COM接口
  • 如果使用Vissim 7及以下版本,可将代码逻辑平移为VBS脚本,接口调用规则完全一致

内容的提问来源于stack exchange,提问作者ARChi MADel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 13:36:26