0

DOCPLEX を介して Python で CPLEX ソルバーを使用しています。

他の制約の中で、次のことを述べたいと思います。

 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()関数を使用して 2 つの変数を合計する場合にあると想定しています。

誰かがこの問題について私を助けてくれますか? docplex には他のタイプの sum() 関数があることがわかりましたが、どちらが私の場合により適しているかを知ることができません。

前もって感謝します、

4

1 に答える 1