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)