【问题标题】:How can I determine whether a JuMP model solved by Gurobi is a MIP?如何确定 Gurobi 求解的 JuMP 模型是否为 MIP?
【发布时间】: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


【解决方案1】:

不幸的是,有几件事情正在发生,共同造成了您的问题。

1) JuMP 的“优化器属性”对应于 Gurobi 的“参数”。所以你只能使用get/set_optimizer_attribute 来查询公差之类的东西。这就是为什么您可以查询MIPGap(Gurobi 参数),但不能查询IsMIP(Gurobi 模型属性)的原因。

2) 不用担心,因为您应该能够访问 Gurobi 模型属性(和变量/约束属性),如下所示:

MOI.get(model, Gurobi.ModelAttribute("IsMIP"))

3) 但是,堆栈中的某处似乎存在错误,这意味着我们在尝试从 JuMP 转到 Gurobi 时错误地重定向了调用。作为一种解决方法,您可以使用

MOI.get(backend(model).optimizer, Gurobi.ModelAttribute("IsMIP"))

我已经提交了一个问题,以便在以后的版本中解决这个问题 (https://github.com/JuliaOpt/MathOptInterface.jl/issues/1092)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 2021-11-19
    相关资源
    最近更新 更多