Julia JUMP Gurobi MIP — запрос и сохранение наилучшей цели и привязки во время выполнения

#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. Я не проверял, работает ли это в более старой версии.