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

如何在OR-Tools中为车辆设置专属时间窗及延误惩罚?卫星VRP场景

可以在OR-Tools中实现车辆-节点专属时间窗约束

OR-Tools默认的VRPTW模块是给每个节点设置全局时间窗,但通过自定义条件约束,完全可以实现每台车辆对应各城市的专属时间窗需求。

实现思路

核心逻辑是:针对每台车辆和每个城市节点,判断该车辆是否访问了该节点;如果访问,则强制车辆到达该节点的时间落在对应专属时间窗内。

具体步骤与代码示例

以Python版本的OR-Tools为例:

  1. 定义车辆-节点专属时间窗数据
    用二维数组存储每台车辆对应各城市的时间窗,对应你的示例:

    # 结构:[车辆0的城市时间窗列表, 车辆1的城市时间窗列表]
    vehicle_node_time_windows = [
        [(0, 12), (11, 20), (3, 15)],  # vehicle_1对应3个城市的时间窗
        [(9, 18), (4, 23), (12, 17)]   # vehicle_2对应3个城市的时间窗
    ]
    
  2. 添加条件时间窗约束
    在创建VRP路由模型后,遍历所有车辆和城市节点,利用OR-Tools的OnlyEnforceIf方法添加条件约束:

    from ortools.constraint_solver import routing_enums_pb2
    from ortools.constraint_solver import pywrapcp
    
    # 初始化模型、路由、时间维度等基础配置(省略常规VRP初始化代码)
    # ...
    
    # 遍历所有车辆和城市节点
    num_vehicles = 2
    num_cities = 3
    city_node_ids = list(range(1, num_cities+1))  # 假设城市节点索引为1-3,0为起始节点
    
    for vehicle_id in range(num_vehicles):
        for idx, city_node in enumerate(city_node_ids):
            # 获取当前车辆对应当前城市的时间窗
            start_tw, end_tw = vehicle_node_time_windows[vehicle_id][idx]
            # 获取该车辆访问该城市节点的时间累积变量
            time_var = routing.AcumulVar(routing.NodeToIndex(city_node, vehicle_id))
            # 获取该节点的活跃变量(1表示车辆访问该节点,0表示未访问)
            active_var = routing.ActiveVar(routing.NodeToIndex(city_node, vehicle_id))
            
            # 添加约束:只有当车辆访问该节点时,时间才需符合专属时间窗
            solver = routing.solver()
            solver.Add(time_var >= start_tw).OnlyEnforceIf(active_var)
            solver.Add(time_var <= end_tw).OnlyEnforceIf(active_var)
    

注意事项

  • 如果你的卫星式VRP包含卫星中转节点,需给中转节点添加专属时间窗的话,用同样的逻辑处理即可。
  • 该方法适用于OR-Tools所有支持的VRP扩展场景(包括多卫星、多 depot等),不会破坏原有模型的求解逻辑。
  • 对于超大规模问题,自定义约束会略微增加求解时间,但在常规业务场景下影响可忽略。

内容的提问来源于stack exchange,提问作者Zouitine Mehdi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:35:28