🐷

M1 Mac に Python MIP をインストールする

2022/12/06に公開1

フリーの混合整数計画モデラーとしては 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 などに記載しておきます

~/.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 のインストール方法を紹介するかもしれません。

脚注
  1. README.mdに書かれている内容の意訳です ↩︎

Discussion