Пьомо: Как создать новую переменную модели без объявления ее имени, а затем сохранить ее в словаре?

Мне было интересно, есть ли способ создать переменную, которая присоединяется к модели, без указания ее имени. Или как мне динамически создавать переменные с разными именами в pyomo?

Предыстория: в настоящее время у меня есть конкретная модель для основной проблемы и еще одна конкретная модель для подзадачи. Моя цель - решить двухэтапную задачу оптимизации с использованием алгоритма генерации столбцов и ограничений в рамках этой основной и подзадач.

Я пытаюсь сузить цикл while, чтобы добавить новые переменные и ограничения к основной задаче. В частности, я пытаюсь создать новую переменную для каждой итерации цикла while. Затем я хотел бы добавить к основной задаче несколько новых ограничений / сокращений, которые включают новую переменную на каждой итерации.

Для этого я пытался построить словарь, используя цикл for. В словаре каждый ключ соответствует вновь созданной переменной. Я написал примерно так:

for i in I:
    xname= 'x' + str(i)
    new_x[xname] = model.add_component(xname, pyo.Var())

где I - набор счетчиков итераций, используемых для создания новых переменных и присвоения их ключу словаря.

Однако это не работает, потому что model.add_component (xname, pyo.Var ()) не может быть назначен ключу, поскольку это процедура, которая добавляет новую переменную непосредственно в модель. Однако я не могу использовать стандартный синтаксис model.x = pyo.Var () для создания новых переменных либо потому, что это означает, что я должен делать это вручную, что противоречит цели цикла while.

Мне было интересно, есть ли способ создать переменную, которая присоединяется к модели, без указания ее имени. Или как мне динамически создавать разные переменные в pyomo?

Спасибо!


person amanda    schedule 28.03.2021    source источник


Ответы (1)


Некоторые первые варианты:

  • Вместо этого вы можете использовать setattr(model, xnnam, pyo.Var) в своем цикле while;

  • Вы можете создать набор, используя элементы «I», затем переменную, проиндексированную по I, и решить модель для каждого «i» только в вашем цикле while.

Надеюсь, в этом есть смысл.

person EJay    schedule 06.04.2021
comment
Я решил проблему. Большое спасибо!! - person amanda; 05.05.2021