Зависимая от времени оптимизация GUROBI: извлечение переменных в виде словарей / списков / кортежей - PullRequest
0 голосов
/ 08 октября 2018

Я работаю с проблемой оптимизации, зависящей от времени.У меня есть два набора: U = {usr1, ..., usr4} и T = {0,1,...,23}.

У меня есть разные наборы переменных и ограничений, некоторые переменные установлены на множестве U, некоторые другие на множестве T, и большинство на обоих.Когда я получаю значения переменных с помощью m.getVars(), это выглядит так:

a[usr1] = 123        
    ... 
a[usr4] = 987
b[0] = 12 
b[1] = 34 
... 
b[23] = 89
c[usr1,0] = 1
c[usr1,1] = 2
...
c[usr1,23] = 1
c[usr2,0] = 2
...
c[usr4,22] = 3
c[usr4,23] = 4

Существует ли эффективный способ создания словаря для более удобной обработки результатов?

Что я ищучто-то вроде этого:

a = {usr1 : 123,
     usr2 : 456,
     usr3 : 789,
     usr4 : 987}

b = {0 : 12,
     1 : 34,
     ...
     23 : 89}

c = {usr1 : {0 : 1,
             1 : 2,
             ...}
     ...
     usr4 : { ...
             22 : 3
             23 : 4}}

Спасибо за помощь.

РЕДАКТИРОВАТЬ:

Я пробовал это:

sols = {}
for var in m.getVars():
    name = var.VarName.split('[')[0]
    arg =var.VarName.split('[')[1].split(']')[0]
    sols[name] = {arg : var.X}

но это делаетне работает: словарь sols содержит только последний элемент переменных, в данном случае:

sols = {'a' : {'usr4' : 987}
        'b' : {'23' : 89}
        'c' : {'usr4,23' : 4}}

1 Ответ

0 голосов
/ 08 октября 2018

Я думаю, было бы проще создать gurobi tupledict для каждой из ваших переменных.В этом случае вам не нужно извлекать имена переменных и индексы.Вместо этого вы можете перебирать два набора напрямую с помощью dict compethsion :

from gurobipy import *

U = {"usr1", "usr2", "usr3", "usr4"}
T = set(i for i in range(24))

m = Model()
a = m.addVars(U, vtype=GRB.INTEGER, name="a")
b = m.addVars(T, vtype=GRB.INTEGER, name="b")
c = m.addVars(U, T, vtype=GRB.INTEGER, name="c")

m.update()
# Your constraints and objective here
# m.optimize()

# Now creating the dictionaries:
dic_a = {usr: a[usr].X for usr in U}
dic_b = {i: b[i].X for i in T}
dic_c = {usr : {i : c[usr, i].X for i in T} for usr in U}

Обратите внимание, что это вложенное понимание dict для dic_c.

...