Многомерная переменная с разной длиной индекса в Пьомо или Гуроби

Я хочу решить проблему оптимизации на 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.

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


person Arthur    schedule 15.12.2018    source источник
comment
один из G или H (g) на самом деле просто int, а не то, что вы думаете. вы можете поделиться полной трассировкой?   -  person Paritosh Singh    schedule 15.12.2018
comment
Спасибо за комментарий @Paritosh. Я исправил вопрос, чтобы точно показать петлю. Считаю ошибку неактуальной. Это должно быть связано с тем, как мы определяем переменные в Pyomo. В самом деле, мой вопрос: как мы можем понять список при определении переменной в Pyomo или Gurobi?   -  person Arthur    schedule 15.12.2018


Ответы (2)


Уловка заключается в определении набора индексирования, используемого для индексации переменной. 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])
person Bethany Nicholson    schedule 17.12.2018

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

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

person Qi Chen    schedule 17.12.2018
comment
Спасибо за комментарий, но я не нашел там ответа на свой вопрос. Другими словами, мой вопрос: можем ли мы понять список при определении переменных? например, есть ли способ реализовать это: model.x = Var (G.keys (), H [g] для g в G.keys ()), где G.keys () - это список индексов, а H [g ] является индексным списком для каждого g. Во всех примерах, приведенных в учебнике Pyomo или на веб-сайте Pyomo, два индексных списка независимы. - person Arthur; 17.12.2018
comment
Для переменных существует сомнительная поддержка зубчатых наборов (в этом отношении я не спорю, использует ли кто-либо из разработчиков эту возможность в настоящее время). Вы можете поиграть с Var(dense=False), если будете осторожны, но поскольку неиспользуемые переменные (те, которые не появляются в ограничениях) не передаются большинству решателей, вы должны быть безопасны при определении над независимыми наборами, если нет реального ограничения памяти. - person Qi Chen; 17.12.2018