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

时间:2019-06-13 20:54:02

标签: python pyomo

我不确定我是否正确地对约束建模。我的模型中有链式计算,这意味着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)

以前,我对所有wv索引值都用0初始化了ztr。这对我来说似乎不合逻辑。我希望只初始化w[r,0],然后将其余值的计算链接起来。

但是,似乎链计算没有执行,变量vz没有更新,始终保持不变。 我的方法有什么问题?我应该使用model.power_flowmodel.weight_flow而不是model.vmodel.z吗?如果是这样,任何示例都将有所帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

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