Python用の混合整数線形計画法(MILP)ソルバーはありますか?
GLPK pythonはMILPの問題を解決できますか?混合整数問題を解決できると読みました。
線形計画法の問題は非常に新しいです。混合整数プログラミングが混合整数線形プログラミング(MILP)と異なる場合、私はかなり混乱しており、本当に区別できません。
Pulp は、 /などのソルバーに接続するpythonモデリングインターフェイスです。CBC (オープンソース)、 CPLEX (商用)、 Gurobi (商用)、 XPRESS-MP (商用)および YALMIP (openソース)。
Pyomo を使用して最適化問題をモデル化し、外部ソルバー、つまりCPLEX、Gurobim GLPK、AMPLを呼び出すこともできます。ソルバーライブラリ。
GLPK/Python 、 からGLPKを呼び出すこともできます。 PyGLPK または PyMathProg 。
さらに別のモデリング言語は CMPL で、MIPソルバー用のpythonインターフェースを備えています(線形プログラムのみ)。
上記のソルバーはすべて、 Mixed IntegerLinearPrograms を解きますが、一部は(確かにCPLEX、GUROBI、XRESS-MP) 混合整数QuadraticPrograms および Quadratically制約付き2次プログラム (および円錐プログラムですが、これはおそらくこの質問の範囲を超えています)。
MIPは混合整数プログラムを指しますが、一般的には線形プログラムのみを指すために使用されます。用語をより正確にするために、常にMILPまたはMINLP(混合整数非線形計画法)を参照する必要があります。
CPLEXとGUROBIにも独自のpython APIがありますが、XPRESS-MPは商用製品ですが、学術研究には無料です。 CyLP は上記のPulpに似ていますが、COIN-ORソルバーCBCおよびCGLおよびCLPとインターフェースします。
コマーシャルソルバーとフリーソルバーのパフォーマンスには大きな違いがあることに注意してください :後者は前者に大きく差をつけています。SCIPはおそらく最高の非営利ソルバー(更新については以下を参照)。 pythonインターフェース、PySCIPOptは here です。
また、 this SO question もご覧ください。
最後に、(最適化ではなく)単純な制約ソルバーに興味がある場合は、 python-constraint をご覧ください。
これがお役に立てば幸いです!
私のレーダーに落ちたソルバーとpythonインターフェース:
MIPCL 。 最速の 最速の非商用MIPソルバーには、 pythonインターフェイス があり、これにはかなりの 優れたドキュメント があります。ただし、Python APIには、ネイティブの MIPCLShell と一緒に提供される高度な機能は含まれていません。特に、 MIPCL-PY manual は、小規模な実装に加えて、運用管理で使用される一連のモデルを示しています。どのソルバー/ APIを使用するかに関係なく、それ自体が非常に興味深い入門マニュアルです。
Google Optimization Tools 。次のような多数の機能が含まれています。
いくつかの従来のOR問題と単純な実装に関する広範なドキュメントがあります。完全なPython APIドキュメントは見つかりませんでしたが、 here の例がいくつかあります。他のソルバーがどのようにインターフェースに接続し、これらのソルバーのメソッドが利用可能かどうかは、私にはやや不明確です。
CVXOPT 、凸最適化のためのオープンソースパッケージ。GLPK(オープンソース)および MOSEK (商用)とのインターフェース。多くの問題クラス(特に線形、2次、半正定、凸非線形)に取り組むことができるため、汎用性があります。唯一の欠点は、ユーザーがデータを「Matlab-y」方式で渡す必要があるため(つまり、マトリックスやrhsベクトルなどを指定するため)、複雑な問題のモデリングが煩雑になる可能性があることです。ただし、モデリングインターフェイス PICOS から呼び出すことができます...
CVXPY 、凸最適化問題のためのpython埋め込み最適化言語。デフォルトのソルバーとしてCVXOPT
を含むが、 に接続できます。通常のMIPソルバー 。
RedPanda に、CVXOPT/CVXPY
もMIPソルバーをサポートしていることを指摘してくれてありがとう。
パッケージおよびオブジェクト指向言語(Pythonに限定されない)の最適化モデリング機能に関する非常に包括的な記事については、 this article を確認してください。