callback - Julia JUMP Gurobi MIP - 查询并存储最佳目标并在运行时绑定(bind)

标签 callback julia gurobi mixed-integer-programming julia-jump

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

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

但是,我还没有找到 Julia 通过 JuMP 调用 Gurobi 的有效解决方案。 我知道必须使用回调函数(例如 this suggestion 甚至 main documentation here ),但我不完全理解它们是如何工作的以及实现我的目标所必需的。

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

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

最佳答案

您需要使用 C API。以下是 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

附:请更新到 Julia 1.6 和 JuMP 0.22。我还没有测试过这是否适用于旧版本。

关于callback - Julia JUMP Gurobi MIP - 查询并存储最佳目标并在运行时绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70218442/

相关文章:

javascript - 如何调用存储在深度不确定的变量中的函数

java - Gurobi - 构建约束时出现问题(Java)

javascript - 在我做某事之前,如何确保 X 个 XHR 回调已触发并完成?

javascript - Javascript 对象中的函数数组

Julialang 告诉 ERROR : UndefVarError: Pkg not defined

floating-point - Julia 浮点运算的解决方法?

linear-programming - 混合整数线性规划中的整数除法

java - 在 Gurobi 中求解混合整数二次规划 (MIQP) 的问题

javascript - 检查函数是否正在使用回调或返回值

rust - Julia 和 Rust 之间的交互