Chr*_*ann 2 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])。
在本文档中,我发现对于线性约束,该参数variables完全符合我的目的。然而,我正在使用的模型还将包含一般代数约束。
本书的第 14 章提供了使用 pyomo 开发高级算法的一些细节,但我在那里没有找到我的问题的答案。我能想到的唯一非常笨拙的方法是使用表达式的 to_string() 方法(exp( x_1 ) + x_2 <= 1.0在我们的示例中返回),然后搜索该字符串以查找所有变量的出现。我确信有一种更好的方法使用 pyomo 来访问约束中发生的变量。
请注意,这里已经提出了一个类似的但不太详细且未回答的问题。
您不想直接查询_args所返回的表达式的属性model.con1.body。以下划线开头的方法和属性被认为是私有的,一般用户不应该使用它们(它们没有记录,并且可能会在没有通知或弃用警告的情况下进行更改)。其次,该_args属性仅返回表达式树中该节点的子节点。对于线性表达式,这些变量很有可能是变量,但不能保证。对于非线性表达式(和一般表达式), 的成员_args几乎可以保证是其他表达式对象。
您可以使用生成器获取出现在任何 Pyomo 表达式中的变量identify_variables:
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))
Run Code Online (Sandbox Code Playgroud)