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

时间:2018-01-31 09:42:52

标签: python mathematical-optimization 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])。

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

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

请注意,已经提出类似但不太详细且未得到答复的问题here

2 个答案:

答案 0 :(得分:3)

您不希望直接查询_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))

答案 1 :(得分:0)

model.con1.body._args为您提供了这个变量列表。