julia - 如何通过函数在 Julia 中设置 Gurobi 环境?

标签 julia gurobi

我正在尝试使用论文中的代码,但是这些天 gurobi 的代码似乎发生了变化,它显示了一些错误,我想将下面的 gurobi 环境设置放入我的优化中。

gurobi环境设置如下:

function setup_gurobi_env(; quiet_mode = true, method_type = :barrier, use_time_limit = true, time_limit = 60.0)
    env = Gurobi.Env()

    if quiet_mode
        setparams!(env; OutputFlag = 0)
    end

    if method_type == :barrier
        setparams!(env; Method = 2)
    elseif method_type == :method3
        setparams!(env; Method = 3)
    elseif method_type != :default
        error("Enter a valid method type for Gurobi.")
    end

    if use_time_limit
        setparams!(env; TimeLimit = time_limit)
    end

    return env
end

论文作者使用以下方法来使用此设置:

function portfolio_simplex_jump_setup(Sigma::Matrix{Float64}, gamma::Float64; gurobiEnv = setup_gurobi_env(method_type = :default, use_time_limit = false))
    (d, d2) = size(Sigma)

    if d != d2
        error("Sigma dimensions don't match")
    end

    mod = Model(with_optimizer(Gurobi.Optimizer, gurobiEnv))
    @variable(mod, w[1:d] >= 0)
    @constraint(mod, sum(w[i] for i = 1:d) <= 1)
    @constraint(mod, w'*Sigma*w <= gamma)

    function local_portfolio_oracle(c::Vector{Float64})
        @objective(mod, Min, dot(c, w))

        optimize!(mod)
        z_ast = objective_value(mod)
        w_ast = value.(w)

        return (z_ast, w_ast)
    end

    return c -> local_portfolio_oracle(c)
end

我将函数更改为这个,但由于我的编码太旧,它仍然显示无法使用 gurobi 的错误。

function portfolio_simplex_jump_setup(; gurobiEnv = setup_gurobi_env(method_type = :default, use_time_limit = false))

    mod = Model(Gurobi.Optimizer)
    @variable(mod, 0 <=w[1:d] <= 1)
    @constraint(mod, sum(w[i] for i = 1:d) <= 3)
  

    function local_portfolio_oracle(c::Vector{Float64})
        @objective(mod, Min, dot(c, w))

        optimize!(mod)
        z_ast = objective_value(mod)
        w_ast = value.(w)

        return (z_ast, w_ast)
    end

    return c -> local_portfolio_oracle(c)
end

我认为问题出在这里

mod = Model(with_optimizer(Gurobi.Optimizer, gurobiEnv))

也许gurobi只是上传新的编码方法?

谢谢所有回复我的人~

最佳答案

这是当前使用 Gurobi 的模式(取 self 的学术代码之一):

const GRB_ENV = Gurobi.Env()
m = Model(()->Gurobi.Optimizer(GRB_ENV))
set_optimizer_attribute(m, "OutputFlag", 0)
set_optimizer_attribute(m, "TimeLimit", 100)
set_optimizer_attribute(m, "MIPGap", 0.001)
set_optimizer_attribute(m, "Threads", min(length(Sys.cpu_info()),16))

关于julia - 如何通过函数在 Julia 中设置 Gurobi 环境?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72380071/

相关文章:

python - PuLP 和 OR-Tools 替代品

java - 如何在Gurobi中编写以下目标函数?

julia - 在 Julia 的稀疏矩阵中有效地插入对角线

matrix - Julia 中矩阵列的平均值

julia - 显示来自 repl 的函数源代码

gurobi - 什么是新变量的目标系数

python - gurobi 6.0.2/setPWLObj 的分段线性目标崩溃

python - Gurobi Python == 和变量

python-3.x - Julia 的 reshape

arrays - Julia:三维数组(性能)