代码之家  ›  专栏  ›  技术社区  ›  Andrey

值错误:约束表达式无效。约束表达式解析为一个简单的布尔值(True),而不是Pyomo对象

  •  0
  • Andrey  · 技术社区  · 11 月前

    我的代码如下:

    import pyomo.environ as pyo
    
    model = pyo.ConcreteModel()
    model.x = pyo.Var(range(2), domain=pyo.Reals)
    model.Constraint2 = pyo.Constraint(expr=sum([x for x in model.x]) >= 0)
    

    我收到错误:

    ValueError: Invalid constraint expression. The constraint expression resolved to a trivial Boolean (True) instead of a Pyomo object
    

    但如果我尝试,错误就会消失:

    model.Constraint2 = pyo.Constraint(expr=model.x[0] + model.x[1] >= 0)
    

    看起来不可能像列表一样迭代变量 pyomo 。对吗?我在文档中找不到它。

    1 回复  |  直到 11 月前
        1
  •  1
  •   niyigena mike    11 月前

    问题源于你如何对变量求和。当你使用sum([x for x in model.x])时,Python实际上是在迭代model.x的索引,而不是Pyomo变量本身。这创建了一个索引的列表理解,它不会解析为有效的Pyomo约束表达式。 在Pyomo中,当你想对变量求和时,你应该使用显式索引或sum()函数来引用实际的变量。以下是定义约束的几种正确方法:

    显式索引(您已经发现它有效):

    pythonCopymodel。约束2=pyo。约束(expr=model.x[0]+model.x[1]>=0)

    使用带有显式变量引用的sum():

    pythonCopymodel。约束2=pyo。约束(expr=sum(model.x.keys()中i的model.x[i])>=0)

    另一种选择:

    pythonCopymodel。约束2=pyo。约束(expr=sum(范围(2)中i的model.x[i])>=0)