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 重複している変数を見つけるためのプログラムを追記しました