首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在google或ortools中添加析取约束

在google或ortools中添加析取约束
EN

Stack Overflow用户
提问于 2021-10-11 21:48:43
回答 1查看 161关注 0票数 1

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

我正在尝试确保如果车辆2也访问会议节点,则车辆1只能去往会议节点。

以下代码进行了编译,但它不会阻止第一个vehicle one访问first_vehicle_meet,而vehicle -1正在访问second_vehicle_meet

代码语言:javascript
复制
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)))

我也尝试过这段代码,但它给出了一个错误

代码语言:javascript
复制
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)))

如下所示。

代码语言:javascript
复制
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操作符添加到我的约束中?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-13 07:49:43

在布线库中,添加(x == 2) || (y == 3)

首先查询求解器

代码语言:javascript
复制
  solver = routing.solver()

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

代码语言:javascript
复制
  x2 = solver.IsEqualCstVar(x, 2)  # You can use x2 == (x == 2).Var()
  y3 = solver.IsEqualCstVar(y, 3)

然后添加析取

代码语言:javascript
复制
  solver.Add(x2 + y3 >= 1)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69532812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档