【发布时间】:2020-05-20 20:36:07
【问题描述】:
假设,我创建了一个JuMP 模型,将它传递给求解器并检索一个解决方案。现在我想确定Gurobi(即预求解后)求解的模型是否是混合整数程序(MIP)。我需要此信息,因为我想打印解决方案的 MIP 间隙(如果存在)。显然,不一定事先知道,如果 JuMP 模型实际上是 MIP,或者是否所有整数变量都会被 presolve 删除。
这个代码示例创建了一个简单的模型(没有任何整数变量)并解决它:
import JuMP
import Gurobi
model = JuMP.Model(Gurobi.Optimizer)
JuMP.@variable(model, x)
JuMP.@constraint(model, x>=0)
JuMP.@objective(model, Min, x)
JuMP.optimize!(model)
如果问题是(即使在预解决之后)MIP,我可以使用
mip_gap = JuMP.relative_gap(model)
获取 MIP 差距。但在上述情况下(即不是 MIP),它会触发
错误:Gurobi.GurobiError(10005, "无法检索属性 'MIPGap'")
什么也不起作用是
mip_gap = JuMP.get_optimizer_attribute(model, "MIPGap")
因为这会返回用作终止标准的 MIP 间隙(即不是实际解决方案的 MIP 间隙)。
我在 JuMP 和 MathOptInterface 的源代码中没有找到任何直接返回 MIP 间隙的函数。但是,Gurobi 有一个名为 IsMIP 的模型属性,它应该是可访问的。但是
is_mip = JuMP.get_optimizer_attribute(model, "IsMIP")
原因
错误:LoadError:无法识别的参数名称:IsMIP。
我还尝试在Gurobi.jl 中找到解决方案,发现Gurobi 参数“IsMIP”已实现here。还有一个名为is_mip 的函数确实可以满足我的要求。问题是,我不能使用它,因为参数必须是 Gurobi Model,而不是 JuMP 模型。
我能做什么?
【问题讨论】:
-
如何使用 try/catch 构造来处理获取 mipgap 的失败。如果失败,则断定它可能不是 mip。
-
我试过了,但不知怎的,错误没有被捕获,执行仍然停止。
标签: julia gurobi julia-jump