在 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 中添加析取约束的主要内容,如果未能解决你的问题,请参考以下文章