在 google ortools 中添加析取约束

Posted

技术标签:

【中文标题】在 google ortools 中添加析取约束【英文标题】:Adding Disjunctive constraints in google ortools 【发布时间】:2021-11-30 14:15:49 【问题描述】:

我正在尝试在 google-ortools 中添加可选的车辆会议状态。

我正在尝试确保车辆 1 只能在车辆 2 也访问会议节点时才能前往会议节点。

下面的代码可以编译,但它不会阻止第一辆车访问 first_vehicle_meet,而 second_vehicle_meet 被车辆 -1 访问

routing.AddDisjunction([first_vehicle_meet], 0)
routing.AddDisjunction([second_vehicle_meet], 0)

routing.solver().Add(((routing.VehicleVar(first_vehicle_meet) == -1) and (routing.VehicleVar(first_vehicle_meet) == -1))
                     or ((routing.VehicleVar(first_vehicle_meet) != -1) and (routing.VehicleVar(first_vehicle_meet) != -1)))

我也试过这段代码,但是报错


routing.AddDisjunction([first_vehicle_meet], 0)
routing.AddDisjunction([second_vehicle_meet], 0)

routing.solver().Add(((routing.VehicleVar(first_vehicle_meet) == -1) & (routing.VehicleVar(first_vehicle_meet) == -1))
                     | ((routing.VehicleVar(first_vehicle_meet) != -1) & (routing.VehicleVar(first_vehicle_meet) != -1)))

如下所示。

routing.AddDisjunction([second_vehicle_meet], 0)

routing.solver().Add((routing.VehicleVar(first_vehicle_meet) == -1)\
                     .OnlyEnforceIf(routing.VehicleVar(second_vehicle_meet) == -1))
routing.solver().Add((routing.VehicleVar(second_vehicle_meet) == -1)\
                     .OnlyEnforceIf(routing.VehicleVar(first_vehicle_meet) == -1))

有人知道将 or 运算符添加到我的约束之一的适当代码/语法吗?

【问题讨论】:

您正在混合两个不同的求解器。不能在约束中使用 &、&&、and 或 python 运算符。 @laurentPerron 这是否意味着在 VRO 求解器中添加析取约束是不可能的? 有可能。让我正确回答。 【参考方案1】:

在路由库中,要添加 (x == 2) || (y == 3)

首先查询求解器

  solver = routing.solver()

然后为每个相等创建一个布尔变量

  x2 = solver.IsEqualCstVar(x, 2)  # You can use x2 == (x == 2).Var()
  y3 = solver.IsEqualCstVar(y, 3)

然后添加析取

  solver.Add(x2 + y3 >= 1)

关键是在布尔变量上使用线性公式来编码 OR/AND。

【讨论】:

这很好用。谢谢@LaurentPerron。 只是一个与添加约束的方式有关的问题。为什么我们在 solver.Add(x2 + y3 >= 1) 中使用 (>=) 而不是仅仅 (=) ? Or() 不是排他性的。

以上是关于在 google ortools 中添加析取约束的主要内容,如果未能解决你的问题,请参考以下文章

Ortools 在求解时设置约束

ortools如何添加非线性约束

如何在ortools python中设置约束

如何在 ortools 中更改约束参数的类型

线性规划 - Google ortools - 不正确的决策变量最终值

使用ortools时如何获取cpsolver的变量和约束