Многомерная переменная с различной длиной индекса в Pyomo или Gurobi - PullRequest
0 голосов
/ 15 декабря 2018

Я хочу решить проблему оптимизации в Python.Я пытаюсь определить переменную x_ {g, h}, где индекс g принадлежит множеству G, а индекс h принадлежит множеству H (g), т. Е. Набор индексов h изменяется для разных индексов g.Есть ли способ определить переменную x с этими индексами в Pyomo или Gurobi-Python?

В Pyomo я попытался определить ее в цикле, как

for g in p.keys():
    for h in range(0,p.rop[g].npairs,1):
        model.x_gen_h = Var(g,h,within=NonNegativeReals)

Я получил эту ошибку:

TypeError: 'int' object is not iterable.

Я ценю любую помощь или комментарий!

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Хитрость заключается в определении набора индексации, используемого для индексации переменной.Pyomo не поддерживает зацикливание отдельных индексов и добавление их в Var по одному.Вы должны использовать некоторый умный код Python для создания всего набора индексации.Например, вы можете использовать что-то вроде этого, чтобы отфильтровать нужные вам индексы:

m = ConcreteModel()

m.g = Set(initialize=[1,2,3])

h = {1:['a','b'], 2:['b','c'], 3:['c','d']}
m.h_all = Set(initialize=set(sum(h.values(),[]))) # Extract unique h values

# Initialize set to be entire cross product of g and h and then filter desired values
m.hg = Set(initialize=m.g*m.h_all, filter=lambda m,g,hi:hi in h[g])
m.x = Var(m.hg, within=NonNegativeReals)

Еще лучшей альтернативой будет:

h = {1:['a','b'], 2:['b','c'], 3:['c','d']}
m.hg = Set(initialize=list((i,j) for i in h.keys() for j in h[i])
0 голосов
/ 17 декабря 2018

Я хотел бы взглянуть на некоторые примеры моделей, приведенные в документации Pyomo: https://pyomo.readthedocs.io/en/latest/tutorial_examples.html.

Вам не нужно использовать цикл for для создания переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...