見出し画像

数理最適化ツール比較

色々な手法があるので、全ての場合に万能なツールがある訳ではなく。
色々とメリットとデメリットを記録してみる。
自分が見つけた順番で列挙していくだけで、順番に深い意味は無い。

○Excel

概要:ソルバーを使う。
メリット:
 ・意外と使える。プロトタイプで試すのには十分。
 ・現場でも使えるので、運用時のハードルが低い。
 ・小規模問題の場合は、組むのが容易。
 ・線形問題、非線形問題も計算出来る。
 ・最大最小値を求めるだけではなく一定の値に近づけば停止させられる。
 ・整数型、Differential(全ての値が異なる)、Binary(0か1)を選べる。

デメリット:
 ・変数が300以下なので、時系列分析はほぼ不可能。
 ・非線形問題を解く場合、どれだけ時間がかかるのか保証が無い。

○SWI-Prolog

概要  :論理制約プログラミングを使う。
メリット:
 ・CLPで連続値、FDで整数型の計算ができる。
 ・スケジューリング問題を記述できる。

デメリット:
 ・変数が256個以下。
 ・整数混在型最適化問題は解けない。
 ・計算速度は遅い。

○ Python PuLPなど

概要  :各種ソルバーを用途にあわせてインストール。
メリット:
 ・使用可能なパッケージが豊富。
 ・資料も豊富。
 ・GoogleのColaboが使える。
デメリット:
 ・変数の個数が増えると、コードの記述が面倒になる。
 (Pandasを使えば良いが、初学者には使いこなせない。
  つまりデバッグが大変。)

○Python NetworkX

概要  :NetworkXはグラフネットワークを計算できるパッケージである。
メリット:
 ・グラフネットワークで表現できる問題ならば簡単に記述できる。
  (条件が一致すれば最強)
 ・変数は2,000個程度まで使える。
 ・GoogleのColaboが使える。
デメリット:
 ・NetworkXでは整数型が使えない。
 ・会社によってはプロキシー設定が強く、pipが通らない。
  (簡単にインストールできないので、現場での運用は難しい)

○SageMath

概要  : Pythonベースの数値計算用アプリ。
メリット:
 ・ Pythonのパッケージよりもコード記述が短く済む。
 ・インストールがプロキシーの影響を受けない。
 ・JupyterNotebookを使える。
 ・ローカルで動く Pythonを使える。(プロキシーのpipは通せない)
デメリット:
 ・整数混在型最適化問題を記述できるかどうか怪しい。
 (詳細は未確認)
 ・市販解説資料は無い。

○AMPL

概要  :オペレーションズ・リサーチ専用の言語。
メリット:
 ・無料で使えるStudioがあった。(現在はどうか?)
 ・慣れると書きやすい。
デメリット:
 ・使えるソルバーが少ない。
 ・文法に癖が強い。
 ・無料は変数が256個まで。
 ・他に便利な処理系が揃ってきたので、使う価値はあるのか?

○Mathematica

概要  :Verも進んで、条件さえ合えばクラウドで無料で使える。
     ラズベリーパイを買えば、無料で使用可能!
メリット:
 ・非常に短い。
 ・変数の個数に制限が無い。
 ・ドキュメントは純正が充実。
デメリット:
 ・ブラウザでの動作ではコードが長いとコピペができなくなる。
 ・行列形式で整数型混在型最適化問題を記述できない(様である)。

○Julia

概要  :新興言語だが、そろそろ現実的に使える。
メリット:
 ・コードが短い。(特に制約文の中でsum関数が使える)
 ・高速。
 ・インストールが容易でPkgはプロキシーを通りやすい。
 (うちの環境ではIJuliaは通らなかった)
 ・解説書が増えてきた。
 ・整数混在型最適化問題を行列表現可能かどうか要確認。
 (行列表現以外では可能なことは確認)
デメリット;
 ・ Pythonに比べるとパッケージはこれから。

これは少し内容が古いので参考程度に。


============================
2024年 最新情報はこの二冊。

○Python Optuna

風変わりなソルバーが出た。最適化ソルバーとしても使えるのだが、機械学習のハイパーパラメーターの最適化など不思議な非線形問題にも使えるという。(詳細は要調査)

○Python POT

「最適輸送」というアルゴリズム。機械学習の確率分布曲線を計算するのに使うらしいが、線形問題をGPUで計算できないなどのデメリットをこれで解決できるという。(詳細は要調査)

============================
古い情報だが、今更びっくりした。

○Python ORToolPy

業務で書くPythonのグラフネットワーク。モデルはシンプルだけど、兎に角もエッジ(線)が多くてPuLPで書いてると4千行になりそうな勢いだった。もうデバッグできない…
そこで6年前に買ったこれを使うと、6行で書けた。(重要な部分は2行)

実はNetworkXを使うと最低流量の指定も簡単なのだが、意外とどこにも書いてないので諦めている人も多いのでは?

============================
2024年 最新情報

○ChatGPT

書き方に少々工夫が要るが、何故か計算してしまう。
大規模な計算には向いていないと思うが。
すぐにギブアップしてPythonで計算してくれるが、それは構わない。

○Python OR-Tools

まだ触っていないけれど、こういうのがあるそうだ。


いいなと思ったら応援しよう!