在 google ortools 中添加析取约束

Adding Disjunctive constraints in google ortools

我正在尝试在 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 运算符添加到我的约束之一的适当 code/syntax 吗?

在路由库中,你要添加(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。