1

我最近一直在使用 or-tools,现在我正在使用 python 为 CVRP 设置中断间隔。

我想要实现的是为车辆创建 N 次休息并放置在 XOR 约束之上,因此只有一个休息被执行。

我创建了中断和每个中断间隔的执行值列表,如下所示:

 for i in xrange(len(self.breaks)):
     name_break = "break_{}".format(i)
     start_min, start_max, duration_break = breaks[i]
     optional_break = True

     break_intervals.append(solver.FixedDurationIntervalVar(start_min, start_max, duration_break, optional_break, name_break))
     performed_values.add(break_intervals[i].PerformedExpr())

然后我使用求解器的语法糖使用SumEquality方法添加约束,并将中断间隔添加到车辆:

solver.Add(solver.SumEquality(performed_values, 1))

routing.GetDimensionOrDie("Time").SetBreakIntervalsOfVehicle(break_intervals, 0)

当中断中只有一个中断时,该约束完美地工作这与将 'optional_break' 的值更改为False相同)。问题是当我在 break 中添加新的 break 时没有解决方案。作业为空。

该解决方案是可行的,第一次中断我得到一个分配,添加一个可选 的中断不应该返回一个空分配。

除了中断间隔约束和最小化时间变量语句之外,我几乎都遵循了这个cpp 教程。

也许我错过了一些东西。你对这个问题有什么见解吗?

4

0 回答 0