我通过 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/