私は巨大な最適化モデル (10 万を超える変数) を解決するために CPLEX を使用しています。現在、オープン ソースの代替手段を見つけられるかどうかを確認したいと考えています。混合整数問題 (MILP) を解決し、CPLEX はうまく機能しますが、スケーリングしたいので、代替手段を見つけるか、独自のアドホック最適化ライブラリの作成を開始する必要があります (これは苦痛です)
任意の提案/洞察をいただければ幸いです
私は巨大な最適化モデル (10 万を超える変数) を解決するために CPLEX を使用しています。現在、オープン ソースの代替手段を見つけられるかどうかを確認したいと考えています。混合整数問題 (MILP) を解決し、CPLEX はうまく機能しますが、スケーリングしたいので、代替手段を見つけるか、独自のアドホック最適化ライブラリの作成を開始する必要があります (これは苦痛です)
任意の提案/洞察をいただければ幸いです
個人的には、 LP_SOLVEよりも GLPK の方が優れている (つまり、高速である) ことがわかりました。さまざまなファイル形式をサポートしており、アプリケーションとのスムーズな統合を可能にするライブラリ インターフェイスも利点の 1 つです。
COIN-ORのもう1つの承認。線形オプティマイザーコンポーネント(Clp)は非常に強力であり、混合整数コンポーネント(Cbc)は、いくつかの分析で非常にうまく調整できることがわかりました。LP-SolveおよびGLPKと比較しました。
本当に難しい問題の場合は、商用ソルバーが最適です。
SCIP ソルバーを試してください。私は、300K を超える変数を使用する MILP 問題に、良好なパフォーマンスで使用しました。その MILP パフォーマンスは、GLPK よりもはるかに優れています。Gurobi は MILP 問題に対しても優れたパフォーマンスを発揮します (通常は SCIP (2011 年 5 月) よりも優れています) が、アカデミック ユーザーでない場合はコストがかかる可能性があります。Gurobi はマルチコアを使用してソルバーを高速化します。
私があなたなら、Osi (C++) や PuLP (python) などのマルチソルバー インターフェースを使用して、一度コードを記述し、多くのソルバーでテストできるようにします。
解こうとしている整数プログラムが巨大な場合は、C++ よりも Python をお勧めします。コードがきれいに見え、時間の 99% がソルバーに費やされるからです。
逆に、問題が小さい場合は、Python のメモリからソルバーに問題をコピーする時間 (行ったり来たり) を無視することはできません。その場合、コンパイル済み言語を使用していくつかの顕著なパフォーマンスの改善を試すことができます。 .
しかし、問題が圧倒的に大きい場合は、コンパイルされた言語が再び勝つでしょう。これは、メモリのフットプリントが大まかに 2 で割られるためです (Python の問題のコピーはありません)。
COIN プロジェクトをチェックすることをお勧めします。 コインまたは
ここには、非線形問題用の ipOPT やいくつかの混合整数ソルバーなど、多くの優れたソルバーがあります。
試しましたlp_solve
か?Java に関する次の質問には、他にもいくつかの提案がありました。
Scipは悪くありません!
これは聞きたくないことかもしれませんが、商用ソルバーの CPLEX と Gurobi とオープンソース ソルバーの間には光年があります。
それにもかかわらず、幸運にもあなたのモデルは GLPK や Coin などで問題なく動作しますが、一般的にオープン ソース ソリューションは商用ソルバーよりもはるかに遅れています。もし違っていたら、Gurobi ライセンスに 12,000 ドル、CPLEX ライセンスにそれ以上を支払う人はいないでしょう。
過去数年間、私はオープンソースのソルバーにとって非常に困難なモデルを非常に多く見てきました。私を信じてください...
サイズの問題ではなく、数値的な難しさの問題です。
MIPCL ( http://www.mipcl-cpp.appspot.com/index.html ) について誰も言及していないことに驚いています。このソルバーは、LGPL ライセンス (ソース: http://www.mipcl-cpp.appspot.com/licence.html ) に基づくオープン ソースであると主張しているため、非オープン ソース アプリケーションでの使用にも適しています。しかし、本当にオープン ソースであるために欠けているのは、ソルバー自体のソース コードです。
Hans Mittelmann はごく最近 (2017 年 9 月 10 日)、混合整数線形計画法ベンチマークを行いました: http://plato.asu.edu/ftp/milpc.html (概要ページhttp://plato.asuもご覧ください。 .edu/bench.htmlまたは彼の講演のスライド: http://plato.asu.edu/talks/informs2017.pdf )。
12 個のスレッドと 2 時間の制限時間の混合整数線形計画法ベンチマークでは、MIPCL は 79 個のインスタンスを解決することができました。市販のソルバーである CPLEX、Gurobi、および XPRESS だけが、与えられた制約 (それぞれ 86 または 87 インスタンス) の下でより多くの解を得ることができました。
また、選択したパフォーマンス メトリック (ここでも 12 スレッドを使用) に関して、MIPCL は、ベンチマーク済みの SCIP 派生 (FSCIPC、FSCIPS) およびオープン ソース ソルバー CBC よりも高速です。ここでも、商用ソルバーである CPLEX、Gurobi、および XPRESS のみが、パフォーマンスの点で MIPCL に大きく勝っています。
100k変数は大きな問題です。オープンソースライブラリの多くは、その多くの変数ではうまく機能しません。私が読んだことから、lp_solveは約30kの変数についてのみテストされています。商用システムを使用することが唯一の選択肢かもしれません。
NEOS サーバー ( http://www.neos-server.org/neos/solvers/minco:DICOPT/GAMS.html ) を使用して DICOPT を使用して、大規模な (約 1k の変数と 1k の制約) 混合整数非線形プログラムを解決しました。そしてそれが優れていることがわかりました。
私の問題では、DICOPT は、neos サーバー BARON/KNITRO/LINDO/SBB などにリストされている他の MINLP ソルバーよりもはるかに優れていました。
NEOS にジョブを送信するには一定の制約があり、少し面倒ですが、強力な商用ソルバーへの無料アクセスがそれを補って余りあります。
オープン ソースではありませんが、Microsoft Academic Alliance ライセンスをお持ちの場合は、Microsoft Solver Foundation (MSF) エンタープライズ エディションが含まれています。Gurobiは学術目的でも無料で、論文の研究に使用しました。