You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OR Tools中CumulVar与SlackVar结合导致时间窗口无灵活性的问题

单车辆多途经点路径规划:时间窗口灵活性丢失问题解析

我在处理单车辆多途经点(含取货/送货)的路径规划问题时,最初通过dimension.CumulVar(index).SetRange(start_window, end_window)为每个途经点设置了灵活的时间窗口:

waypoint 1: (10:17, 11:19)
waypoint 2: (11:25, 11:38)
waypoint 3: (11:45, 11:46)
waypoint 4: (11:45, 11:46)
waypoint 5: (11:45, 11:46)
waypoint 6: (11:53, 11:54)
waypoint 7: (12:00, 12:00)

但当我尝试用dimension.SlackVar(index).SetValue(loading_time)强制车辆在每个点等待以模拟装卸货时间后,所有途经点的时间窗口都失去灵活性,变成了固定时间点:

waypoint 1: (11:14, 11:14)
waypoint 2: (11:27, 11:27)
waypoint 3: (11:40, 11:40)
waypoint 4: (11:45, 11:45)
waypoint 5: (11:50, 11:50)
waypoint 6: (12:09, 12:09)
waypoint 7: (12:21, 12:21)

问题根源:混淆了SlackVar的作用

  • SlackVar是时间窗口的松弛变量,仅用来处理「车辆早于窗口开始时间到达」的等待时长:如果车辆在窗口开始后抵达,这个变量的值就是0;只有早到的时候,它等于窗口开始时间和实际到达时间的差值。
  • 你用SlackVar.SetValue(loading_time)把它固定成装卸货时间,等于给每个途经点加了个刚性约束:不管车辆什么时候到,都必须等待loading_time这么久。这会迫使求解器把每个点的到达时间锁死——因为松弛变量被固定,系统只能通过唯一的到达时间来满足所有约束,直接导致时间窗口的灵活性消失。

正确的操作方式:用服务时间模拟装卸货

模拟装卸货时间不该修改SlackVar,正确做法是配置服务时间:

  • 在OR-Tools中,应该给每个途经点设置service_time参数,让求解器把装卸货时间纳入路径的时间累积计算。比如在构建节点时直接指定服务时长,或者通过时间维度的约束逻辑,将服务时间加入到CumulVar的递推中。
  • 正确的逻辑是:车辆到达途经点→花费固定时间完成装卸货→再出发前往下一点,这个时间是路径总时间的一部分,而非强制等待的松弛时间。

内容的提问来源于stack exchange,提问作者gliese667cc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 12:27:48