DOCPLEX: добавление ограничения с суммами двух переменных - PullRequest
0 голосов
/ 21 октября 2019

Я использую решатель CPLEX в Python через DOCPLEX.

Среди других ограничений я хотел бы заявить следующее:

 cnrt_10 = {
        (w, w1, j-1, j): opt_model.add_constraint(ct=opt_model.sum(X_var[p, w, c, j-1] for c in range(1, len(operation_cost[w-1]) + 1)) + opt_model.sum(X_var[p1, w1, c, j] 
        for c in range(1, len(operation_cost[w-1]) + 1)) <= 1 + T_var[w, w1, j-1, j], ctname="cnrt10_{0}_{1}_{2}_{3}".format(w, w1, j-1, j)) 
        for w in range(1, len(operation_cost) + 1) 
        for w1 in range(1, len(operation_cost) + 1) 
        for c in range(1, len(operation_cost[w-1]) + 1) 
        for p in range(1, len(operation_cost[w-1][c-1]) + 1) 
        for p1 in range(1, len(operation_cost[w-1][c-1]) + 1) 
        for j in range(2, len(operation_cost[w-1][c-1]) + 1)
        }

Я также попытался написать следующее. В котором я разделил sum () каждой переменной:

 cnrt_10 = {
        (w, w1, j-1, j): opt_model.add_constraint(ct=opt_model.sum(X_var[p, w, c, j-1] + X_var[p1, w1, c, j] for c in range(1, len(operation_cost[w-1])) <= 1 + T_var[w, w1, j-1, j], ctname="cnrt10_{0}_{1}_{2}_{3}".format(w, w1, j-1, j)) 
        for w in range(1, len(operation_cost) + 1) 
        for w1 in range(1, len(operation_cost) + 1) 
        for c in range(1, len(operation_cost[w-1]) + 1) 
        for p in range(1, len(operation_cost[w-1][c-1]) + 1) 
        for p1 in range(1, len(operation_cost[w-1][c-1]) + 1) 
        for j in range(2, len(operation_cost[w-1][c-1]) + 1)
        }

Но в обоих случаях я получаю KeyError. Я полагаю, что в этом случае это означает, что я ищу ключ, который не существует.

Я указал аналогичное ограничение, которое не требует функции sum и работало хорошо, без возврата ошибок:

cnrt_11 = {
    (w, c, c1, j-1, j): opt_model.add_constraint(ct=X_var[p, w, c, j-1] + X_var[p1, w, c1, j] <= 1 + A_var[w, c, c1, j-1, j],
                                                 ctname="cnrt10_{0}_{1}_{2}_{3}_{4}".format(w, c, c1, j-1, j))
    for w in range(1, len(operation_cost) + 1) 
    for w1 in range(1, len(operation_cost) + 1)
    for c in range(1, len(operation_cost[w-1]) + 1) 
    for c1 in range(1, len(operation_cost[w-1]) + 1)
    for p in range(1, len(operation_cost[w-1][c-1])+1) 
    for p1 in range(1, len(operation_cost[w-1][c-1])+1) 
    for j in range(2, len(operation_cost[w-1][c-1]) + 1)
    }

В связи с этим я предполагаю, что проблема заключается в использовании sum () функция для суммирования двух переменных.

Может ли кто-нибудь помочь мне с этим вопросом? Я видел, что в docplex есть другие типы функций sum (), но я не могу знать, какая из них больше подходит для моего случая.

Заранее спасибо,

1 Ответ

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

KeyError означает, что вы пытаетесь получить доступ к словарю X_var с неизвестным ключом кортежа, так что это поможет увидеть, как вы создали словарь X_var. Model.sum () здесь не проблема.

Также было бы полезно увидеть сообщение с KeyError: вы должны увидеть кортеж, который вызывает ошибку.

...