Как объявить параметры / переменные, проиндексированные подмножеством в массиве наборов в Pyomo?

В Pyomo можно объявить массив наборов (набор наборов или подмножеств, проиндексированных другим набором) с помощью следующей команды (согласно документации):

model.A=Set()
model.B=Set()
model.C=Set(model.B, within=model.A)

Интересно, как я могу объявить переменную или параметр для индексации одним из (под) наборов в массиве наборов в абстрактной модели? Например, как я могу объявить параметр 'model.d', который индексируется как model.B, так и model.C [model.B], где каждый элемент в model.B идентифицирует подмножество model.A?

Когда я это объявляю так:

model.d=Param(model.B, model.C[model.B])

Я получаю сообщение об ошибке:

ValueError: Error retrieving component C[B]: The component has not been constructed.

person Stian Backe    schedule 19.06.2018    source источник


Ответы (2)


Если я правильно понимаю, просто model.d=Param(model.B, model.C) может быть тем, что вы ищете.

Также похоже, что вы используете AbstractModel. Я знаю, что во многих примерах используются абстрактные модели, но часто ConcreteModel поведение более интуитивно понятно для начинающих. Ваш вариант использования предполагает многократное решение одной и той же структуры модели с разными данными?

person Qi Chen    schedule 20.06.2018
comment
Спасибо за ваш ответ. Я знаком с абстрактными моделями и раньше использовал AMPL. - person Stian Backe; 21.06.2018
comment
Ах, попался. Я вырос в GAMS, отсюда и разница в перспективе. А вот регулировка сработала для вас? - person Qi Chen; 21.06.2018
comment
Я понимаю, что предпочитаю абстрактный подход, чтобы структура модели и ввод данных были разделены. Я решил это иначе: объявил двумерный набор, содержащий кортежи (i, j). Первый индекс, i, относится к набору индексации (model.B), а второй индекс, j, относится к элементу подмножества (j в model.C [i]). - person Stian Backe; 22.06.2018
comment
Спасибо за ваш отзыв! - person Stian Backe; 22.06.2018

Я объявил двумерный набор, который содержит кортежи (i, j) вместо индексации набора. Первый индекс, i, относится к набору индексации (model.B), а второй индекс, j, относится к элементу подмножества (j в model.C [i]).

Поэтому мой код:

model.A = Set()
model.B = Set()
model.C = Set(dimen=2)

model.d = param(model.C)

Я загружаю данные для model.C как set_array, то есть матрицу с + и -. Параметр model.d теперь индексируется по двум наборам: model.B и подмножеству model.A:

data.load(filename='Sets.xlsx',range='C',using='xlsx',format="set_array", set=model.C)

Где загруженная таблица выглядит примерно так:

SetC   b1   b2   b3   b4
a1      +    -    -    +
a2      +    +    +    -
a3      -    +    +    +
person Stian Backe    schedule 22.06.2018