时间相关的 GUROBI 优化:将变量提取为 dictionaries/lists/tuples
Time-dependent GUROBI optimization: extract variables as dictionaries/lists/tuples
我正在处理一个时间相关的优化问题。我有两组: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}}
我认为为每个变量创建一个 gurobi tupledict 会更容易。在这种情况下,您不需要提取变量名称和索引。相反,您可以直接通过 dict comprehension:
迭代您的两个集合
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
的嵌套字典理解。
我正在处理一个时间相关的优化问题。我有两组: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}}
我认为为每个变量创建一个 gurobi tupledict 会更容易。在这种情况下,您不需要提取变量名称和索引。相反,您可以直接通过 dict comprehension:
迭代您的两个集合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
的嵌套字典理解。