在python-Gurobi接口中添加惰性约束

Adding lazy constraint in python-Gurobi interface

我正在尝试向随机规划问题的第一阶段添加一些惰性约束。例如,最佳解决方案显示位置 16 和 20 是一起选择的,我不想这样做,所以我想添加一个惰性约束,如下所示:

   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还在最优解中。你能告诉我应该如何解决这个问题吗?

在您的代码中,测试

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

正在使用相等性将两个浮点数的总和与一个整数进行比较。即使您将决策变量声明为整数,解决方案值也是浮点数。浮点数甚至不需要整数值。 Gurobi 有一个参数 IntFeasTol,它决定了一个值在距离 0 或 1 多远时仍然被认为是二进制的。默认值为 1e-5,因此 0.999991 将被视为整数。您的支票应该类似于

if sol[16] + sol[20] > 1.5: