pulpを用いた定式化で はまった。
空の制約式(例:c = LpConstraint(0, LpConstraintLE))を作って、 後から項を追加していくようにしていた。

1つめは、空の状態でaddConstraintしていたのだが、項を追加してからaddConstraintしないとダメであった。

2つめは、項の追加を、「c += 項」としていたのだが、cオブジェクトが別物になっていた。別途リスト管理しているものが古いままで反映されなくなっていた。「+=」でなく、「addTerm」すればOKとなる。

3つめは、制約式が不要の場合に「c = None」としていて、「if c:」でチェックしていたが効いていなかった。 この箇所では、LpConstraint.__bool__がよばれ、変数がなくかつ右辺(RHS)が0の場合は、Falseとなる。 つまり、これでは空の制約式は引っかからない。 ちなみに(c = LpConstraint(非零, LpConstraintLE))では引っかかる。

その後「if c != None:」で比較していた。これは、not LpConstraint.__bool__(c - None)となる。 「c - None」は「c」と同じである。「if c != None:」と書くのと「if not c:」は等しい。 つまり、RHSが非零だとNoneと判断される!

結局、「if c is not None:」もしくは「if isinstance(c, LpConstraint)」ならばOKだ。尚、Python2では、__bool__がよばれないので、上記のことは起こらない。