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()
我想用 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()