一个变量有多个索引的pyomo约束可能吗



有没有一种方法可以在一个约束内将多个索引设置为一个集值,而不必为每个索引时间键入相同的变量。我举了一个例子,想象一下你想优化何时给你的电动汽车充电,但你不希望它在一天中的特定时间充电。以下示例可避免在第4小时和第5小时充电。然而,如果我想让它一天中15个小时不充电,但又不想写m.EVcharge[0]+m.EVcharge[1]+……把m.EVcharce[:15]==0写出来会不起作用,因为这些限制在pyomo中不能很好地处理切片。

def time_rule(m):
return  m.EVcharge[4]+m.EVcharge[5] == 0
m.time_rule = Constraint(time, rule=time_rule)

是。有多种方法可以做到这一点。您可以使m.time的子集和将该子集传递给约束规则,约束规则将约束它们为零,或者在子集之间求和并将其约束为零(两者都假设不可能进行负充电(

或者,您可以更干净地使用数据或参数来实现这一点,该数据或参数保持任何任意时间块的限制,并使用它,从而将数据与模型分离,这通常是一个好主意。。。

import pyomo.environ as pyo
# some background data on limits...
use_limit = {   0:3,    # limited juice avial
1:3,
2:0,    # no juice avail.  :)
3:0}
m = pyo.ConcreteModel('EV Charge')
m.T = pyo.Set(initialize=range(6))
m.EV_charge = pyo.Var(m.T, domain=pyo.NonNegativeReals)
# Constraints
def charge_limit(m, time):
return m.EV_charge[time] <= use_limit[time]
m.C1 = pyo.Constraint(use_limit.keys(), rule=charge_limit)
m.pprint()

收益率:

2 Set Declarations
C1_index : Size=1, Index=None, Ordered=False
Key  : Dimen : Domain : Size : Members
None :     1 :    Any :    4 : {0, 1, 2, 3}
T : Size=1, Index=None, Ordered=Insertion
Key  : Dimen : Domain : Size : Members
None :     1 :    Any :    6 : {0, 1, 2, 3, 4, 5}
1 Var Declarations
EV_charge : Size=6, Index=T
Key : Lower : Value : Upper : Fixed : Stale : Domain
0 :     0 :  None :  None : False :  True : NonNegativeReals
1 :     0 :  None :  None : False :  True : NonNegativeReals
2 :     0 :  None :  None : False :  True : NonNegativeReals
3 :     0 :  None :  None : False :  True : NonNegativeReals
4 :     0 :  None :  None : False :  True : NonNegativeReals
5 :     0 :  None :  None : False :  True : NonNegativeReals
1 Constraint Declarations
C1 : Size=4, Index=C1_index, Active=True
Key : Lower : Body         : Upper : Active
0 :  -Inf : EV_charge[0] :   3.0 :   True
1 :  -Inf : EV_charge[1] :   3.0 :   True
2 :  -Inf : EV_charge[2] :   0.0 :   True
3 :  -Inf : EV_charge[3] :   0.0 :   True

最新更新