Scheduling Problems
本章ではいくつかの典型的スケジューリング問題の例とその定式化について扱います。
from amplify_sched import *
token = "xxxxxxxxxxxxxxxxxxxxxxxxx"
Flow Shop Scheduling
Flow Shop Scheduling はスケジューリング問題の一種で以下のように定義されます
定義
m 台の Machine(M_1, M_2, …, M_m)で n 個の Job(J_1, J_2, …, J_n)を処理する
各 Job は m 台すべての Machine を\(M_1\)から順に処理し、これらの Machine の処理順序はすべての Job で同一である
各 Job の各 Machine における処理時間はそれぞれ与えられる
このとき与えられた評価尺度を最適にするような Job の処理順序を求める問題
定式化例
下記の Flow Shop Scheduling の定式化とメイクスパンの最適化を Amplify Sched で行います。
Job name  | 
Process  | 
Machine name  | 
Processing Time  | 
|---|---|---|---|
J1  | 
0  | 
M1  | 
10  | 
J1  | 
1  | 
M2  | 
15  | 
J1  | 
2  | 
M3  | 
20  | 
J2  | 
0  | 
M1  | 
15  | 
J2  | 
1  | 
M2  | 
20  | 
J2  | 
2  | 
M3  | 
10  | 
J3  | 
0  | 
M1  | 
10  | 
J3  | 
1  | 
M2  | 
20  | 
J3  | 
2  | 
M3  | 
15  | 
model = Model()
model.jobs.add("J1")
model.jobs.add("J2")
model.jobs.add("J3")
model.machines.add("M1")
model.machines.add("M2")
model.machines.add("M3")
model.jobs["J1"].append(Task())
model.jobs["J1"][0].processing_times["M1"] = 10
model.jobs["J1"].append(Task())
model.jobs["J1"][1].processing_times["M2"] = 15
model.jobs["J1"].append(Task())
model.jobs["J1"][2].processing_times["M3"] = 20
model.jobs["J2"].append(Task())
model.jobs["J2"][0].processing_times["M1"] = 15
model.jobs["J2"].append(Task())
model.jobs["J2"][1].processing_times["M2"] = 20
model.jobs["J2"].append(Task())
model.jobs["J2"][2].processing_times["M3"] = 10
model.jobs["J3"].append(Task())
model.jobs["J3"][0].processing_times["M1"] = 10
model.jobs["J3"].append(Task())
model.jobs["J3"][1].processing_times["M2"] = 20
model.jobs["J3"].append(Task())
model.jobs["J3"][2].processing_times["M3"] = 15
gantt = model.solve(token=token, timeout=1)
gantt.timeline(machine_view=True)
Job Shop Scheduling
Job Shop Scheduling はスケジューリング問題の一種で以下のように定義されます。
定義
m 台の Machine(M_1, M_2, …, M_m)で n 個の Job(J_1, J_2, …, J_n)を処理する。
各 Job はすべての Machine で一度ずつ処理されるが、その処理順序は Job ごとに異なってもよい
各 Job の各 Machine における処理時間はそれぞれ与えられる
このとき与えられた評価尺度を最適にするような各 Task の開始時刻を求める問題
定式化例
下記の Job Shop Scheduling の定式化とメイクスパンの最適化を 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  | 
model = Model()
model.jobs.add("Job A")
model.jobs.add("Job B")
model.jobs.add("Job C")
model.jobs.add("Job D")
model.machines.add("Machine X")
model.machines.add("Machine Y")
model.machines.add("Machine Z")
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
gantt = model.solve(token=token, timeout=1)
gantt.timeline(machine_view=True)
Flexible Job Shop Scheduling
Flexible Job Shop Scheduling はスケジューリング問題の一種で以下のように定義されます
定義
m 台の Machine(M_1, M_2, …, M_m)で n 個の Job(J_1, J_2, …, J_n)を処理する
各 Job の各 Process は指定されたの Machine で処理される。このときその Process を処理できる Machine の候補を複数定義できる
各 Job の各 Machine における処理時間はそれぞれ与えられる
このとき与えられた評価尺度を最適にするような各 Task の開始時刻と Machine の割り当てを求める問題
定式化例
下記の Flexible Job Shop Scheduling の定式化とメイクスパンの最適化を Amplify Sched で行います。
Job name  | 
Process  | 
Machine name  | 
Processing Time  | 
|---|---|---|---|
Job A  | 
0  | 
Machine X  | 
10  | 
Job A  | 
0  | 
Machine Y  | 
5  | 
Job B  | 
0  | 
Machine X  | 
15  | 
Job B  | 
0  | 
Machine Y  | 
2  | 
Job C  | 
0  | 
Machine Z  | 
10  | 
Job C  | 
0  | 
Machine Y  | 
1  | 
Job A  | 
1  | 
Machine X  | 
20  | 
Job A  | 
1  | 
Machine Y  | 
10  | 
Job B  | 
1  | 
Machine Z  | 
20  | 
Job B  | 
1  | 
Machine Y  | 
10  | 
Job C  | 
1  | 
Machine X  | 
20  | 
Job C  | 
1  | 
Machine Z  | 
10  | 
Job A  | 
2  | 
Machine Z  | 
15  | 
Job B  | 
2  | 
Machine X  | 
15  | 
Job C  | 
2  | 
Machine Y  | 
15  | 
model = Model()
model.jobs.add("Job A")
model.jobs.add("Job B")
model.jobs.add("Job C")
model.machines.add("Machine X")
model.machines.add("Machine Y")
model.machines.add("Machine Z")
model.jobs["Job A"].append(Task())
model.jobs["Job A"][0].processing_times["Machine X"] = 10
model.jobs["Job A"][0].processing_times["Machine Y"] = 5
model.jobs["Job B"].append(Task())
model.jobs["Job B"][0].processing_times["Machine X"] = 15
model.jobs["Job B"][0].processing_times["Machine Y"] = 2
model.jobs["Job C"].append(Task())
model.jobs["Job C"][0].processing_times["Machine Z"] = 10
model.jobs["Job C"][0].processing_times["Machine Y"] = 1
model.jobs["Job A"].append(Task())
model.jobs["Job A"][1].processing_times["Machine X"] = 20
model.jobs["Job A"][1].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"][1].processing_times["Machine Y"] = 10
model.jobs["Job C"].append(Task())
model.jobs["Job C"][1].processing_times["Machine X"] = 20
model.jobs["Job C"][1].processing_times["Machine Z"] = 10
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"][2].processing_times["Machine X"] = 15
model.jobs["Job C"].append(Task())
model.jobs["Job C"][2].processing_times["Machine Y"] = 15
gantt = model.solve(token=token, timeout=1)
gantt.timeline(machine_view=True)