#callback #julia #gurobi #mixed-integer-programming #julia-jump
#обратный вызов #julia #gurobi #смешанное целочисленное программирование #julia-jump
Вопрос:
Я использую Gurobi через пакет JuMP в Julia для решения программы со смешанным целым числом.
Я хотел бы получить график, подобный этому, где также предоставляется решение, основанное на Python (которое также было рассмотрено в форме сообщества Gurobi).
Однако я не нашел рабочих решений для Джулии, вызывающей Gurobi через JuMP. Я понимаю, что необходимо использовать функции обратного вызова (например, это предложение или даже основную документацию здесь), но я не совсем понимаю, как они работают и что важно для достижения моей цели.
Любая помощь очень ценится, а также возможное описание того, что функция обратного вызова выполняет на каждом шаге.
Если это поможет, я использую Gurobi (v.9.0.0), JuMP (v.0.20.1), MathOptInterface (v.0.9.22) и Julia (v.1.3.0).
Ответ №1:
Вам нужно использовать C API. Вот перевод ответа Эли на форуме 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 и перейдите на 0.22. Я не проверял, работает ли это в более старой версии.