Создайте переменную с разреженным индексом в pyomo - PullRequest
0 голосов
/ 28 февраля 2019

Мне нужна помощь для создания переменной с разреженными индексами.У меня есть что-то вроде этого:

model.K = Set()
model.P = Set()
model.KP = Param(model.K, model.P, default=0)

Я буду загружать файл CSV для model.KP со значением KP==1 для комбинаций K & P. ​​

model.X = Var(model.K, model.P)

Я хочусоздавайте эту переменную только для комбинаций K и P в модели. KP, потому что, когда я создаю переменную со всеми комбинациями K и P, она производит 37 миллионов индексов с наборами, которые я даю, и это создает проблемы с памятью.

1 Ответ

0 голосов
/ 05 марта 2019

Создайте Set, содержащий кортежи (k,p), и используйте его как набор, который определяет и вашу переменную, и ваш параметр.

Определите элементы вашего набора:

kp = []
for k in model.K:
    for p in model.P:
        foo_tuple = (k, p)
        kp.append(foo_tuple)

Примечание. Поскольку вы будете использовать CSV-файл для загрузки ваших данных, в этом случае можно также выполнить совокупность g kp со всеми комбинациями K и P.время.

Затем создайте Set, используя элементы в kp:

model.S = Set(initialize=kp)

Я рекомендую не использовать значения по умолчанию в параметре model.KP, если он вам не нужен.Это сообщит вам о пропущенном значении для элемента, в котором оно должно быть.Но допустим, что вы все еще хотите, чтобы все значения параметра model.PK были равны 0, когда для кортежа (p,k) не было предоставлено никакого значения, и продолжайте использовать значения по умолчанию, вы должны определить свой параметр следующим образом:

model.KP = Param(model.S, default=0)

Тогда определение вашей переменной будет:

model.X = Var(model.S)
...