获取线性pyomo约束的系数

时间:2018-02-12 15:17:50

标签: python mathematical-optimization pyomo

我想获得pyomo模型c的线性约束m的系数。

例如,

    m= ConcreteModel()
    m.x_1 = Var()
    m.x_2 = Var()
    m.x_3 = Var(within = Integers)
    m.x_4 = Var(within = Integers)
    m.c= Constraint(expr=2*m.x_1 + 5*m.x_2 + m.x_4 <= 2)

我想获得数组c_coef = [2,5,0,1]

this question的答案解释了如何获得线性约束中出现的所有变量,我可以很容易地使用它来为不在约束中出现的变量创建零系数。但是,我正在努力使用非零系数。我当前的方法使用私有属性_coef,即c_nzcoef = m.c.body._coef,我可能不应该使用它。

获得非零系数的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

获取线性表达式系数的最简单方法是使用“Canonical Representation”数据结构:

from pyomo.repn import generate_canonical_repn
# verify that the expression is linear
if m.c.body.polynominal_degree() == 1:
    repn = generate_canonical_repn(m.c.body)
    for i, coefficient in enumerate(repn.linear or []):
        var = repn.variables[i]

这应该适用于从4.0到至少5.3的任何Pyomo版本。