如何在 Pyomo 模型中定义链式计算?

How to define chained calculations in Pyomo model?

我不确定我是否正确地对约束进行了建模。我的模型中有链式计算,这意味着 balance_equation 应该使用先前计算的 power_ruleweight_rule 的值。请参阅下面的简化示例。

def power_rule(model, r, t):
    return model.v[r,t] == 25*model.x[r,t].value
model.power_flow = Constraint(model.R, model.T, rule=power_rule)

def weight_rule(model, r, t):
    return model.z[r,t] == 5*model.x[r,t].value
model.weight_flow = Constraint(model.R, model.T, rule=weight_rule)

def balance_equation(model, r, t):
    if t == 0:
        return Constraint.Skip
    return model.w[r,t] == model.w[r,t-1].value + model.v[r,t] - model.z[r,t].value
model.flow = Constraint(model.R, model.T, rule=balance_equation)

之前,我将 wvz 的所有 tr 索引值初始化为 0。这对我来说似乎不合逻辑。我希望只初始化 w[r,0],然后应该链接其余值的计算。

但是好像没有执行链式计算,变量vz也没有更新,一直保持不变。 我的方法有什么问题?我应该使用 model.power_flowmodel.weight_flow 而不是 model.vmodel.z 吗?如果是这样,任何例子都会有所帮助。谢谢。

永远不要在约束表达式中使用 .value。这会导致在表达式中使用变量的当前值而不是变量本身,即当变量值更改时,表达式将不会更新。即使在删除 .value 之后,约束也只有在将模型发送到求解器 后才会得到满足。这意味着您必须独立初始化每个变量,没有用于 "chaining" 初始化计算的自动化基础设施。