p8 | Job Shop Scheduling Problem (JSSP)¶
See also
This problem is sourced from EvoCut.
Note
We add the implicit assumptions: there is at least one job and machine, processing times \(p_{j,k} \ge 0\), and \(Om\) encodes a valid JSSP instance. To be a valid JSSP instance, each job has exactly one operation assigned per machine.
EvoCut arXiv submissions
v1cut EC3 has an ambiguous interpretation and is excluded.
Description¶
The Job Shop Scheduling Problem (JSSP) is a classic NP-hard combinatorial optimization problem. It involves scheduling a set of jobs on multiple machines, where each job comprises a sequence of operations that must be processed in a specified order on designated machines. The objective is to minimize the makespan (the completion time of the last operation), ensuring that each machine handles at most one operation at a time.
Formulations¶
Formulation a (valid)¶
See also
This formulation is sourced from EvoCut.
Note
This is the MILP formulation given in Section F.4 of EvoCut arXiv submissions
v1. We make one modification to better match the FormulationBench JSON format. The original formulation defines \(\mathcal{P}\) as the set of distinct ordered pairs \((j_1, k_1), (j_2, k_2)\) that require the same machine. Instead, we define \(Om_{j,k}\) to be the machine that the \(k\)-th operation of job \(j\) is assigned to.
Parameters¶
Name |
Description |
Type |
Shape |
|---|---|---|---|
|
Number of jobs |
integer |
scalar |
|
Number of machines |
integer |
scalar |
|
Processing time of the k-th operation of job j |
continuous |
|
|
Machine index assigned to the k-th operation of job j |
integer |
|
Definitions¶
Name |
Description |
Formulation |
|---|---|---|
|
Set of conflict pairs: all ((j1,k1),(j2,k2)) with j1!=j2 or k1!=k2 that share the same machine |
\(\mathcal{P} = \{((j_1,k_1),(j_2,k_2)) : Om_{j_1,k_1} = Om_{j_2,k_2},\; (j_1,k_1) \prec_{\mathrm{lex}} (j_2,k_2)\}\) |
|
Big-M constant: sum of all processing times |
\(M = \sum_{j=0}^{n-1} \sum_{k=0}^{m-1} p_{j,k}\) |
Variables¶
Name |
Description |
Type |
Shape / Indices |
|---|---|---|---|
|
Start time of the k-th operation of job j |
continuous |
|
|
1 if operation (j1,k1) is scheduled before (j2,k2) on their shared machine, 0 otherwise; indexed over conflict pairs P |
binary |
|
|
Makespan: completion time of the last operation across all jobs |
continuous |
scalar |
Assumptions¶
Description |
Formulation |
Implicit |
|---|---|---|
Processing times are non-negative. |
\(p_{j,k} \geq 0 \quad \forall j,k\) |
yes |
There is at least one job and one machine. |
\(n \geq 1, \; m \geq 1\) |
yes |
Each operation is assigned to exactly one machine (Om is a total function into machines). |
\(\forall j,k: \; \exists!\, i: \; Om_{j,k} = i\) |
yes |
For each job, its operations visit every machine exactly once (Om[j] is a permutation of the machine set). |
\(\forall j, i: \; \exists!\, k: \; Om_{j,k} = i\) |
yes |
Constraints¶
Technological ordering: each operation in a job must start after the previous operation finishes.
\[ S_{j,k+1} \ge S_{j,k} + p_{j,k} \quad \forall j,\; k = 0,\dots,m-2 \]Machine non-overlap (forward): if y=1, operation (j1,k1) precedes (j2,k2) on their shared machine.
\[ S_{j_1,k_1} + p_{j_1,k_1} \le S_{j_2,k_2} + M(1 - y_{j_1,k_1,j_2,k_2}) \quad \forall ((j_1,k_1),(j_2,k_2)) \in \mathcal{P} \]Machine non-overlap (reverse): if y=0, operation (j2,k2) precedes (j1,k1) on their shared machine.
\[ S_{j_2,k_2} + p_{j_2,k_2} \le S_{j_1,k_1} + M\,y_{j_1,k_1,j_2,k_2} \quad \forall ((j_1,k_1),(j_2,k_2)) \in \mathcal{P} \]Makespan lower bound: the makespan is at least the completion time of each job’s last operation.
\[ C_{\max} \ge S_{j,m-1} + p_{j,m-1} \quad \forall j \]Start times are non-negative.
\[ S_{j,k} \ge 0 \quad \forall j, k \]Makespan is non-negative.
\[ C_{\max} \ge 0 \]
Objective¶
Minimize the makespan.
Formulation b (valid)¶
See also
This formulation is sourced from EvoCut (version: 1, name: EC1).
Note
The makespan is at least the average per-machine processing time, taken across all operations and machines.
EC1 is identical in EvoCut arXiv submissions
v1andv2and is included once as this formulation.
Parameters¶
Name |
Description |
Type |
Shape |
|---|---|---|---|
|
Number of jobs |
integer |
scalar |
|
Number of machines |
integer |
scalar |
|
Processing time of the k-th operation of job j |
continuous |
|
|
Machine index assigned to the k-th operation of job j |
integer |
|
Definitions¶
Name |
Description |
Formulation |
|---|---|---|
|
Set of conflict pairs: all ((j1,k1),(j2,k2)) with j1!=j2 or k1!=k2 that share the same machine |
\(\mathcal{P} = \{((j_1,k_1),(j_2,k_2)) : Om_{j_1,k_1} = Om_{j_2,k_2},\; (j_1,k_1) \prec_{\mathrm{lex}} (j_2,k_2)\}\) |
|
Big-M constant: sum of all processing times |
\(M = \sum_{j=0}^{n-1} \sum_{k=0}^{m-1} p_{j,k}\) |
Variables¶
Name |
Description |
Type |
Shape / Indices |
|---|---|---|---|
|
Start time of the k-th operation of job j |
continuous |
|
|
1 if operation (j1,k1) is scheduled before (j2,k2) on their shared machine, 0 otherwise; indexed over conflict pairs P |
binary |
|
|
Makespan: completion time of the last operation across all jobs |
continuous |
scalar |
Assumptions¶
Description |
Formulation |
Implicit |
|---|---|---|
Processing times are non-negative. |
\(p_{j,k} \geq 0 \quad \forall j,k\) |
yes |
There is at least one job and one machine. |
\(n \geq 1, \; m \geq 1\) |
yes |
Each operation is assigned to exactly one machine (Om is a total function into machines). |
\(\forall j,k: \; \exists!\, i: \; Om_{j,k} = i\) |
yes |
For each job, its operations visit every machine exactly once (Om[j] is a permutation of the machine set). |
\(\forall j, i: \; \exists!\, k: \; Om_{j,k} = i\) |
yes |
Constraints¶
Technological ordering: each operation in a job must start after the previous operation finishes.
\[ S_{j,k+1} \ge S_{j,k} + p_{j,k} \quad \forall j,\; k = 0,\dots,m-2 \]Machine non-overlap (forward): if y=1, operation (j1,k1) precedes (j2,k2) on their shared machine.
\[ S_{j_1,k_1} + p_{j_1,k_1} \le S_{j_2,k_2} + M(1 - y_{j_1,k_1,j_2,k_2}) \quad \forall ((j_1,k_1),(j_2,k_2)) \in \mathcal{P} \]Machine non-overlap (reverse): if y=0, operation (j2,k2) precedes (j1,k1) on their shared machine.
\[ S_{j_2,k_2} + p_{j_2,k_2} \le S_{j_1,k_1} + M\,y_{j_1,k_1,j_2,k_2} \quad \forall ((j_1,k_1),(j_2,k_2)) \in \mathcal{P} \]Makespan lower bound: the makespan is at least the completion time of each job’s last operation.
\[ C_{\max} \ge S_{j,m-1} + p_{j,m-1} \quad \forall j \]Start times are non-negative.
\[ S_{j,k} \ge 0 \quad \forall j, k \]Makespan is non-negative.
\[ C_{\max} \ge 0 \]Average Load Bound (EC1): the makespan is at least the average total processing time per machine.
\[ C_{\max} \ge \frac{1}{m} \sum_{j=0}^{n-1} \sum_{k=0}^{m-1} p_{j,k} \]
Objective¶
Minimize the makespan.
Formulation c (valid)¶
See also
This formulation is sourced from EvoCut (version: 1, name: EC2).
Note
For each machine, the makespan is at least the total processing time of operations assigned to it, plus the minimum head (earliest a machine’s operation can start within its job) and minimum tail (latest a machine’s operation finishes before its job ends) across those operations.
EC2 is identical in EvoCut arXiv submissions
v1andv2and is included once as this formulation.
Parameters¶
Name |
Description |
Type |
Shape |
|---|---|---|---|
|
Number of jobs |
integer |
scalar |
|
Number of machines |
integer |
scalar |
|
Processing time of the k-th operation of job j |
continuous |
|
|
Machine index assigned to the k-th operation of job j |
integer |
|
Definitions¶
Name |
Description |
Formulation |
|---|---|---|
|
Set of conflict pairs: all ((j1,k1),(j2,k2)) with j1!=j2 or k1!=k2 that share the same machine |
\(\mathcal{P} = \{((j_1,k_1),(j_2,k_2)) : Om_{j_1,k_1} = Om_{j_2,k_2},\; (j_1,k_1) \prec_{\mathrm{lex}} (j_2,k_2)\}\) |
|
Big-M constant: sum of all processing times |
\(M = \sum_{j=0}^{n-1} \sum_{k=0}^{m-1} p_{j,k}\) |
|
Set of operations assigned to machine i: pairs (j,k) with Om_{j,k} = i |
\(O_i = \{ (j,k) : Om_{j,k} = i \} \quad \forall i \in \{0, \dots, m-1\}\) |
|
Head of operation (j,k): total processing time of earlier operations in job j |
\(h_{j,k} = \sum_{t=0}^{k-1} p_{j,t} \quad \forall j, k\) |
|
Tail of operation (j,k): total processing time of later operations in job j |
\(\tau_{j,k} = \sum_{t=k+1}^{m-1} p_{j,t} \quad \forall j, k\) |
Variables¶
Name |
Description |
Type |
Shape / Indices |
|---|---|---|---|
|
Start time of the k-th operation of job j |
continuous |
|
|
1 if operation (j1,k1) is scheduled before (j2,k2) on their shared machine, 0 otherwise; indexed over conflict pairs P |
binary |
|
|
Makespan: completion time of the last operation across all jobs |
continuous |
scalar |
Assumptions¶
Description |
Formulation |
Implicit |
|---|---|---|
Processing times are non-negative. |
\(p_{j,k} \geq 0 \quad \forall j,k\) |
yes |
There is at least one job and one machine. |
\(n \geq 1, \; m \geq 1\) |
yes |
Each operation is assigned to exactly one machine (Om is a total function into machines). |
\(\forall j,k: \; \exists!\, i: \; Om_{j,k} = i\) |
yes |
For each job, its operations visit every machine exactly once (Om[j] is a permutation of the machine set). |
\(\forall j, i: \; \exists!\, k: \; Om_{j,k} = i\) |
yes |
Constraints¶
Technological ordering: each operation in a job must start after the previous operation finishes.
\[ S_{j,k+1} \ge S_{j,k} + p_{j,k} \quad \forall j,\; k = 0,\dots,m-2 \]Machine non-overlap (forward): if y=1, operation (j1,k1) precedes (j2,k2) on their shared machine.
\[ S_{j_1,k_1} + p_{j_1,k_1} \le S_{j_2,k_2} + M(1 - y_{j_1,k_1,j_2,k_2}) \quad \forall ((j_1,k_1),(j_2,k_2)) \in \mathcal{P} \]Machine non-overlap (reverse): if y=0, operation (j2,k2) precedes (j1,k1) on their shared machine.
\[ S_{j_2,k_2} + p_{j_2,k_2} \le S_{j_1,k_1} + M\,y_{j_1,k_1,j_2,k_2} \quad \forall ((j_1,k_1),(j_2,k_2)) \in \mathcal{P} \]Makespan lower bound: the makespan is at least the completion time of each job’s last operation.
\[ C_{\max} \ge S_{j,m-1} + p_{j,m-1} \quad \forall j \]Start times are non-negative.
\[ S_{j,k} \ge 0 \quad \forall j, k \]Makespan is non-negative.
\[ C_{\max} \ge 0 \]Machine Critical-Path Bound (EC2): for each machine, the makespan is at least the total load on that machine plus the minimum head and minimum tail of its operations across all jobs.
\[ C_{\max} \ge \sum_{(j,k)\in O_i} p_{j,k} + \min_{(j,k)\in O_i} h_{j,k} + \min_{(j,k)\in O_i} \tau_{j,k} \quad \forall i \in \{0, \dots, m-1\} \]
Objective¶
Minimize the makespan.
Formulation d (valid)¶
See also
This formulation is sourced from EvoCut (version: 2, name: EC3).
Note
The makespan is at least the total processing time of each individual job’s chain of operations.
Parameters¶
Name |
Description |
Type |
Shape |
|---|---|---|---|
|
Number of jobs |
integer |
scalar |
|
Number of machines |
integer |
scalar |
|
Processing time of the k-th operation of job j |
continuous |
|
|
Machine index assigned to the k-th operation of job j |
integer |
|
Definitions¶
Name |
Description |
Formulation |
|---|---|---|
|
Set of conflict pairs: all ((j1,k1),(j2,k2)) with j1!=j2 or k1!=k2 that share the same machine |
\(\mathcal{P} = \{((j_1,k_1),(j_2,k_2)) : Om_{j_1,k_1} = Om_{j_2,k_2},\; (j_1,k_1) \prec_{\mathrm{lex}} (j_2,k_2)\}\) |
|
Big-M constant: sum of all processing times |
\(M = \sum_{j=0}^{n-1} \sum_{k=0}^{m-1} p_{j,k}\) |
Variables¶
Name |
Description |
Type |
Shape / Indices |
|---|---|---|---|
|
Start time of the k-th operation of job j |
continuous |
|
|
1 if operation (j1,k1) is scheduled before (j2,k2) on their shared machine, 0 otherwise; indexed over conflict pairs P |
binary |
|
|
Makespan: completion time of the last operation across all jobs |
continuous |
scalar |
Assumptions¶
Description |
Formulation |
Implicit |
|---|---|---|
Processing times are non-negative. |
\(p_{j,k} \geq 0 \quad \forall j,k\) |
yes |
There is at least one job and one machine. |
\(n \geq 1, \; m \geq 1\) |
yes |
Each operation is assigned to exactly one machine (Om is a total function into machines). |
\(\forall j,k: \; \exists!\, i: \; Om_{j,k} = i\) |
yes |
For each job, its operations visit every machine exactly once (Om[j] is a permutation of the machine set). |
\(\forall j, i: \; \exists!\, k: \; Om_{j,k} = i\) |
yes |
Constraints¶
Technological ordering: each operation in a job must start after the previous operation finishes.
\[ S_{j,k+1} \ge S_{j,k} + p_{j,k} \quad \forall j,\; k = 0,\dots,m-2 \]Machine non-overlap (forward): if y=1, operation (j1,k1) precedes (j2,k2) on their shared machine.
\[ S_{j_1,k_1} + p_{j_1,k_1} \le S_{j_2,k_2} + M(1 - y_{j_1,k_1,j_2,k_2}) \quad \forall ((j_1,k_1),(j_2,k_2)) \in \mathcal{P} \]Machine non-overlap (reverse): if y=0, operation (j2,k2) precedes (j1,k1) on their shared machine.
\[ S_{j_2,k_2} + p_{j_2,k_2} \le S_{j_1,k_1} + M\,y_{j_1,k_1,j_2,k_2} \quad \forall ((j_1,k_1),(j_2,k_2)) \in \mathcal{P} \]Makespan lower bound: the makespan is at least the completion time of each job’s last operation.
\[ C_{\max} \ge S_{j,m-1} + p_{j,m-1} \quad \forall j \]Start times are non-negative.
\[ S_{j,k} \ge 0 \quad \forall j, k \]Makespan is non-negative.
\[ C_{\max} \ge 0 \]Longest Job Bound (EC3): the makespan is at least the total processing time of each job chain.
\[ C_{\max} \ge \sum_{k=0}^{m-1} p_{j,k} \quad \forall j \]
Objective¶
Minimize the makespan.