提问者:小点点

如何通过循环生成约束


全部的

我想创建一组约束,如下所示:

Pg[0]

Pg[1]

Pg[3]

Pg[4]

Pg[5]

我的代码如下:

import pyomo.environ as pyo

model = pyo.ConcreteModel()
Ngen = 5
Pmax = [40, 170, 520, 200, 100]
model.Ngen = pyo.Set(dimen=Ngen)
model.Pg = pyo.Var(model.Ngen)

def Co1(model):
    return ((model.Pg[ii] for ii in model.Ngen) <= (Pmax[jj]  for jj in range(Ngen)))

model.Co1 = pyo.Constraint(rule=Co1)

但是,Python控制台告诉我:

“TypeError:”

我该如何纠正这一点?

另一个问题是,如果Pmax不是一个列表,而是一个numpy ndarray。有些事情会不同吗?

谢谢!


共1个答案

匿名用户

线索在于你的约束是在一个集合上定义的。Pyomo允许您将args传递给定义该约束集的Constraint构造函数。

因此,您的最后一行应该如下所示:

model.Co1 = pyo.Constraint(model.Ngen, rule=Co1)

第二个问题是约束表达式本身。既然这是针对Set定义的,那么您只需要用给定的索引来表达约束(比如i),因为规则还需要与每个的每个索引相关的参数设置Constraint

def Co1(model, i):
    return model.Pg[i] <= Pmax[i]

最后,您要定义的集合是size=5,而不是dimen=5。集合通常是dimen=1,除非您使用的是网络的弧链接,在这种情况下,它们的维度为2。由于集合是在整数上定义的,因此添加集合的最简单方法是通过定义从1到N的所有整数的RangeSet

model.Ngen = pyo.RangeSet(Ngen)

鉴于此,唯一需要更改的是列表Pmax为0索引,因此我们的约束将需要考虑i被1偏移:

import pyomo.environ as pyo

model = pyo.ConcreteModel()
Ngen = 5
Pmax = [40, 170, 520, 200, 100]
model.Ngen = pyo.RangeSet(Ngen)
model.Pg = pyo.Var(model.Ngen)

def Co1(model, i):
    return model.Pg[i] <= Pmax[i - 1]

model.Co1 = pyo.Constraint(model.Ngen, rule = Co1)

model.pprint()

# 1 RangeSet Declarations
#     Ngen : Dim=0, Dimen=1, Size=5, Domain=Integers, Ordered=True, Bounds=(1, 5)
#         Virtual
# 
# 1 Var Declarations
#     Pg : Size=5, Index=Ngen
#         Key : Lower : Value : Upper : Fixed : Stale : Domain
#           1 :  None :  None :  None : False :  True :  Reals
#           2 :  None :  None :  None : False :  True :  Reals
#           3 :  None :  None :  None : False :  True :  Reals
#           4 :  None :  None :  None : False :  True :  Reals
#           5 :  None :  None :  None : False :  True :  Reals
# 
# 1 Constraint Declarations
#     Co1 : Size=5, Index=Ngen, Active=True
#         Key : Lower : Body  : Upper : Active
#           1 :  -Inf : Pg[1] :  40.0 :   True
#           2 :  -Inf : Pg[2] : 170.0 :   True
#           3 :  -Inf : Pg[3] : 520.0 :   True
#           4 :  -Inf : Pg[4] : 200.0 :   True
#           5 :  -Inf : Pg[5] : 100.0 :   True
# 
# 3 Declarations: Ngen Pg Co1

NumPy数组可以以与列表完全相同的方式切片,所以如果您更改Pmax=np.array([40, 170, 520, 200, 100]),上述约束仍然可以正常工作