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

如何调整OR-Tools VRPTW代码以满足自定义车辆与时间窗需求?

OR-Tools VRPTW 修改方案与时间参数说明

一、无可行解的修正办法

改完1辆车+节点13专属时间窗后没可行解,核心问题是单辆车的行程无法在时间约束内覆盖所有节点,按以下步骤排查修正:

  • 先确认节点索引:官方示例里depot是节点0,客户节点从1开始,别把depot误当成节点13。
  • 检查时间矩阵数值:计算depot(节点0)到节点13的最短时间,如果这个时间直接超过8,根本赶不上节点13的时间窗上限,要么放宽节点13的时间窗(比如改成(3,10)),要么调整时间矩阵的数值(如果是自定义的距离转时间逻辑)。
  • 调整车辆最大总时长:原代码的vehicle_max_time如果设得太小,单辆车跑完全程的总时间(行驶+服务+等待)超过这个值就会无解,直接把这个参数改大,比如设为20或者更大(和你时间矩阵的单位一致)。
  • 确认时间窗设置逻辑:用循环精准对应节点设置时间窗,示例代码如下:
    data['time_windows'] = []
    num_nodes = len(data['time_matrix'])
    for i in range(num_nodes):
        if i == 13:
            data['time_windows'].append((5, 8))
        else:
            data['time_windows'].append((0, 15))
    
  • 验证行程总时间:如果depot到节点13的时间是6,节点13到其他节点的总行驶+服务时间加起来是7,回到depot需要2,总时间就是6+1(服务时间)+7+2=16,超过了其他节点(包括depot)的时间窗上限15,这时候要放宽depot的时间窗到(0,20),给行程留出足够空间。

二、时间参数的单位与含义

  • 等待时间:车辆到达节点的时间早于该节点时间窗开始时间时,必须等时间窗开放才能服务,这段等待的时间就是等待时间,会被计入车辆的总耗时。比如车辆4点到节点13(时间窗5-8),就得等1个单位时间,5点才开始服务。
  • 车辆最大总时长(vehicle_max_time):
    • 单位:和你定义的time_matrix单位完全一致,你用分钟就是分钟,用小时就是小时,由自定义逻辑决定。
    • 含义:车辆从depot出发到返回depot的总时间上限,包含行驶、服务、等待所有时间,总时间超过这个值,路径直接被判无效。

三、关键代码修改示例

以Python版官方代码为例,修改核心数据模型部分:

def create_data_model():
    data = {}
    # 替换成你实际使用的时间矩阵
    data['time_matrix'] = [
        [0, 1, 3, 2, ...],  # depot(节点0)到各节点的时间
        # ... 其他节点的时间矩阵行
        [..., 4, 0]         # 节点13对应的行
    ]
    data['time_windows'] = []
    num_nodes = len(data['time_matrix'])
    # 批量设置时间窗
    for node_idx in range(num_nodes):
        if node_idx == 13:
            data['time_windows'].append((5, 8))
        else:
            data['time_windows'].append((0, 15))
    data['num_vehicles'] = 1
    data['depot'] = 0
    # 放宽车辆最大时长,确保能覆盖全程
    data['vehicle_max_time'] = 20
    return data

内容的提问来源于stack exchange,提问作者diego medina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:32:41