时间相关的GUROBI优化:将变量提取为字典/列表/元组

时间:2018-10-07 22:05:37

标签: python gurobi

我正在处理与时间有关的优化问题。我有两组: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 :(得分:1)

我认为为每个变量创建一个gurobi tupledict会更容易。在这种情况下,您无需提取变量名称和索引。相反,您可以直接通过 dict理解 遍历两个集合:

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}

请注意,这是dic_c的嵌套dict理解。