サブロウ丸

主にプログラミングと数学

pulp エラー集

pulp solvers.PulpSolverError

pulp.solvers.PulpSolverError: Pulp: Error while executing /usr/local/lib/python3.6/site-packages/pulp/solverdir/cbc/osx/64/cbc

このエラーが起きた時は, ソルバー自体の問題ではなく、宣言した変数名LpVariable(name='???') の???の部分が重複している可能性があります。
その場合は以下のようにして確認できます。

from collections import Counter
variables = [v.name for v in prob.variables()]
counter = Counter(variables)
for k, v in counter.items():
    if v > 1:
        print('Dupulicate', k, v)

これで重複している変数とその重複回数が表示されます。確認しましょう。

Overwriting previously set objective

warnings.warn("Overwriting previously set objective.")


目的関数を上書きしているぞ、との警告のようですが身に覚えがなかったので、調べていくと、
a = [変数 for *** if 条件]
というリストを作って
problem += sum(a) <= 0
という制約式を作っていたのですが、ここでエラーが起きていました。

詳しく見ると、aが空リストになっていたためsum(a) = 0となっていて、
そのせいで
problem += 0 <= 0
の右辺が式と判断され、右辺にTrue の 1が入り、結果的にこの式が
problem += 1
となってしまい、目的関数を更新するような形になってしまいました。


pulpではリストを用いて条件式を書く場合は、空リストになってしまう可能性のあるところでは
チェックを入れた方が良さそうです。



2017-10-27 pulp solvers.PulpSolverErrorの項を追加しました
2017-11-23 重複している変数を見つけるためのプログラムを追記しました