在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:
我正在尝试向随机规划问题的第一阶段添加一些惰性约束。例如,最佳解决方案显示位置 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: