Google OR Tools VRPTW设置非0起始时间窗口触发底层错误如何解决?
错误触发原因
- 核心原因1:时间维度初始化的
horizon参数配置过小。调用routing.AddDimension()创建时间维度时,最后一个参数为整个调度任务允许的全局最大时间值,官方默认示例适配单日场景设置为1440,你的3天场景最大时间为4320,超出1440的时间范围设置会触发CumulVar值域越界错误。 - 核心原因2:时间维度初始化的
fix_start_cumul_to_zero参数设置为true。该参数会强制所有车辆的起始时间累计值固定为0,你设置的非0起始时间窗口与该强制规则冲突,直接触发SetRange报错,这也是你全量设置1440-2880窗口时立即报错的主要原因。 - 次要原因:起止节点的全局时间窗口未同步更新。如果你给每日车辆对应的A/B起止点位配置的全局
TimeWindows仍为0-1440,车辆起始窗口与节点本身的时间窗口冲突也会导致报错。
解决方案
- 调整时间维度的全局时间上限参数
将创建时间维度的代码中,最后一位horizon参数修改为你场景的最大时间值4320,示例修改如下:
// 原代码(示例) routing.AddDimension(timeEvaluator, 30, 1440, true, "Time"); // 修改后 routing.AddDimension(timeEvaluator, 30, 4320, false, "Time");
- 关闭强制起始时间为0的配置
如上代码所示,将第四个参数fix_start_cumul_to_zero从true改为false,允许不同车辆设置不同的起始时间范围。 - 同步更新起止节点的时间窗口
在全局data.TimeWindows数组中,给对应日期的A/B起止点位配置和车辆起始窗口一致的时间范围:
- Day1对应A/B点位:[0, 1440]
- Day2对应A/B点位:[1440, 2880]
- Day3对应A/B点位:[2880, 4320]
修改完成后你原本编写的车辆起始时间窗口设置代码即可正常运行。
内容的提问来源于stack exchange,提问作者Jeff - Software Results
相关产品推荐
相关产品推荐

