Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

MIPソルバーの時間制限依存性に関する数値実験

ここではOMMXでサポートされているPySCIPOptを用い、MIPソルバーの時間制限依存性に関する数値実験を行いましょう。 MINTOはOMMXメッセージをネイティブにサポートしているため、OMMXを通して数値実験をスムーズに行うことができます。

import ommx_pyscipopt_adapter as scip_ad
from ommx.dataset import miplib2017

import minto

ベンチマークターゲットとして、miplib2017からインスタンスを取得しましょう。 ommx.datasetを用いれば、簡単に取得することができます。

instance_name = "reblock115"
instance = miplib2017(instance_name)

ommx_pyscipopt_adapterを用いてommx.v1.InstanceをPySCIPOptのモデルに変換し、制限値/時間パラメータを変化させながら実験を行います。 ommxインスタンスと解は、MINTOの.log_*メソッドを用いて保存できます。 この数値実験では単一のインスタンスを使用するため、withブロックの外にあるexperiment空間に保存します。 制限時間ごとに解は変化するため、withブロック内(run空間内)に保存されます。

timelimit_list = [0.1, 0.5, 1, 2]


experiment = minto.Experiment(auto_saving=False)

experiment.log_global_instance(instance_name, instance)
adapter = scip_ad.OMMXPySCIPOptAdapter(instance)
scip_model = adapter.solver_input

for timelimit in timelimit_list:
    with experiment.run() as run:
        run.log_parameter("timelimit", timelimit)

        # Solve by SCIP
        scip_model.setParam("limits/time", timelimit)
        scip_model.optimize()
        solution = adapter.decode(scip_model)

        run.log_solution("scip", solution)

.get_run_tableメソッドを用いてommx.Solutionをpandas.DataFrameに変換すると、解の主要な情報のみが表示されます。 実際の解オブジェクトにアクセスしたい場合は、experiment.dataspaces.run_datastores[run_id].solutionsから参照することができます。

runs_table = experiment.get_run_table()
runs_table
import matplotlib.pyplot as plt

x = runs_table["parameter", "timelimit"]
y = runs_table["solution_scip", "objective"]
plt.plot(x, y, "o-")
plt.xlabel("Time limit")
plt.ylabel("Objective")
plt.show()

MINTOはネイティブにOMMXをサポートしているため、pandas.DataFrameに表示されるときは、主要な量のみが表示されます。 このため、統計分析を簡単に実行することができます。