【问题标题】:How to use 'or' in constraint in Gurobi如何在 Gurobi 中使用“或”约束
【发布时间】:2018-08-26 02:43:02
【问题描述】:

我正在使用 Gurobi,在我的代码的一部分中,我定义了一个可以接受两个不同值的约束。例如 1 或 2。最重要的是我的实现的半代码:

m = Model("mip1")
Edges = tuplelist([(1,2),(1,3),(3,4),(3,5),(3,6),(5,6),(6,7),
                   (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),
                   (1,8),(2,8),(3,8),(4,8),(5,8),(6,8),(7,8),
                   (8,1),(8,2),(8,3),(8,4),(8,5),(8,6),(8,7),
                   ])

x = m.addVars(Edges, lb=0.0, ub=1.0, name = "x")

m.setObjective(quicksum(x[w,s] for w,s in Edges), GRB.MAXIMIZE)

m.addConstr(quicksum(x.select(8,'*')) ==1 or 2 , "constraint1")

但我不知道如何在 Gurobi 中定义约束中的“或”!

【问题讨论】:

  • 我不知道 gurobi,但表达式 quicksum(x.select(8,'*')) ==1 or 2 并不像您认为的那样起作用。阅读this
  • @timgeb,我没有这样做,正如我所说,这是一个半代码!我想要这样的东西

标签: python python-3.x gurobi


【解决方案1】:

让我们添加两个二进制变量 y_0 和 y_1:

y = m.addVars(2, vtype=GRB.BINARY, name="y")

现在你可以添加两个indicator constraints:

# If y[0] == 1, then quicksum(x.select(8, '*')) == 2
m.addConstr((y[0] == 1) >> (quicksum(x.select(8, '*')) == 2))
# If y[1] == 1, then quicksum(x.select(8, '*')) == 3
m.addConstr((y[1] == 1) >> (quicksum(x.select(8, '*')) == 3))

接下来添加约束

m.addConstr(y[0] + y[1] == 1)

这确保了这两个变量中只有一个可以为 1,因此总和为 2 或 3。

【讨论】:

  • 第二个约束不能是(y[0] == 0) >> (quicksum(x.select(8, '*')) == 3),有效地使第二个二进制变量和最后一个约束变得不必要?但不能使用超过 2 个变量..
  • 是的,你是对的。但是,对于约束应该等于两个以上可能值的情况,可以轻松扩展答案中发布的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多