关于model.optimize()和model.feasRelaxS(1,True,False,True)输出的混淆

时间:2018-10-11 16:37:20

标签: python gurobi mixed-integer-programming

我已经模拟了MILP问题。

执行代码时

grant all on my_view to my_schema
  

输出看起来像这样:

m.Optimize()

但是在执行以下代码时:

Optimize a model with 798001 rows, 312006 columns and 2117780 nonzeros
Variable types: 1920 continuous, 310086 integer (310080 binary)
Coefficient statistics:
 Matrix range [3e-01, 2e+04]
 Objective range [1e-01, 9e+02]
 Bounds range [1e+00, 3e+04]
 RHS range [3e-01, 3e+04]
Presolve removed 725090 rows and 191031 columns
Presolve time: 3.22s

Explored 0 nodes (0 simplex iterations) in 3.59 seconds
Thread count was 1 (of 8 available processors)

Solution count 0

Model is infeasible
Best objective -, best bound -, gap -
  

输出看起来像这样:

copy1 = m.copy()

if m.status == GRB.INFEASIBLE:
 copy1.feasRelaxS(1, True, False, True)
 copy1.optimize()

此处指定模型具有二次目标项。

有人可以指导我这两者之间到底有什么区别吗?以及为什么给模型具有二次项?

1 个答案:

答案 0 :(得分:1)

您使用参数feasRelaxS调用(1, True, False, True)docs说:

  

feasRelaxS(relaxobjtype,minrelax,vrelax,crelax)

     

如果指定relaxobjtype = 1,则可行性放宽的目的是使边界违规和约束违规的平方和最小。

因此,平方和不是线性的,因此Gurobi需要使用一些非线性求解方法。如果是QP或SOCP或其他任何东西,那都是Gurobi的决定。

在这里引入这些二次项:边界和约束违规的平方和

输出:

Found heuristic solution: objective 3.169464e+24

我还想说,您的模型似乎还远未可行。

编辑:也许不是。作为非古罗比用户,我的印象是最终的。但是您调整了输出,这只是一个早期的启发式结果,我们目前无法对未知的最终结果说太多!

有关它在做什么的一般问题由文档句子回答:

  

可行性松弛是一个模型,当求解时,它使解决方案违反原始模型的范围和线性约束的数量最小化

含义:您不再关心最初的目标,而是关心一个新的目标,该目标表示违反约束和变量界限的某种解决方案。

(旁注:所有这些都在文档中进行了解释,说实话:在我看来,与某些竞争对手相比,Gurobi的文档非常好!因此请使用它,并且不要在不知道函数运行的情况下调用函数)< / p>