Julia - 使用 MathOptInterface 定义线性规划问题

Julia - Defining a Linear Programming Problem with MathOptInterface

我想用 MatOptInterface 以标准格式写一个 LP 问题,e.i.:

min c'*x
S.t A*x .== b
    x >= 0

现在,如何用 MathOptInterface 来写这个问题?我有很多问题,其中之一是如何定义变量“模型”。例如,如果我尝试 运行:

x = add_variables(model,3)

我首先需要声明这个模型变量。但是我不知道应该如何在 MathOptInterface 上执行此操作。

IIUC 在您的情况下 model 必须是您函数的用户指定的参数。 然后用户可以传递 GLPK.Optimizer()Tulip.Optimizer() 或任何其他继承自 MathOptInterface.AbstractOptimizer 的优化器。 参见例如Manual#A complete example.

或者您可以查看 MOI.Utilities.Model,但我不知道如何获得优化器来求解该模型。

以下是实现标准单纯形格式的 LP 求解器的方法:

function SolveLP(c,A,b,model::MOI.ModelLike)
    x = MOI.add_variables(model, length(c));
    MOI.set(model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(),
                MOI.ScalarAffineFunction(MOI.ScalarAffineTerm.(c, x), 0.0))
    MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE)
    for xi in x
        MOI.add_constraint(model, MOI.SingleVariable(xi), MOI.GreaterThan(0.0))
    end

    for (i,row) in enumerate(eachrow(A))
        row_function = MOI.ScalarAffineFunction(MOI.ScalarAffineTerm.(row, x), 0.0);
        MOI.add_constraint(model, row_function, MOI.EqualTo(b[i]))
    end
    MOI.optimize!(model)
    p = MOI.get(model, MOI.VariablePrimal(), x);
    return p
end

模型选择GLPK.Optimizer()