首页 > 解决方案 > 如何为 Pyomo 设置类似于 GAMS 的循环索引

问题描述

我正在研究一个 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 中是否有一种简单的方法可以实现这一点?

非常感谢您的帮助!

标签: pythonpython-3.xpyomogams-math

解决方案


我假设T是模型中称为集合的元素列表'T'。您将需要定义此集合ordered以使其工作。然后您可以使用 pyomoSet.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)

推荐阅读