使用Python在CPLEX中为二进制变量添加约束

时间:2019-10-11 10:17:24

标签: python dictionary constraints cplex

我正在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的新手,所以我认为它并不复杂。如果有人可以帮助我,我将非常感激。

预先感谢

1 个答案:

答案 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_varp的{​​{1}}和set_OP的{​​{1}}定义。因此,如果您从j中获取第一个元素set_J,则您有一个变量p0,但没有变量set_P。但是,您的约束条件引用了后者。因此,您将得到一个关键错误。