【问题标题】:Access all variables occurring in a pyomo constraint访问 pyomo 约束中发生的所有变量
【发布时间】:2018-07-10 08:57:07
【问题描述】:

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

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 已经提出了一个类似但不太详细且未回答的问题。

【问题讨论】:

  • 您为线性约束提供的链接仅适用于kernel 接口。该接口是一种专门的低级编程 API,已被提议用于在编程上下文中有效地生成模型。目前(从 Pyomo 5.3 开始),它不一定适用于“正常”的 Pyomo 模型。

标签: python mathematical-optimization pyomo


【解决方案1】:

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

【讨论】:

  • 有一个未决的表达式系统改造可能会导致此类用法不再按预期运行。
【解决方案2】:

您不想直接查询model.con1.body 返回的表达式的_args 属性。以下划线开头的方法和属性被视为私有,一般用户不应使用(它们未记录在案,如有更改,恕不另行通知或弃用警告)。其次,_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))

【讨论】:

  • 请注意,对于 pyomo 版本 6.x,导入语句类似于:from pyomo.core.expr.current import identify_variables
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
  • 2019-02-02
  • 2018-05-29
相关资源
最近更新 更多