M1 Mac に Python MIP をインストールする
フリーの混合整数計画モデラーとしては PuLP が有名ですが、最近は Python MIP も人気です。Python MIP には以下の特徴があります[1]。
- 高レベルなモデリングができる: Pythonの演算子をオーバーロードしており、直感的にモデリングできる
- ソルバーの機能を十分に活用できる: カットの逐次追加と遅延制約機能、解プールや初期解の設定といったソルバーの機能を利用できる
- 高速: CFFIを使ってソルバーを直接呼び出すため、無駄なオーバーヘッドがなくなる
- 複数のソルバーに対応: Cbc と Gurobi をサポート
先日の Advent Calendar の記事 のために実験しようと、手持ちの Macbook Air (M1) に poetry
でインストールして(Cbcで)使おうとしたらエラーで落ちてしまったので、解決方法をメモしておきます。
エラーの原因
エラーの原因を調査したところ以下のことがわかりました
- Python MIP には Cbc(オープンソースのソルバー) が同梱されているが、x86用のバイナリのみである。そのため、M1 Mac で使う場合は別途 Cbc をインストールする必要がある
- Python MIP は Cbc の次期バージョンに依存している。そのため brew でインストールされる Cbc は利用できない
解決手順
Cbc を master ブランチから clone して利用すればOKです。Cbc のビルドとインストールには、 coinbrew (COIN-OR fetch, build, and install helper) が便利です。
coinbrew による Cbc のビルド
# coinbrew を clone
git clone https://github.com/coin-or/coinbrew.git
cd coinbrew
# coinbrew コマンドを使って master ブランチの Cbc をビルド(インストール)
# --prefix: ビルドだけでなくインストールしたい場合は指定
# enable-cbc-parallel: Cbcをマルチスレッド対応させる
./coinbrew fetch build Cbc@master --no-prompt --prefix=/usr/local --tests=none --enable-cbc-parallel
環境変数の設定
Python-MIP では、 PMIP_CBC_LIBRARY
環境変数で利用する Cbc を指定します。また、Cbcライブラリは別ライブラリにも依存しているので、インストール先が LD_LIBRARY_PATH
に含まれていない場合は追加する必要があります。そこで、以下の内容を毎回実行するか、~/.bashrc
などに記載しておきます
# 公式ドキュメントでは libCbcSolver.so を指定するようになっているが、 libCbcSolver.so は libCbc.so にマージされている
export PMIP_CBC_LIBRARY="/usr/local/lib/libCbc.dylib"
export LD_LIBRARY_PATH="/home/haroldo/prog/lib/":$LD_LIBRARY_PATH
Python-MIP のインストールと動作確認
では、 Python-MIP を利用してみます。 Python-MIP は pip で簡単に入ります(私は poetry を使っています)
pip install mip
# poetry を使う場合は以下
# poetry add mip
動作確認には、 Python-MIP のサンプルコードを使うと良さそうです。
# Python-MIP のサンプルコードをダウンロード
curl -LO https://raw.githubusercontent.com/coin-or/python-mip/master/examples/bmcp.py
# 実行してみる
python bmcp.py
# poetry の場合はこちら
# poetry run python bmcp.py
上記のコマンドを実行すると、以下の出力が得られます。
(今回インストールしたCbcを使って)きちんと最適化されていることがわかります。
...
Result - Optimal solution found
Objective value: 41
Enumerated nodes: 6
Total iterations: 10636
Time (CPU seconds): 2.8772
Time (Wallclock seconds): 3.01366
Total time (CPU seconds): 2.87727 (Wallclock seconds): 3.01658
Channels of node 0: [0, 6, 16]
Channels of node 1: [14, 20, 26, 32, 38]
Channels of node 2: [2, 7, 12, 18, 24, 30, 36, 40]
Channels of node 3: [0, 12, 26]
Channels of node 4: [4, 10, 14, 20, 37, 40]
Channels of node 5: [2, 8, 12, 18, 24]
Channels of node 6: [0, 5, 10, 16, 22, 28, 34]
Channels of node 7: [3, 7, 10]
まとめ
MacBook Air (M1) に Python-MIP をインストールする方法を紹介しました。
次回は SCIP のインストール方法を紹介するかもしれません。
Discussion
It really works for me!! THNX