如何为 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)
我正在研究一个 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)