首页 文章

访问pyomo约束中发生的所有变量

提问于
浏览
1

我正在研究python中需要修改具体(混合整数非线性)pyomo模型的算法 . 特别是,我需要知道 general algebraic constraint 中存在哪些变量 . 例如 . 对于约束

model.con1 = Constraint(expr=exp(model.x_1) + 2*model.x_2 <= 2)

我想做一个查询(如 model.con1.variables ),它返回(列表)变量( [model.x_1,model.x_2] ) .

this documentation中,我发现对于 linear 约束,参数 variables 完全符合我的目的 . 但是,我正在使用的模型也将包含一般的代数约束 .

Chapter 14 of this book提供了使用pyomo开发高级算法的几个细节,但我没有在那里找到我的问题的答案 . 我能想到的唯一非常笨拙的方法是使用表达式的to_string()方法(在我们的示例中返回 exp( x_1 ) + x_2 <= 1.0 ),然后搜索此字符串以查找所有变量的外观 . 我确信有一种更好的方法可以使用pyomo来访问约束中出现的变量 .

请注意,已经有人问过类似但不太详细且没有答案的问题here .

2 回答

  • 3

    您不希望直接查询 model.con1.body 返回的表达式的 _args 属性 . 以下划线开头的方法和属性被认为是私有的,一般用户不应该使用它们(它们没有文档,可能会发生变化而不会发出通知或弃用警告) . 其次, _args 属性仅返回表达式树中该节点的子节点 . 对于线性表达式,它们很可能是变量,但不能保证 . 对于非线性表达式(和通用表达式), _args 的成员几乎可以保证是其他表达式对象 .

    您可以使用 identify_variables 生成器获取出现在任何Pyomo表达式中的变量:

    from pyomo.environ import *
    from pyomo.core.base.expr import identify_variables
    
    m = ConcreteModel()
    m.x_1 = Var()
    m.x_2 = Var()
    m.c = Constraint(expr=exp(model.x_1) + 2*model.x_2 <= 2)
    vars = list(identify_variables(m.c.body))
    
  • 0

    model.con1.body._args 只给出了这个变量列表 .

相关问题