如何从 JuMP/Gurobi 获取基本变量列表?
How to get list of basic variables from JuMP/Gurobi?
我正在 Julia/JuMP 中使用 Gurobi 作为求解器求解 LP。我想知道我的解决方案中哪些变量是基本的。我如何获得这些信息?
仅仅检查哪些变量非零是不够的,因为我们可能正在处理一个退化的解决方案(即基本变量等于零)。
我在网上发现了两个类似的问题,但建议的解决方案似乎不再适用于当前版本的 JuMP(或者我遗漏了什么?):
- https://discourse.julialang.org/t/how-to-obtain-a-basic-solution/1784
- https://groups.google.com/g/julia-opt/c/vJ6QuFBfPbw?pli=1
有一个名为 VBasis
(https://www.gurobi.com/documentation/9.0/refman/vbasis.html) 的 Gurobi 属性似乎是我要找的,但我不知道如何访问它。
这没有很好的记录,但你可以看到哪些约束是基本的:
model = Model(Gurobi.Optimizer)
@variable(model, x >= 0)
@constraint(model, c, 2x >= 1)
@objective(model, Min, x)
optimize!(model)
julia> MOI.get(model, MOI.ConstraintBasisStatus(), c)
NONBASIC::BasisStatusCode = 1
julia> MOI.get(model, MOI.ConstraintBasisStatus(), LowerBoundRef(x))
BASIC::BasisStatusCode = 0
请注意,由于变量可以有下限和上限,我们报告哪些约束是基本的,而不是哪些变量是。
文档:
https://jump.dev/MathOptInterface.jl/stable/apireference/#MathOptInterface.ConstraintBasisStatus
https://jump.dev/MathOptInterface.jl/stable/apireference/#MathOptInterface.BasisStatusCode
我正在 Julia/JuMP 中使用 Gurobi 作为求解器求解 LP。我想知道我的解决方案中哪些变量是基本的。我如何获得这些信息?
仅仅检查哪些变量非零是不够的,因为我们可能正在处理一个退化的解决方案(即基本变量等于零)。
我在网上发现了两个类似的问题,但建议的解决方案似乎不再适用于当前版本的 JuMP(或者我遗漏了什么?):
- https://discourse.julialang.org/t/how-to-obtain-a-basic-solution/1784
- https://groups.google.com/g/julia-opt/c/vJ6QuFBfPbw?pli=1
有一个名为 VBasis
(https://www.gurobi.com/documentation/9.0/refman/vbasis.html) 的 Gurobi 属性似乎是我要找的,但我不知道如何访问它。
这没有很好的记录,但你可以看到哪些约束是基本的:
model = Model(Gurobi.Optimizer)
@variable(model, x >= 0)
@constraint(model, c, 2x >= 1)
@objective(model, Min, x)
optimize!(model)
julia> MOI.get(model, MOI.ConstraintBasisStatus(), c)
NONBASIC::BasisStatusCode = 1
julia> MOI.get(model, MOI.ConstraintBasisStatus(), LowerBoundRef(x))
BASIC::BasisStatusCode = 0
请注意,由于变量可以有下限和上限,我们报告哪些约束是基本的,而不是哪些变量是。
文档: https://jump.dev/MathOptInterface.jl/stable/apireference/#MathOptInterface.ConstraintBasisStatus https://jump.dev/MathOptInterface.jl/stable/apireference/#MathOptInterface.BasisStatusCode