如何在 Pyomo 模型中定义链式计算?
How to define chained calculations in Pyomo model?
我不确定我是否正确地对约束进行了建模。我的模型中有链式计算,这意味着 balance_equation
应该使用先前计算的 power_rule
和 weight_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)
之前,我将 w
、v
和 z
的所有 t
和 r
索引值初始化为 0。这对我来说似乎不合逻辑。我希望只初始化 w[r,0]
,然后应该链接其余值的计算。
但是好像没有执行链式计算,变量v
和z
也没有更新,一直保持不变。
我的方法有什么问题?我应该使用 model.power_flow
和 model.weight_flow
而不是 model.v
和 model.z
吗?如果是这样,任何例子都会有所帮助。谢谢。
永远不要在约束表达式中使用 .value
。这会导致在表达式中使用变量的当前值而不是变量本身,即当变量值更改时,表达式将不会更新。即使在删除 .value
、 之后,约束也只有在将模型发送到求解器 后才会得到满足。这意味着您必须独立初始化每个变量,没有用于 "chaining" 初始化计算的自动化基础设施。
我不确定我是否正确地对约束进行了建模。我的模型中有链式计算,这意味着 balance_equation
应该使用先前计算的 power_rule
和 weight_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)
之前,我将 w
、v
和 z
的所有 t
和 r
索引值初始化为 0。这对我来说似乎不合逻辑。我希望只初始化 w[r,0]
,然后应该链接其余值的计算。
但是好像没有执行链式计算,变量v
和z
也没有更新,一直保持不变。
我的方法有什么问题?我应该使用 model.power_flow
和 model.weight_flow
而不是 model.v
和 model.z
吗?如果是这样,任何例子都会有所帮助。谢谢。
永远不要在约束表达式中使用 .value
。这会导致在表达式中使用变量的当前值而不是变量本身,即当变量值更改时,表达式将不会更新。即使在删除 .value
、 之后,约束也只有在将模型发送到求解器 后才会得到满足。这意味着您必须独立初始化每个变量,没有用于 "chaining" 初始化计算的自动化基础设施。