嵌套字典在带有Gurobi的python中获取关键错误/ defaultdict问题

时间:2019-11-13 11:46:20

标签: optimization gurobi defaultdict

这是我第一次使用Gurobi在python中实现优化模型,但遇到了建立决策变量的问题。

我首先尝试对defaultdict使用以下方法:

from gurobipy import *
from collections import defaultdict

def make_dict():
    return defaultdict(make_dict)

decvary = defaultdict(make_dict)

for k in K:
    for d in D:
        for i in V_L:
            for w in V_D:
                if (w != i):
                    for j in V:
                        if (w != j) and (i != j):
                            decvary[k][d][i][w][j] = m.addVar(lb=0, ub=1, obj=0, vtype=GRB.BINARY, name="y.%d.%d.%d.%d.%d" % (k,d,i,w,j))

但是稍后当我尝试在优化模型中添加约束时,变量decvary[k][d][i][w][j]的类型为<class 'collections.defaultdict'>,但实际上应为1或0(二进制)。

因此,我尝试了一种古老的愚蠢方法来构建嵌套字典:

for k in K:
    decvary[k]={}
    for d in D:
        decvary[k][d]={}
        for i in V_L:
            decvary[k][d][i]={}
            for w in V_D:
                if (w != i):
                    decvary[k][d][i][w]={}
                    for j in V:
                        if (w != j) and (i != j):
                            decvary[k][d][i][w][j] = m.addVar(lb=0, ub=1, obj=0, vtype=GRB.BINARY, name="y.%d.%d.%d.%d.%d" % (k,d,i,w,j))

但是这次,添加约束时出现KeyError,并且KeyError总是发生在最后一个键[j]

有人对发生的事情有任何想法吗?非常感谢!

1 个答案:

答案 0 :(得分:1)

Gurobi的Python API具有一个非常容易创建字典的内置方法:模型的addVars方法。例如。你可以做

decvary = m.addVars(K, D, V_L, V_D, V, ub=1, vtype=GRB.BINARY, name="y")

或(也要尊重您的例外情况)

decvary = m.addVars(((k, d, i, w, j) for k in K for d in D for i in V_L for w in V_D for j in V if w!=i and w!=j and i!=j), ub=1, vtype=GRB.BINARY, name="y")

创建该字典。