这是我第一次使用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]
有人对发生的事情有任何想法吗?非常感谢!
答案 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")
创建该字典。