我不确定我是否正确地对约束建模。我的模型中有链式计算,这意味着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
索引值都用0初始化了z
,t
和r
。这对我来说似乎不合逻辑。我希望只初始化w[r,0]
,然后将其余值的计算链接起来。
但是,似乎链计算没有执行,变量v
和z
没有更新,始终保持不变。
我的方法有什么问题?我应该使用model.power_flow
和model.weight_flow
而不是model.v
和model.z
吗?如果是这样,任何示例都将有所帮助。谢谢。
答案 0 :(得分:0)
永远不要在约束表达式中使用.value
。这导致变量的当前值在表达式中使用,而不是在变量本身中使用,即,当变量的值更改时,表达式将不会更新。即使删除了.value
,约束也只有在将模型发送到求解器后才能满足。这意味着您必须独立地初始化每个变量,没有用于“链接”初始化计算的自动化基础结构。