Как использовать «или» в ограничении в Гуроби

Я использую 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")

Но я не знаю, как определить «или» в ограничении в Гуроби!

python,python-3.x,gurobi,

0

Ответов: 1


1 принят

Добавим две двоичные переменные y_0 и y_1:

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

Теперь вы можете добавить два ограничения индикатора :

# 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.

python, python-3.x, gurobi,
Похожие вопросы