MIPLIBインスタンスをダウンロードする#
OMMXリポジトリでは、MIPLIB 2017の混合整数計画問題ベンチマークインスタンスをOMMX Artifact形式のデータとして提供しています。
Note
より詳細な説明:MIPLIB 2017のインスタンスに対応するOMMX ArtifactはOMMXリポジトリのGitHub コンテナーレジストリ (link)で管理されています。
GitHub コンテナーレジストリについてはこちらを参照してください。
これらのインスタンスはOMMX SDKで簡単にダウンロードでき、OMMX Adapterの入力としてそのまま利用できます。 例えば、MIPLIB 2017のair05インスタンス (参照) をPySCIPOptで解くには、以下の2ステップで実行できます:
OMMX Python SDKの
dataset
サブモジュールにあるmiplib2017
関数で、air05インスタンスをダウンロードする。ダウンロードしたインスタンスを、OMMX PySCIPOpt Adapterを介してPySCIPOptで解く。
具体的なPythonコードは以下の通りです:
# OMMX Python SDK
from ommx import dataset
# OMMX PySCIPOpt Adapter
from ommx_pyscipopt_adapter import OMMXPySCIPOptAdapter
# ステップ1: MIPLIB 2017のair05インスタンスをダウンロードする
instance = dataset.miplib2017("air05")
# ステップ2: OMMX PySCIPOpt Adapterを介してPySCIPOptで解く
solution = OMMXPySCIPOptAdapter.solve(instance)
この機能により、複数のOMMX対応ソルバーで同一のMIPLIBインスタンスを使用したベンチマーク測定を効率よく実行できます。
補足:インスタンスに付随するアノテーション#
ダウンロードしたインスタンスには各種アノテーションが含まれており、annotations
プロパティを使って全てのアノテーションにアクセスできます:
import pandas as pd
# アノテーションを pandas を使って表形式で表示する
pd.DataFrame.from_dict(instance.annotations, orient="index", columns=["Value"]).sort_index()
Value | |
---|---|
org.ommx.miplib.binaries | 7195 |
org.ommx.miplib.continuous | 0 |
org.ommx.miplib.group | air |
org.ommx.miplib.integers | 0 |
org.ommx.miplib.non_zero | 52121 |
org.ommx.miplib.objective | 26374 |
org.ommx.miplib.status | easy |
org.ommx.miplib.tags | benchmark,binary,benchmark_suitable,set_partit... |
org.ommx.miplib.url | https://miplib.zib.de/instance_details_air05.html |
org.ommx.v1.instance.authors | G. Astfalk |
org.ommx.v1.instance.constraints | 426 |
org.ommx.v1.instance.created | 2024-11-11T20:38:59.242221+09:00 |
org.ommx.v1.instance.dataset | MIPLIB2017 |
org.ommx.v1.instance.license | CC-BY-SA-4.0 |
org.ommx.v1.instance.title | air05 |
org.ommx.v1.instance.variables | 7195 |
インスタンスには、データセット共通のアノテーションとデータセット固有のアノテーションの2種類があります。
データセット共通のアノテーションには以下の7つがあり、それぞれに専用のプロパティが用意されています:
アノテーション |
プロパティ |
説明 |
---|---|---|
|
|
そのインスタンスの作者 |
|
|
そのインスタンスにある制約条件の数 |
|
|
そのインスタンスがOMMX Artifact形式で保存された日時 |
|
|
そのインスタンスが属するデータセット名 |
|
|
そのデータセットのライセンス |
|
|
そのインスタンスの名前 |
|
|
そのインスタンスにある決定変数の総数 |
MIPLIBに特有のアノテーションは org.ommx.miplib.*
というプレフィックスを持ちます。
例として、air05インスタンスの最適値を確認してみましょう。そのインスタンスの詳細ページ (link) によれば、最適値は 26374
であり、この値はキー org.ommx.miplib.objective
で取得できます:
# アノテーションの値はすべて文字列 (str) であることに注意する!
assert instance.annotations["org.ommx.miplib.objective"] == "26374"
これにより、先ほどのOMMX PySCIPOpt Adapterで得られた計算結果が、期待される最適値と一致することを検証できます:
import numpy as np
best = float(instance.annotations["org.ommx.miplib.objective"])
assert np.isclose(solution.objective, best)