{
"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]}
Start=%{base}
Finish=%{x}
Job=%{y}
Process=%{customdata[1]}
Start=%{base}
Finish=%{x}
Job=%{y}
Process=%{customdata[1]}