{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Getting started\n", "\n", "## はじめに\n", "Amplify Schedはスケジューリング問題の定式化をサポートするライブラリです。Amplify Schedで定式化されたスケジューリング問題はAmplify Scheduling Engineにてスケジュールの最適化を行うことができます。\n", "\n", "\n", "## スケジューリング問題\n", "\n", "スケジューリング問題とは、複数のジョブ (Job) とそれらを処理する複数のマシン (Machine) のスケジュールを決定する問題です。\n", "1つのジョブは、指定されたマシンで指定された時間、複数の処理 (Task) を実行し、すべてのタスクが完了するとジョブが完了します。\n", "\n", "### Job\n", "\n", "複数の Task から構成されます。Job 内の各 Task には順序関係が定められており、その順序で処理を行う必要があります。また同時に複数の Task を行うことはできません。Job 内の Task の順番を Process 1, Process 2, ...と呼びます。\n", "\n", "![](image/job.drawio.svg)\n", "\n", "\n", "### Task\n", "\n", "Task は Job と Process から一意に決まります。Task の変数として、処理開始時刻、処理終了時刻、処理を行う Machine があります。\n", "処理を行うことができる Machine ごとに、Task の処理時間を設定します。\n", "\n", "![](image/task.drawio.svg)\n", "\n", "\n", "### Machine\n", "\n", "Task を処理する機械です。複数の Task を同時に処理することはできません。\n", "\n", "![](image/machine.drawio.svg)\n", "\n", "\n", "## スケジューリング問題の評価尺度\n", "\n", "### Makespan\n", "\n", "すべての Job の最後の処理終了時間(メイクスパン)を最小にするスケジュールを探索します。\n", "\n", "![](image/makespan.drawio.svg)\n", "\n", "## Amplify Schedによるスケジューリング問題の定式化\n", "\n", "Amplify Schedで下記の問題の定式化を行います。\n", "\n", "| Job name | Process | Machine name | Processing Time |\n", "|----------|---------|---------------|------|\n", "| Job A | 0 | Machine X | 10 |\n", "| Job A | 1 | Machine Y | 20 |\n", "| Job A | 2 | Machine Z | 15 |\n", "| Job B | 0 | Machine Y | 10 |\n", "| Job B | 1 | Machine Z | 20 |\n", "| Job B | 2 | Machine X | 15 |\n", "| Job C | 0 | Machine Z | 10 |\n", "| Job C | 1 | Machine X | 20 |\n", "| Job C | 2 | Machine Y | 15 |\n", "| Job D | 0 | Machine Z | 10 |\n", "| Job D | 1 | Machine Y | 20 |\n", "| Job D | 2 | Machine X | 15 |\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from amplify_sched import *" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# define Model\n", "model = Model()\n", "\n", "# define Jobs\n", "model.jobs.add(\"Job A\")\n", "model.jobs.add(\"Job B\")\n", "model.jobs.add(\"Job C\")\n", "model.jobs.add(\"Job D\")\n", "\n", "# define Machines\n", "model.machines.add(\"Machine X\")\n", "model.machines.add(\"Machine Y\")\n", "model.machines.add(\"Machine Z\")\n", "\n", "# add Task to Jobs\n", "model.jobs[\"Job A\"].append(Task())\n", "model.jobs[\"Job A\"][0].processing_times[\"Machine X\"] = 10\n", "model.jobs[\"Job A\"].append(Task())\n", "model.jobs[\"Job A\"][1].processing_times[\"Machine Y\"] = 20\n", "model.jobs[\"Job A\"].append(Task())\n", "model.jobs[\"Job A\"][2].processing_times[\"Machine Z\"] = 15\n", "\n", "model.jobs[\"Job B\"].append(Task())\n", "model.jobs[\"Job B\"][0].processing_times[\"Machine Y\"] = 10\n", "model.jobs[\"Job B\"].append(Task())\n", "model.jobs[\"Job B\"][1].processing_times[\"Machine Z\"] = 20\n", "model.jobs[\"Job B\"].append(Task())\n", "model.jobs[\"Job B\"][2].processing_times[\"Machine X\"] = 15\n", "\n", "model.jobs[\"Job C\"].append(Task())\n", "model.jobs[\"Job C\"][0].processing_times[\"Machine Z\"] = 10\n", "model.jobs[\"Job C\"].append(Task())\n", "model.jobs[\"Job C\"][1].processing_times[\"Machine X\"] = 20\n", "model.jobs[\"Job C\"].append(Task())\n", "model.jobs[\"Job C\"][2].processing_times[\"Machine Y\"] = 15\n", "\n", "model.jobs[\"Job D\"].append(Task())\n", "model.jobs[\"Job D\"][0].processing_times[\"Machine Z\"] = 10\n", "model.jobs[\"Job D\"].append(Task())\n", "model.jobs[\"Job D\"][1].processing_times[\"Machine Y\"] = 20\n", "model.jobs[\"Job D\"].append(Task())\n", "model.jobs[\"Job D\"][2].processing_times[\"Machine X\"] = 15" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Enter your token for Amplify Scheduling Engine.\n", "token = \"xxxxxxxxxxxxxxxxxxxxxxxxxxx\"\n", "gantt = model.solve(token=token, timeout=1)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "alignmentgroup": "True", "base": [ 0, 40, 10, 55 ], "customdata": [ [ "Machine X", 0 ], [ "Machine X", 2 ], [ "Machine X", 1 ], [ "Machine X", 2 ] ], "hovertemplate": "Machine=%{customdata[0]}
Start=%{base}
Finish=%{x}
Job=%{y}
Process=%{customdata[1]}", "legendgroup": "Machine X", "marker": { "color": "#636efa", "pattern": { "shape": "" } }, "name": "Machine X", "offsetgroup": "Machine X", "orientation": "h", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ 10, 15, 20, 15 ], "xaxis": "x", "y": [ "Job A", "Job B", "Job C", "Job D" ], "yaxis": "y" }, { "alignmentgroup": "True", "base": [ 10, 0, 50, 30 ], "customdata": [ [ "Machine Y", 1 ], [ "Machine Y", 0 ], [ "Machine Y", 2 ], [ "Machine Y", 1 ] ], "hovertemplate": "Machine=%{customdata[0]}
Start=%{base}
Finish=%{x}
Job=%{y}
Process=%{customdata[1]}", "legendgroup": "Machine Y", "marker": { "color": "#EF553B", "pattern": { "shape": "" } }, "name": "Machine Y", "offsetgroup": "Machine Y", "orientation": "h", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ 20, 10, 15, 20 ], "xaxis": "x", "y": [ "Job A", "Job B", "Job C", "Job D" ], "yaxis": "y" }, { "alignmentgroup": "True", "base": [ 40, 20, 0, 10 ], "customdata": [ [ "Machine Z", 2 ], [ "Machine Z", 1 ], [ "Machine Z", 0 ], [ "Machine Z", 0 ] ], "hovertemplate": "Machine=%{customdata[0]}
Start=%{base}
Finish=%{x}
Job=%{y}
Process=%{customdata[1]}", "legendgroup": "Machine Z", "marker": { "color": "#00cc96", "pattern": { "shape": "" } }, "name": "Machine Z", "offsetgroup": "Machine Z", "orientation": "h", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ 15, 20, 10, 10 ], "xaxis": "x", "y": [ "Job A", "Job B", "Job C", "Job D" ], "yaxis": "y" } ], "layout": { "barmode": "overlay", "legend": { "title": { "text": "Machine" }, "tracegroupgap": 0 }, "margin": { "t": 60 }, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "fillpattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "xaxis": { "anchor": "y", "domain": [ 0, 1 ], "type": "linear" }, "yaxis": { "anchor": "x", "categoryarray": [ "Job D", "Job C", "Job B", "Job A" ], "categoryorder": "array", "domain": [ 0, 1 ], "title": { "text": "Job" } } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "gantt.timeline()" ] } ], "metadata": { "kernelspec": { "display_name": "scheduling-engine-sdk-IShfnD0Q", "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.6" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }