はじめに #
Pythonの最適化モデリングツールPyomoで、混合整数非線形最適化 (MINLP) ソルバSCIPを利用する方法をまとめました。
SCIPはZuse Institute Berlin (ZIB)が開発しているソルバです。バージョン8.0.3からApache 2.0ライセンスになりました。
検証環境は以下の通りです。
- Windows 10 Home 22H2
- Python 3.9.7
- Pyomo 6.4.1
- SCIP 8.0.3
SCIPのインストール #
まず、SCIPのインストーラを公式サイトからダウンロードします。Versionを"8.0.3", OSを"Windows"とすると、SCIPOptSuite-8.0.3-win64-VS15.exe
のリンクが表示されるのでダウンロードします。
ダウンロード後、SCIPOptSuite-8.0.3-win64-VS15.exe
を開いてSCIPをインストールします。インストール時にSCIPをパスに追加するか聞かれるので、追加します(コントロールパネルで後から追加することも可能です)。その他のインストールオプションはデフォルトのままで問題ないと思います。
なお、SCIPをインストールできない場合、以下のような対処方法があります。
scip.exe
を実行ディレクトリに置く。- または
import sys; sys.path.append(<scip.exeのフォルダ>)
でscip.exe
のパスを通す。
PyomoからSCIPを呼び出す #
PyomoからSCIPを呼び出すには、ソルバにscip.exe
を指定します。ソースコードのサンプルを以下に示します。
import pyomo.environ as pyo
mdl = pyo.ConcreteModel()
mdl.x1 = pyo.Var(domain=pyo.Integers, bounds=(-5, 5))
mdl.x2 = pyo.Var(domain=pyo.Integers, bounds=(-5, 5))
mdl.obj = pyo.Objective(expr = mdl.x1**2 + mdl.x1*mdl.x2)
opt = pyo.SolverFactory('scip.exe')
res = opt.solve(mdl, tee=True)
ただし、PyomoからSCIPのオプションを上手く設定できないようです。以下の通りdisplay/verblevel
オプションを変更してログ表示の変更を試みましたが、表示に変化はありませんでした。オプションを設定するにはscip.set
というファイルを配置します(後述)。
opt = pyo.SolverFactory('scip.exe')
opt.options["display/verblevel"] = 1
res = opt.solve(mdl, tee=True)
opt = pyo.SolverFactory('scip.exe')
res = opt.solve(mdl, tee=True, options={"display/verblevel": 1})
scip.setによるオプション指定 #
(2023年6月3日追記) SCIPのログを読むと、以下のメッセージが出力されていました。
user parameter file <scip.set> not found - using default parameters
そこでカレントディレクトリにscip.set
というファイルを作り、その中で以下のようにオプションを記述すると、Pyomoの最適化計算に反映できました。
display/verblevel = 0
指定可能なオプションは以下のページを参考にしてください。 SCIP Doxygen Documentation - List of all SCIP parameters