Добавить ограничение для двоичной переменной в CPLEX с Python - PullRequest
0 голосов
/ 11 октября 2019

Я использую docplex в Python для решения 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 Ответ

1 голос
/ 11 октября 2019

Проблема заключается в следующем: вы пытаетесь получить доступ к переменной с индексом (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 из set_OP и j из set_J. Поэтому, если вы берете первый элемент p0 из set_P, то у вас есть переменная X_var[p0, ., ., .], но у вас нет переменной X_var[p0-1, ., ., .]. На последнее ссылается ваше ограничение, хотя. Следовательно, вы получите ключевую ошибку.

...