ここでは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_tableimport 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に表示されるときは、主要な量のみが表示されます。 このため、統計分析を簡単に実行することができます。