VRPTW场景下如何不修改时间窗口强制指定车辆下一个访问节点
强制首访节点3的实现方案
基于你使用的OR-Tools VRP求解器环境,无需修改节点3的时间窗口、无需调整0到3的行程时间,可通过硬约束+初始解适配实现需求:
- 步骤1:添加强制顺序硬约束
调用求解器原生AddNextVisit接口,直接指定起始节点0的下一个访问节点固定为3,该约束优先级高于路径搜索逻辑,只要0到3的行程时间满足节点3的时间窗口要求,就会强制生效:# routing为已初始化的RoutingModel实例,manager为对应的RoutingIndexManager实例 start_idx = manager.NodeToIndex(0) first_visit_idx = manager.NodeToIndex(3) # 单车辆场景直接指定车辆编号为0,多车辆场景按需给对应车辆添加约束即可 routing.AddNextVisit(start_idx, first_visit_idx, 0)该约束不会修改任何节点的时间窗口、行程矩阵参数,完全独立于原有业务规则。
- 步骤2:适配初始解策略
你当前使用的GLOBAL_CHEAPEST_ARC初始解策略本身会优先满足已添加的硬约束,可通过给0->3的路径段添加极小的成本偏好,提升初始解生成效率,该调整不会影响最终路径的成本计算逻辑:def cost_callback(from_idx, to_idx): from_node = manager.IndexToNode(from_idx) to_node = manager.IndexToNode(to_idx) origin_cost = your_original_distance_matrix[from_node][to_node] # 仅给0->3的路径段设置极低的成本权重,系数可选0.001这类不影响整体成本排序的极小值 if from_node == 0 and to_node == 3: return int(origin_cost * 0.001) return origin_cost # 注册成本回调,时间回调保持原有逻辑不变,不影响时间窗口校验 transit_cb_idx = routing.RegisterTransitCallback(cost_callback) routing.SetArcCostEvaluatorOfAllVehicles(transit_cb_idx) - 步骤3:校验规则生效
求解完成后输出路径的前两个节点必然为0 -> 3,节点3与节点4的取派件绑定关系不受影响,所有原有时间窗口、行程时间规则完全保留。
内容的提问来源于stack exchange,提问作者Kiluvya.A
相关产品推荐
相关产品推荐

