在 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。
我正在尝试在 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。