如何为 Pyomo 设置类似于 GAMS 循环索引的东西

How do set up something similar to GAMS' circular indexing for Pyomo

我正在研究一个 pyomo 约束,它在第一个循环中有一个规则,可以根据最后一个循环进行一些计算。所以对于 T = 24,每个循环是:

def const1(model,t):
    return model.x[t] == model.x[t - 1] + ef_H * model.d[t] - model.g[t]
model.x_const = Constraint(T, rule=const1)

然而,在第一个循环中,我希望它使用上一个循环的值并进行计算,如下所示:

def const1(model,t):
    if t == 0:
          return model.x[t] == model.x[24] + ef_H * model.d[t] - model.g[t]
    return model.x[t] == model.x[t - 1] + ef_H * model.d[t] - model.g[t]
model.x_const = Constraint(T, rule=const1)

我知道在 GAMS 中,有 -- 命令,您可以设置如下内容:

model.x[t] == model.x[t -- 1] + ef_H * model.d[t] - model.g[t]

它将使用最后一个值 (t = 24) 来计算您的初始 model.x[t]。 pyomo 中有没有简单的方法可以做到这一点?

非常感谢您的帮助!

好吧,当您执行 t-1 时,您是在对索引进行“数学运算”,这意味着集合 T 的元素是连续的整数。如果集合 T 包含字母或颜色或其他任何内容,它将不起作用。我不确定 GAMS 在这种情况下会做什么。一般来说,集合没有任何顺序。您 可以 pyomo 中使用有序集合,这将允许您通过索引访问集合元素,但这在这里可能没有太大帮助。我认为你现在的方式很好,但你可以做...

In [23]: m = ConcreteModel()                                                              

In [24]: a = ['A', 'B', 'C']   # just to show it w/ string values                         

In [25]: m.T = Set(ordered=True, initialize=a)                                            

In [26]: m.T[1]   #pyomo ordered sets are 1-indexed !!!!!                                 
Out[26]: 'A'

In [27]: m.T[-1]  #python standard for getting the last value in an interable             
Out[27]: 'C'

In [28]: # introduce m.x ...                                                              

In [29]: m.x = Var(m.T)                                                                   

In [30]: m.x[m.T[-1]]  # ref to the last value...                                         
Out[30]: <pyomo.core.base.var._GeneralVarData at 0x7fc233189040>

我假设 T 是模型中称为 'T' 的集合的元素列表。您需要将此集合定义为 ordered 才能使其生效。然后你可以使用 pyomo Set.prevw 方法,它给你一个集合的前一个成员,如果需要的话换行。我还建议将该集合定义为模型的一部分,而不是自由浮动的对象。

因此您可以像这样编写相当简单的代码:

model.T = Set(initialize=T, ordered=True)

def const1(model, t):
    return model.x[t] == model.x[model.T.prevw(t)] + ef_H * model.d[t] - model.g[t]
model.x_const = Constraint(model.T, rule=const1)