JavaScriptを有効にしてください

PyomoでMINLPソルバSCIPを利用する

 ·   ·   4 min read

※記事内に商品プロモーションを含むことがあります。

はじめに

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のリンクが表示されるのでダウンロードします。

SCIPのダウンロード画面

ダウンロード後、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を指定します。ソースコードのサンプルを以下に示します。

1
2
3
4
5
6
7
8
9
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というファイルを配置します(後述)。

1
2
3
opt = pyo.SolverFactory('scip.exe')
opt.options["display/verblevel"] = 1
res = opt.solve(mdl, tee=True)
1
2
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

参考

シェアする

Helve
WRITTEN BY
Helve
関西在住、電機メーカ勤務のエンジニア。X(旧Twitter)で新着記事を配信中です

サイト内検索