在google或tools中添加析取约束



我试图在google-ortools中添加一个可选的车辆会议状态。

我正在努力确保车辆1只有在车辆2也访问会议节点时才能到达会议节点。

下面的代码可以编译,但是它不阻止第一个车辆访问first_vehicle_meet,而second_vehicle_meet被vehicle -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))

有没有人知道适当的代码/语法来添加或操作符到我的约束之一?

在路由库中,如果您想添加(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。

最新更新