Python基于Google OR Tools求解带时间窗VRP问题异常求助
带时间窗VRP问题异常排查与修复方案
一、车辆闲置问题(仅1辆车执行任务)
1. 调整车辆容量与成本设置
- 若所有订单总需求小于单辆车容量,算法会优先用单辆车完成以降低成本。要强制多派车可:
- 降低单辆车容量上限,确保总需求超过单车载量;
- 给车辆添加固定使用成本,让算法更倾向于拆分任务到多辆车。示例代码:
# 为每辆车设置固定启动成本,数值越低越易触发多派车 for vehicle_id in range(num_vehicles): routing.SetFixedCostOfVehicle(80, vehicle_id)
2. 确认车辆配置正确性
- 检查
num_vehicles参数是否设置为你期望的车辆数量; - 确保所有车辆的起点/终点都设为depot(默认索引0),避免因起点错误导致车辆无法调度:
for vehicle_id in range(num_vehicles): routing.SetStart(0, vehicle_id) routing.SetEnd(0, vehicle_id)
二、到达时间不符合时间窗问题
1. 验证time_matrix准确性
- 检查时间矩阵的数值是否对应真实行驶时间,避免混淆距离与时间、单位不统一的问题;
- 确认矩阵索引与客户点完全对应:depot对应0,客户点按顺序对应1-16。
2. 修复时间窗约束逻辑
- 确保每个客户点都正确添加时间窗约束,且时间单位与
time_matrix一致(比如统一用分钟)。示例代码:# 示例时间窗配置,按需替换为你的实际数据 time_windows = [ (0, 1440), # depot无严格时间窗 (60, 120), # 客户1的时间窗(开始-结束) (180, 240), # 客户2的时间窗 # ... 其余14个客户的时间窗配置 ] # 注册时间回调函数 def time_callback(from_index, to_index): from_node = routing.IndexToNode(from_index) to_node = routing.IndexToNode(to_index) return time_matrix[from_node][to_node] transit_callback_index = routing.RegisterTransitCallback(time_callback) routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index) # 初始化时间维度,设置允许等待时间和车辆最大工作时长 time_dim = routing.AddDimension( transit_callback_index, 60, # 最大等待时间(单位与时间矩阵一致) 480, # 车辆单日最大工作时长 False, "Time" ) # 为每个节点绑定时间窗约束 for loc_idx, (start, end) in enumerate(time_windows): node_idx = routing.NodeToIndex(loc_idx) time_dim.CumulVar(node_idx).SetRange(start, end)
3. 确认等待时间配置
- 如果车辆到达时间早于客户时间窗开始时间,需确保
AddDimension的slack_max参数(即最大允许等待时间)设置合理,避免因无法等待导致时间窗违规。
三、调试辅助技巧
- 开启算法日志输出,查看调度过程细节,定位异常原因:
solver = routing.solver() solver.parameters.log_search_progress = True - 简化测试场景:先将客户数量缩减至3-5个,手动设置明确的时间窗和车辆容量,验证算法能正确调度后,再逐步扩展到16个客户。
内容的提问来源于stack exchange,提问作者paresh patil
相关产品推荐
相关产品推荐

