Pyomo 更新 Set 和 Var 再次求解
Pyomo update Set and Var to solve again
我对 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)
接下来我想更新 model.B Set() 并因此修改 model.AB Set 和 model.X Var 以便我可以再次解决它。比如我要设置:
model.B = pyo.Set(initialize=range(4)
然后更新model.AB,model.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)
我对 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)
接下来我想更新 model.B Set() 并因此修改 model.AB Set 和 model.X Var 以便我可以再次解决它。比如我要设置:
model.B = pyo.Set(initialize=range(4)
然后更新model.AB,model.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)