Matrix 如何使用Julia中的跳跃提取优化问题矩阵A、b、c

Matrix 如何使用Julia中的跳跃提取优化问题矩阵A、b、c,matrix,optimization,julia,julia-jump,Matrix,Optimization,Julia,Julia Jump,我在Julia JuMP中使用符号变量和约束创建了一个优化模型,如下图所示 using JuMP using CPLEX # model Mod = Model(CPLEX.Optimizer) # sets I = 1:2; # Variables x = @variable( Mod , [I] , base_name = "x" ) y = @variable( Mod , [I] , base_name = "y" ) # cons

我在Julia JuMP中使用符号变量和约束创建了一个优化模型,如下图所示

using JuMP
using CPLEX

# model
Mod = Model(CPLEX.Optimizer) 

# sets
I = 1:2;

# Variables
x = @variable( Mod , [I] , base_name = "x" ) 
y = @variable( Mod , [I] , base_name = "y" )  

# constraints
Con1 = @constraint( Mod , [i in I] , 2 * x[i] + 3 * y[i] <= 100 )

# objective
ObjFun = @objective( Mod , Max , sum( x[i] + 2 * y[i] for i in I) ) ;

# solve 
optimize!(Mod)
在MATLAB中,函数prob2struct可以做到这一点


有一个跳转函数可以做到这一点?

据我所知,这不容易做到

问题存储在底层MathOptiInterface MOI特定的数据结构中。例如,约束始终存储为MOI.AbstractFunction-in-MOI.AbstractSet。MOI.ObjectiveFunction也是如此。参见MOI文档:

但是,您可以尝试以矩阵向量形式重新计算目标函数项和约束

例如,假设您仍然拥有JuMP.Model Mod,您可以通过键入以下内容更仔细地检查目标函数:

using MathOptInterface
const MOI = MathOptInterface

# this only works if you have a linear objective function (the model has a ScalarAffineFunction as its objective)
obj = MOI.get(Mod, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}())

# take a look at the terms 
obj.terms
# from this you could extract your vector c
c = zeros(4)
for term in obj.terms
    c[term.variable_index.value] = term.coefficient
end
@show(c)
这确实给出了:c=[1.;1.;2.;2.]

您可以对底层MOI.constraints执行类似的操作

在本例中,我们只有一种类型的约束,即MOI.LessThan{Float64}中的MOI.ScalarAffineFunction{Float64}

您将在数组ci中存储两个约束索引,因为此组合F-in-S有两个约束。 让我们仔细检查其中的第一个:

ci1 = ci[1]
# to get the function and set corresponding to this constraint (index):
moi_backend = backend(Mod)
f = MOI.get(moi_backend, MOI.ConstraintFunction(), ci1)
f也是MOI.ScalarAffineFunction类型,它对应于A=[a1;…;am]矩阵中的一行a1。该行由以下公式给出:

a1 = zeros(4)
for term in f.terms
    a1[term.variable_index.value] = term.coefficient
end
@show(a1) # gives [2.0 0 3.0 0] (the first row of your A matrix)
要获得b=[b1;…;bm]向量对应的第一个条目b1,必须查看同一约束索引ci1的约束集:

我希望这能让您直观地了解数据是如何以MathOptiInterface格式存储的


您必须对所有约束和所有约束类型执行此操作,并将它们堆叠为约束矩阵A和向量b中的行。

据我所知,这不容易实现

问题存储在底层MathOptiInterface MOI特定的数据结构中。例如,约束始终存储为MOI.AbstractFunction-in-MOI.AbstractSet。MOI.ObjectiveFunction也是如此。参见MOI文档:

但是,您可以尝试以矩阵向量形式重新计算目标函数项和约束

例如,假设您仍然拥有JuMP.Model Mod,您可以通过键入以下内容更仔细地检查目标函数:

using MathOptInterface
const MOI = MathOptInterface

# this only works if you have a linear objective function (the model has a ScalarAffineFunction as its objective)
obj = MOI.get(Mod, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}())

# take a look at the terms 
obj.terms
# from this you could extract your vector c
c = zeros(4)
for term in obj.terms
    c[term.variable_index.value] = term.coefficient
end
@show(c)
这确实给出了:c=[1.;1.;2.;2.]

您可以对底层MOI.constraints执行类似的操作

在本例中,我们只有一种类型的约束,即MOI.LessThan{Float64}中的MOI.ScalarAffineFunction{Float64}

您将在数组ci中存储两个约束索引,因为此组合F-in-S有两个约束。 让我们仔细检查其中的第一个:

ci1 = ci[1]
# to get the function and set corresponding to this constraint (index):
moi_backend = backend(Mod)
f = MOI.get(moi_backend, MOI.ConstraintFunction(), ci1)
f也是MOI.ScalarAffineFunction类型,它对应于A=[a1;…;am]矩阵中的一行a1。该行由以下公式给出:

a1 = zeros(4)
for term in f.terms
    a1[term.variable_index.value] = term.coefficient
end
@show(a1) # gives [2.0 0 3.0 0] (the first row of your A matrix)
要获得b=[b1;…;bm]向量对应的第一个条目b1,必须查看同一约束索引ci1的约束集:

我希望这能让您直观地了解数据是如何以MathOptiInterface格式存储的


您必须对所有约束和所有约束类型执行此操作,并将它们作为行堆叠在约束矩阵A和向量b中。

我自己没有尝试过。但是MathProgBase包似乎能够以矩阵形式提供A、b和c。

我自己没有尝试过。但是MathProgBase软件包似乎能够以矩阵形式提供A、b和c。

您也可以使用JuMP.objective\u functionmodel和JuMP.constraint\u objectcon代替MOI.get函数。非常感谢您的全面回答。事实上,解决方案并不简单,但确实有效。您也可以使用JuMP.objective\u functionmodel和JuMP.constraint\u objectcon代替MOI.get函数。非常感谢您的全面回答。事实上,解决方案并不简单,但确实有效。
s = MOI.get(moi_backend, MOI.ConstraintSet(), ci1)
@show(s) # MathOptInterface.LessThan{Float64}(100.0)
b1 = s.upper