Local Optima

数理最適化を趣味的に楽しむ。

Python MIPについて

オープンソースの数理計画ソルバーでなかなかの地位にいるのが,Coin-ORプロジェクトCBCソルバーである。

CBCのドキュメント (readme.md) にあるように,このソルバーを利用する方法はいろいろある。 なかでも,CBCを使えるPythonモジュールとして,cbcpy,Google OR-tools,PuLPPython MIPがある。

cbcpyはCBCPythonネイティブインターフェイスとあり,おそらく色々なことができるがこれを使うくらいなら,CかC++で同じプログラムを書いても難易度が変わらないものと思われる。

Google OR-toolsは,色々な機能の一部として,混合整数計画を定式化して解くことができるのだがその際に内部的にCBCソルバーを使う仕組みだ。ところが,これもあまりPythonぽいコードを書くのには適していない。(他言語の実装から自動生成したのだろうか。)

PuLPPython MIPは,当初からPythonをターゲットにしてAPIが設計されていて,Pythonicなコードで,定式化と求解ができる。

coin-or.github.io

PuLPは日本国内でそこそこ有名になったので,日本語文献が割と探しやすく,出版されている書籍でも,「Pythonではじめる数理最適化」「Pythonによる数理最適化入門」で扱われている。

ところが,PuLPは,定式化して解くことはできるのだけれど,CBCソルバーの機能をフルに活用した手の込んだ解法が実装できない。安いソルバーを安っぽく使っても,大した性能は期待できない。

www.python-mip.com

一方,Python MIPは,分枝カット法の実装が可能で,いろいろと手の込んだことができる。分枝カット法というと難しい手法でとっつきづらいのだが,それ以外のお手軽な機能として,ユーザーが任意の初期解を与えることができるので,問題構造から自明に得られる初期解や別の貪欲法アルゴリズムで見つけてきた初期解を与えて高速化をねらうなど,実務で役に立ちそうだ。