您需要使用 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。我还没有测试这是否适用于旧版本。