访问在pyomo约束中出现的所有变量
我正在使用python中的算法,该算法需要修改具体的(混合整数非线性)pyomo模型。特别是,我需要知道在 一般代数约束 中存在哪些变量。例如约束
model.con1 = Constraint(expr=exp(model.x_1) + 2*model.x_2 <= 2)
我想进行一个查询(如model.con1.variables
),该查询返回变量(的列表[model.x_1,model.x_2]
)。
在本文档中,我发现对于
线性 约束,该参数variables
完全可以满足我的目的。但是,我正在使用的模型还将包含一般的代数约束。
本书的第14章提供了一些使用pyomo开发高级算法的详细信息,但是我没有在那找到我的问题的答案。我能想到的唯一非常笨拙的方法是使用表达式的to_string()方法(exp(
x_1 ) + x_2 <= 1.0
在我们的示例中返回),然后在该字符串中搜索所有变量的出现。我敢肯定,使用pyomo可以更好地访问约束中出现的变量。
请注意,此处已经提出了一个类似但不太详细且尚未回答的问题。
-
您不想直接查询由
_args
返回的表达式的属性model.con1.body
。以下划线开头的方法和属性被认为是 私有的
,一般用户不应使用(它们没有文档记录,并且随时可能更改,恕不另行通知或弃用警告)。其次,该_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))