我正在Python中使用docplex来解决ILP。
我想在docplex中转换以下约束。
[Constraint][1]
https://i.stack.imgur.com/OPhwe.png
我尝试了以下代码:
#decision variables
X_var = {(p, w, c, j): opt_model.binary_var(name="X_{0}_{1}_{2}_{3}".format(p, w, c, j))
for p in set_OP for w in set_W for c in set_C for j in set_J}
T_var = {(w, w1, j-1, j): opt_model.binary_var(name="T_{0}_{1}_{2}_{3}".format(w, w1, j-1, j))
for w in set_W for w1 in set_W for j in set_J}
#constraint
cnrt_10 = {(p, w, w1, j-1, j): opt_model.add_constraint(ct=opt_model.sum(X_var[p-1, w, c, j-1] for c in set_C) + opt_model.sum(X_var[p, w1, c, j] for c in set_C) <= 1 + T_var[w, w1, j-1, j],
ctname="cnrt10_{0}_{1}_{2}_{3}_{4}".format(p, w, w1, j-1, j)) for p in set_OP for w in set_W for w1 in set_W for j in set_J}
但是它给出了以下错误:
KeyError: (0, 1, 1, 0)
我已经搜索过,看来这是与空字典有关的错误。我尝试了多种解决方法,但我无法。由于我是Python和CPLEX的新手,所以我认为它并不复杂。如果有人可以帮助我,我将非常感激。
预先感谢
答案 0 :(得分:1)
问题是这样的:您正在尝试访问索引为(0,1,1,0)的变量,但是这样的变量不存在。
首先,检查您引用的变量是X_var
还是T_var
。从约束定义中删除两者之一,然后看看是哪一个导致错误。
然后仔细查看在约束中引用变量和实际定义变量的索引。
从凝视您的代码,我想问题是您的约束中的这个术语:
X_var[p-1, w, c, j-1]
p
来自set_OP
,而j
来自set_J
。但是变量X_var
由p
的{{1}}和set_OP
的{{1}}定义。因此,如果您从j
中获取第一个元素set_J
,则您有一个变量p0
,但没有变量set_P
。但是,您的约束条件引用了后者。因此,您将得到一个关键错误。