Pyomo обновить Set и Var, чтобы решить снова - PullRequest
1 голос
/ 23 марта 2020

Я довольно новичок в 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)

Далее я хочу обновить модель. Set () и, как следствие, изменить de 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.

1 Ответ

2 голосов
/ 25 марта 2020

Как правило, вам нужно удалить переменную и ее индекс, прежде чем создавать ее снова. То же самое касается наборов.

Таким образом, по существу, вам нужно добавить следующие строки, прежде чем переопределять новые компоненты:

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)
...