Pyomo更新Set和Var以再次求解



我是Pyomo的新手,但不是Python的新手。

我有以下问题:

import pyomo.environ as pyo
model = pyo.ConcreteModel()
model.A = pyo.Set(initialize=range(7))
model.B = pyo.Set(initialize=range(7))
model.AB = pyo.Set(initilize= list((a,b) for a in model.A for b in model.B)
model.X = pyo.Var(model.A, model.B, within=pyo.Binary)
model.objective = pyo.Objective(... maximize)
solver = pyo.SolverFactory('glpk')
result = solver.solve(model)

接下来我想更新模型。B Set((,并作为一个序列修改de model。AB集和模型。X Var,这样我可以再次解决它。例如,我想设置:

model.B = pyo.Set(initialize=range(4)

然后更新模型。AB,型号。X并再次求解。如果手动完成:

model.B = pyo.Set(initialize=range(4)
model.AB = pyo.Set(initilize= list((a,b) for a in model.A for b in model.B)
model.X = pyo.Var(model.A, model.B, within=pyo.Binary)
result = solver.solve(model)

这不起作用,它给出以下错误:

RuntimeError: Cannot add component 'X_index' (type <class 'pyomo.core.base.sets._SetProduct'>) to block 'unknown': a component by that name (type <class 'pyomo.core.base.sets._SetProduct'>) is already defined.

基本上,您需要删除变量及其索引,然后再创建它。布景也是如此。

因此,本质上,在重新定义新组件之前,您需要添加以下行:

model.del_component(model.B)
model.del_component(model.AB)
model.del_component(model.X)
model.del_component(model.X_index)

然后您可以继续重新定义它们:

model.B = pyo.Set(initialize=range(4)
model.AB = pyo.Set(initialize= list((a,b) for a in model.A for b in model.B))
model.X = pyo.Var(model.A, model.B, within=pyo.Binary)

最新更新