如何调整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
相关产品推荐
相关产品推荐

