サブロウ丸

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

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

TypeError: must be real number, not str

f.write(” LO BND       %-8s  % .12e\n” % (n, v.lowBound))
TypeError: must be real number, not str

というエラー, このエラーが起きた時は, 変数の最小値の設定がおかしくなっています. (変数の最小値に数字ではなく, 文字が入力されている) 原因としては, 変数定義の際に, 'Binary' や 'Integer' などが cat= で設定されていないことが考えられます.

pulp.LpVariable(x’, ‘Binary’)

catをつければなおります.

pulp.LpVariable(x’, cat=‘Binary’)



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