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

发布于 2021-01-29 16:57:31

我正在使用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可以更好地访问约束中出现的变量。

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

关注者
0
被浏览
50
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看