MIPLIBインスタンスをダウンロードする#
OMMXリポジトリでは、MIPLIB 2017の混合整数計画問題ベンチマークインスタンスをOMMX Artifact形式のデータとして提供しています。
注釈
dataset.miplib2017 は、公開済みの
ghcr.io/jij-inc/ommx/v2.7/miplib2017:{instance-name} 配布を使用します
(パッケージ)。
この Artifact は MPS の整数変数の境界を修正した OMMX 2.7.0 で生成されており、
v3 SDK でも読み込めます。配布バージョンは採用したデータセットを表し、
インストール済み SDK のバージョンとは独立しています。
配布フォーマットや数学的モデルを変更する場合は、SDK の minor または major
リリースと新しい /v{major}.{minor}/ 名前空間が必要です。patch リリースでは
採用済みの配布を維持し、公開済みのパス・タグは上書きしません。
再現性のため旧バージョンなしリポジトリも維持しますが、ローダーはそこへ
フォールバックしません。旧 Artifact がキャッシュされている場合も同様です。
v2.7 の配布記録 に、元アーカイブ、公開済みインスタンス、非対応の入力、モデルのダイジェストを記載しています。
GitHub コンテナーレジストリについてはこちらを参照してください。
これらのインスタンスはOMMX SDKで簡単にダウンロードでき、OMMX Adapterの入力としてそのまま利用できます。 例えば、MIPLIB 2017のneos-1122047インスタンス (参照) をPySCIPOptで解くには、以下の2ステップで実行できます:
OMMX Python SDKの
datasetサブモジュールにあるmiplib2017関数で、neos-1122047インスタンスをダウンロードする。ダウンロードしたインスタンスを、OMMX PySCIPOpt Adapterを介してPySCIPOptで解く。
具体的なPythonコードは以下の通りです:
# OMMX Python SDK
from ommx import dataset
# OMMX PySCIPOpt Adapter
from ommx_pyscipopt_adapter import OMMXPySCIPOptAdapter
# ステップ1: MIPLIB 2017のneos-1122047インスタンスをダウンロードする
instance = dataset.miplib2017("neos-1122047")
# ステップ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()
インスタンスには、データセット共通のアノテーションとデータセット固有のアノテーションの2種類があります。
データセット共通のアノテーションには以下の7つがあり、それぞれに専用のプロパティが用意されています:
アノテーション |
プロパティ |
説明 |
|---|---|---|
|
|
そのインスタンスの作者 |
|
|
そのインスタンスにある制約条件の数 |
|
|
そのインスタンスがOMMX Artifact形式で保存された日時 |
|
|
そのインスタンスが属するデータセット名 |
|
|
そのデータセットのライセンス |
|
|
そのインスタンスの名前 |
|
|
そのインスタンスにある決定変数の総数 |
MIPLIBに特有のアノテーションは org.ommx.miplib.* というプレフィックスを持ちます。
例として、neos-1122047インスタンスの最適値を確認してみましょう。そのインスタンスの詳細ページ (link) によれば、最適値は 161 であり、この値はキー org.ommx.miplib.objective で取得できます:
# アノテーションの値はすべて文字列 (str) であることに注意する!
instance.annotations["org.ommx.miplib.objective"]
これにより、先ほどのOMMX PySCIPOpt Adapterで得られた計算結果が、期待される最適値と一致することを検証できます:
import numpy as np
best = float(instance.annotations["org.ommx.miplib.objective"])
assert np.isclose(solution.objective, best)