访问 pyomo 约束中出现的所有变量

Access all variables occurring in a pyomo constraint

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

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

我想进行一个查询(如 model.con1.variables ),其中 returns (列表)变量 ([model.x_1,model.x_2]).

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

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

请注意,已经提出了一个类似但不太详细且未回答的问题 here

model.con1.body._args 给你这个变量列表。

您不想直接查询 model.con1.body 返回的表达式的 _args 属性。以下划线开头的方法和属性被认为是 private,一般用户不应使用(它们没有记录,如有更改,恕不另行通知或弃用警告)。其次,_args 属性仅 returns 表达式树中该节点的子节点。对于线性表达式,这些变量很可能是变量,但不能保证。对于非线性表达式(和一般表达式),_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))