{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Numerical Experiments on Time Limit Dependency of MIP Solver\n", "\n", "In this notebook, we will conduct numerical experiments on the time limit dependency of MIP solvers using PySCIPOpt, which is supported by OMMX.\n", "MINTO natively supports OMMX Message, allowing us to smoothly perform numerical experiments through OMMX. Let's give it a try.\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import minto\n", "import ommx_pyscipopt_adapter as scip_ad\n", "from ommx.dataset import miplib2017" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this tutorial, we will pick up an instance from miplib2017 as a benchmark target. We can easily obtain miplib2017 instances using ommx.dataset." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "instance_name = \"reblock115\"\n", "instance = miplib2017(instance_name)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using the ommx_pyscipopt_adapter, we convert ommx.v1.Instance to PySCIPOpt's Model and conduct experiments by varying the limits/time parameter.\n", "\n", "The ommx instance and solution can be saved using MINTO's `.log_*` methods. Since we're using a single instance that doesn't change throughout this numerical experiment, we store it in the `experiment` space outside the with block. \n", "Solutions are saved within the with block (in the `run` space) since they vary for each time limit." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "timelimit_list = [0.1, 0.5, 1, 2]\n", "\n", "\n", "experiment = minto.Experiment(auto_saving=False)\n", "\n", "experiment.log_instance(instance_name, instance)\n", "adapter = scip_ad.OMMXPySCIPOptAdapter(instance)\n", "scip_model = adapter.solver_input\n", "\n", "for timelimit in timelimit_list:\n", " with experiment.run():\n", " experiment.log_parameter(\"timelimit\", timelimit)\n", "\n", " # Solve by SCIP\n", " scip_model.setParam(\"limits/time\", timelimit)\n", " scip_model.optimize()\n", " solution = adapter.decode(scip_model)\n", "\n", " experiment.log_solution('scip', solution)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When converting ommx.Solution to pandas.DataFrame using the `.get_run_table` method, only the main information of the solution is displayed. If you want to access the actual solution objects, you can reference them from `experiment.dataspaces.run_datastores[run_id].solutions`." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
solution_scipparametermetadata
objectivefeasibleoptimalityrelaxationstartnametimelimitrun_idelapsed_time
run_id
00.000000e+00True00Nonescip0.100.106656
1-2.824191e+07True00Nonescip0.510.407615
2-2.824191e+07True00Nonescip1.020.505631
3-2.824191e+07True00Nonescip2.031.006043
\n", "
" ], "text/plain": [ " solution_scip parameter \\\n", " objective feasible optimality relaxation start name timelimit \n", "run_id \n", "0 0.000000e+00 True 0 0 None scip 0.1 \n", "1 -2.824191e+07 True 0 0 None scip 0.5 \n", "2 -2.824191e+07 True 0 0 None scip 1.0 \n", "3 -2.824191e+07 True 0 0 None scip 2.0 \n", "\n", " metadata \n", " run_id elapsed_time \n", "run_id \n", "0 0 0.106656 \n", "1 1 0.407615 \n", "2 2 0.505631 \n", "3 3 1.006043 " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "runs_table = experiment.get_run_table()\n", "runs_table" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "x = runs_table['parameter', 'timelimit']\n", "y = runs_table['solution_scip', 'objective']\n", "plt.plot(x, y, 'o-')\n", "plt.xlabel('Time limit')\n", "plt.ylabel('Objective')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As MINTO natively supports OMMX, only the main quantities are displayed when shown in a pandas.DataFrame, making it easy to perform statistical analysis." ] } ], "metadata": { "kernelspec": { "display_name": "minto-FuAFD3Cq-py3.10", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.13" } }, "nbformat": 4, "nbformat_minor": 2 }