Getting started

はじめに

Amplify Schedはスケジューリング問題の定式化をサポートするライブラリです。Amplify Schedで定式化されたスケジューリング問題はAmplify Scheduling Engineにてスケジュールの最適化を行うことができます。

スケジューリング問題

スケジューリング問題とは、複数のジョブ (Job) とそれらを処理する複数のマシン (Machine) のスケジュールを決定する問題です。 1つのジョブは、指定されたマシンで指定された時間、複数の処理 (Task) を実行し、すべてのタスクが完了するとジョブが完了します。

Job

複数の Task から構成されます。Job 内の各 Task には順序関係が定められており、その順序で処理を行う必要があります。また同時に複数の Task を行うことはできません。Job 内の Task の順番を Process 1, Process 2, …と呼びます。

Task

Task は Job と Process から一意に決まります。Task の変数として、処理開始時刻、処理終了時刻、処理を行う Machine があります。 処理を行うことができる Machine ごとに、Task の処理時間を設定します。

Machine

Task を処理する機械です。複数の Task を同時に処理することはできません。

スケジューリング問題の評価尺度

Makespan

すべての Job の最後の処理終了時間(メイクスパン)を最小にするスケジュールを探索します。

Amplify Schedによるスケジューリング問題の定式化

Amplify Schedで下記の問題の定式化を行います。

Job name

Process

Machine name

Processing Time

Job A

0

Machine X

10

Job A

1

Machine Y

20

Job A

2

Machine Z

15

Job B

0

Machine Y

10

Job B

1

Machine Z

20

Job B

2

Machine X

15

Job C

0

Machine Z

10

Job C

1

Machine X

20

Job C

2

Machine Y

15

Job D

0

Machine Z

10

Job D

1

Machine Y

20

Job D

2

Machine X

15

from amplify_sched import *
# define Model
model = Model()

# define Jobs
model.jobs.add("Job A")
model.jobs.add("Job B")
model.jobs.add("Job C")
model.jobs.add("Job D")

# define Machines
model.machines.add("Machine X")
model.machines.add("Machine Y")
model.machines.add("Machine Z")

# add Task to Jobs
model.jobs["Job A"].append(Task())
model.jobs["Job A"][0].processing_times["Machine X"] = 10
model.jobs["Job A"].append(Task())
model.jobs["Job A"][1].processing_times["Machine Y"] = 20
model.jobs["Job A"].append(Task())
model.jobs["Job A"][2].processing_times["Machine Z"] = 15

model.jobs["Job B"].append(Task())
model.jobs["Job B"][0].processing_times["Machine Y"] = 10
model.jobs["Job B"].append(Task())
model.jobs["Job B"][1].processing_times["Machine Z"] = 20
model.jobs["Job B"].append(Task())
model.jobs["Job B"][2].processing_times["Machine X"] = 15

model.jobs["Job C"].append(Task())
model.jobs["Job C"][0].processing_times["Machine Z"] = 10
model.jobs["Job C"].append(Task())
model.jobs["Job C"][1].processing_times["Machine X"] = 20
model.jobs["Job C"].append(Task())
model.jobs["Job C"][2].processing_times["Machine Y"] = 15

model.jobs["Job D"].append(Task())
model.jobs["Job D"][0].processing_times["Machine Z"] = 10
model.jobs["Job D"].append(Task())
model.jobs["Job D"][1].processing_times["Machine Y"] = 20
model.jobs["Job D"].append(Task())
model.jobs["Job D"][2].processing_times["Machine X"] = 15
# Enter your token for Amplify Scheduling Engine.
token = "xxxxxxxxxxxxxxxxxxxxxxxxxxx"
gantt = model.solve(token=token, timeout=1)
gantt.timeline()