Как указать кусочную оценку для переменной в Gurobi? - PullRequest
0 голосов
/ 20 марта 2020

У меня есть целочисленные переменные в моей модели, которые не могут быть = 1 или = 2, но могут быть = 0 или любым целым числом> 2.

Я думал, что это можно указать как:

Bounds

  X1 >= 3
  X2 >= 3
...

Однако я понял, что это не позволяет переменной = 0, что мне и нужно. Есть ли такой способ:

X1 >= 3 OR X1 = 0

или

X1 cannot = 1 OR 2

Я использую формат .lp с командной строкой gurobi_cl.

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

В дополнение к ответу Мэтмилтена: С помощью big-m-метода вы можете сделать это «руками», т.е. мы добавляем два дополнительных ограничения:

X1 <= 0 + M-M*b
X1 >= 3 - M*b

, где b является двоичной переменной, а M достаточно большим числом> 0. Выбрав M = 1000, мы получим:

Maximize
  ...
Subject To
  ...
  X1 + 1000 w <= 1000
  X1 + 1000 w >= 3
Generals
  X1
Binary
  b
End
0 голосов
/ 20 марта 2020

В Gurobi вы можете создавать так называемые полунепрерывные или полуцелые переменные . Такие переменные могут быть 0 или принимать любое значение между указанными границами.

В Python вы можете создать их следующим образом ( reference ):

import gurobipy as gp
from gurobipy import GRB

model = gp.Model()
X1 = model.addVar(lb=2.0, vtype=GRB.SEMIINT, name="X1")  
...