如何从 JuMP/Gurobi 获取基本变量列表?

How to get list of basic variables from JuMP/Gurobi?

我正在 Julia/JuMP 中使用 Gurobi 作为求解器求解 LP。我想知道我的解决方案中哪些变量是基本的。我如何获得这些信息?

仅仅检查哪些变量非零是不够的,因为我们可能正在处理一个退化的解决方案(即基本变量等于零)。

我在网上发现了两个类似的问题,但建议的解决方案似乎不再适用于当前版本的 JuMP(或者我遗漏了什么?):

  1. https://discourse.julialang.org/t/how-to-obtain-a-basic-solution/1784
  2. 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