1

Я пытаюсь добавить некоторые ленивые ограничения на первый этап проблемы стохастического программирования. Например, оптимальное решение показывает мне, что места 16 и 20 выбираются вместе, которые я не хочу, так что я хочу, чтобы добавить ленивое ограничение следующим образом:Добавление ленивого ограничения в интерфейс python-Gurobi

First Stage 
     x1 + x2 + ... + x40 = 5 
     z_i,l <= x_i i=1,..,40 and l=1,2 
    Second Stage 
     .... 
    def mycallback(model,where): 
     if where == GRB.Callback.MIPSOL: 
      sol = model.cbGetSolution([model._vars[s] for s in range(1,40)]) 
      if sol[16] + sol[20] == 2: 
      Exp = LinExpr([(1,model._vars[16]),(1,model._vars[20])]) 
      model.cbLazy(Exp <= 1) 

    model._vars = x 
    model.optimize(mycallback) 

Но после запуска этой функции, места 16 и 20 все еще находятся в оптимальном решении. Не могли бы вы сообщить мне, как я должен атаковать эту проблему?

+0

Проверьте использование функции range(). –

+0

Когда я проверяю model._vars [s] для указанного диапазона, он дает мне оптимальное значение (0-1) для каждого местоположения правильно. Не могли бы вы указать, как проверить диапазон? – user36729

+1

В вашем коде выше, _vars [i]! = Sol [i] для i = 16,20 –

ответ

1

В коде теста

if sol[16] + sol[20] == 2: 

сравнивает сумму двух чисел с плавающей запятой с целым числом, используя равенство. Даже если вы объявляете переменные решения целыми, значения решения представляют собой числа с плавающей запятой. Номерам с плавающей запятой даже не нужно иметь целочисленные значения. Gurobi имеет параметр IntFeasTol, который определяет, насколько далекое значение может быть от 0 или 1 и все еще считаться двоичным. Значение по умолчанию - 1e-5, поэтому 0.999991 будет считаться целым числом. Ваш чек должен быть примерно

if sol[16] + sol[20] > 1.5: 
Смежные вопросы