我已经模拟了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()
此处指定模型具有二次目标项。
有人可以指导我这两者之间到底有什么区别吗?以及为什么给模型具有二次项?
答案 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>