如何在OR-Tools中为车辆设置专属时间窗及延误惩罚?卫星VRP场景
可以在OR-Tools中实现车辆-节点专属时间窗约束
OR-Tools默认的VRPTW模块是给每个节点设置全局时间窗,但通过自定义条件约束,完全可以实现每台车辆对应各城市的专属时间窗需求。
实现思路
核心逻辑是:针对每台车辆和每个城市节点,判断该车辆是否访问了该节点;如果访问,则强制车辆到达该节点的时间落在对应专属时间窗内。
具体步骤与代码示例
以Python版本的OR-Tools为例:
定义车辆-节点专属时间窗数据
用二维数组存储每台车辆对应各城市的时间窗,对应你的示例:# 结构:[车辆0的城市时间窗列表, 车辆1的城市时间窗列表] vehicle_node_time_windows = [ [(0, 12), (11, 20), (3, 15)], # vehicle_1对应3个城市的时间窗 [(9, 18), (4, 23), (12, 17)] # vehicle_2对应3个城市的时间窗 ]添加条件时间窗约束
在创建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
相关产品推荐
相关产品推荐

