メインコンテンツへスキップ

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

··1046 文字·3 分
目次

はじめに
#

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

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

参考
#

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

関連記事

Pyomoで利用できる無償の数理最適化ソルバ
·2127 文字·5 分
Pythonの最適化モデリングツールPyomoで利用できる無償の数理最適化ソルバと、その導入方法をまとめました。
Pyomoモデルの変数・制約・目的関数の数を取得する
·884 文字·2 分
Pythonの最適化モデリングツールであるPyomoで、最適化モデルに定義された変数や制約、目的関数の数を取得するには、nvariables(), nconstraints(), nobjectives()メソッドを用います。
Pyomoモデルの変数・制約の情報を一括で取得する
··1454 文字·3 分
Pythonの最適化モデリングツールであるPyomoで、modelに定義された変数や制約の情報を一括して取得する方法をまとめました。Pyomoの変数や制約がベクトル化された状態でも対応できます。
Pyomoの制約をベクトル化する
·1271 文字·3 分
Pyomoで多変数の最適化を簡潔に記述するため、制約をベクトル化する方法をまとめました。
PyomoのImplicitly replacing the Component attribute警告について
·514 文字·2 分
Pythonの最適化モデリングツールPyomoでImplicitly replacing the Component attributeという警告が表示される場合、Pyomoのモデルに重複した変数名や制約名が定義されています。異なる変数名や制約名にすることで、警告が表示されなくなります。
Pyomoの変数をベクトル化する
·1409 文字·3 分
Pyomoで多変数の最適化を簡潔に記述するため、変数をベクトル化する方法をまとめた。