Julia JUMP Gurobi MIP - 查询和存储最佳 objective 并在运行时绑定

Julia JUMP Gurobi MIP - query and store best objective and bound at runtime

我正在通过 Julia 中的 JuMP 包使用 Gurobi 来求解混合整数程序。

我想获取图表 like this one,其中还提供了基于 Python 的解决方案(也已在 Gurobi community form).

但是,我还没有找到 Julia 通过 JuMP 调用 Gurobi 的可行解决方案。 我了解必须使用回调函数(例如 this suggestion or even the main documentation here),但我不完全了解它们的工作原理以及实现我的目标所必需的东西。

非常感谢任何帮助,以及回调函数在每个步骤中所做的可能的描述。

如果有帮助,我正在使用 Gurobi (v.9.0.0)、JuMP (v0.20.1)、MathOptInterface (v0.9.22) 和 Julia (v.1.3.0)。

你需要使用CAPI。以下是 Eli 在 Gurobi 论坛上的回答翻译:

using JuMP, Gurobi
model = direct_model(Gurobi.Optimizer())
N = 30
@variable(model, x[1:N], Bin)
@constraint(model, rand(N)' * x  <= 10)
@objective(model, Max, rand(N)' * x)
data = Any[]
start_time = 0.0
function my_callback_function(cb_data, cb_where::Cint)
    @show cb_where
    if cb_where == GRB_CB_MIP
        objbst = Ref{Cdouble}()
        GRBcbget(cb_data, cb_where, GRB_CB_MIP_OBJBST, objbst)
        objbnd = Ref{Cdouble}()
        GRBcbget(cb_data, cb_where, GRB_CB_MIP_OBJBND, objbnd)    
        push!(data, (time() - start_time, objbst[], objbnd[]))
    end
    return
end
MOI.set(model, Gurobi.CallbackFunction(), my_callback_function)
start_time = time()
optimize!(model)
open("data.csv", "w") do io
    for x in data
        println(io, join(x, ", "))
    end
end

p.s。请更新至 Julia 1.6 和 JuMP 0.22。我还没有测试这是否适用于旧版本。