全部的
我想创建一组约束,如下所示:
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。有些事情会不同吗?
谢谢!
线索在于你的约束是在一个集合上定义的。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])
,上述约束仍然可以正常工作