Parameters Pyomo:如何更新现有模型实例的约束定义?

Parameters Pyomo:如何更新现有模型实例的约束定义?,parameters,model,mutable,pyomo,Parameters,Model,Mutable,Pyomo,我被困在一个问题上,对此我肯定有答案(可能只有一行代码) 我有以下最小模型(从数学上讲这是荒谬的,但它描述了我的问题): 如您所见,changingConstraint的行为取决于mutableParameter的值 现在,当我使用m.create_instance('mydata.dat')创建此模型的实例时,Pyomo会根据创建实例时mutableParameter的值自动决定使用if子句的哪一部分 但是,当我现在更新我的mutableParameter(为非零值)并再次运行模型时,Pyom

我被困在一个问题上,对此我肯定有答案(可能只有一行代码)

我有以下最小模型(从数学上讲这是荒谬的,但它描述了我的问题):

如您所见,changingConstraint的行为取决于mutableParameter的值

现在,当我使用m.create_instance('mydata.dat')创建此模型的实例时,Pyomo会根据创建实例时mutableParameter的值自动决定使用if子句的哪一部分

但是,当我现在更新我的mutableParameter(为非零值)并再次运行模型时,Pyomo不会更新其在约束中对if子句的使用,并且仍然使用原始解释:

from pyomo import *
from pyomo.environ import *

from minimalModel import m

instance = m.create_instance('datafile.dat')

# Run model once with standard values
solver = 'ipopt'
opt = SolverFactory(solver)
results = opt.solve(instance)

# Change the mutableParameter and run the model again
for t in instance.mySet:
    instance.mutableParameter[t] = 99

# --> This is where I seem to be missing some call to update the instance. I've tried instance.preprocess(), that didn't work <--
results = opt.solve(instance)
从pyomo导入*
从pyomo.environ导入*
从最小模型导入
instance=m.create_实例('datafile.dat'))
#使用标准值运行模型一次
解算器='ipopt'
opt=SolverFactory(解算器)
结果=opt.solve(实例)
#更改可变参数并再次运行模型
对于instance.mySet中的t:
实例.可变参数[t]=99

#-->在这里,我似乎错过了一些更新实例的调用。我尝试了instance.preprocess(),但没有成功我已经找到了答案,应该归功于陈琪为我指明了正确的方向

需要做的是在再次评估模型之前重建约束,而不是整个模型

事先,我正在努力

instance.reconstruct()
在再次调用opt.solve()之前。那是行不通的。实际上需要做的是通过

instance.changingConstraint.reconstruct()

然后根据可变参数的新值重新计算约束中的if子句。

带有if语句的规则在约束构造期间仅触发一次。我不记得
.recostructure()
是否仍然是推荐的用法,但我主要使用具体模型,我发现用这些方法比抽象模型更容易操作。谢谢陈琪,你的评论为我指明了正确的方向!
instance.changingConstraint.reconstruct()