我正在研究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 回答
您不希望直接查询
model.con1.body
返回的表达式的_args
属性 . 以下划线开头的方法和属性被认为是私有的,一般用户不应该使用它们(它们没有文档,可能会发生变化而不会发出通知或弃用警告) . 其次,_args
属性仅返回表达式树中该节点的子节点 . 对于线性表达式,它们很可能是变量,但不能保证 . 对于非线性表达式(和通用表达式),_args
的成员几乎可以保证是其他表达式对象 .您可以使用
identify_variables
生成器获取出现在任何Pyomo表达式中的变量:model.con1.body._args
只给出了这个变量列表 .