The flexible jobshop scheduling problem benchmark library

The FJSPLib is a benchmark of flexible jobshop problems with their best known solutions to date. Problems come from a variety of publications (all referenced). The best solutions known to date (upper bound and lower bound) are provided with the corresponding publication or engine that attained it.

The data and source code for the optimization models can be found in the Github repository This document is visible as a README.md in the Github folder flexible jobshop or as a webpage

Table of Contents


Overview of the flexible jobshop benchmark library

Flexible jobshop instances (452)

  • 15 instances mk from Brandimarte (1993)
  • 66 x 4 instances (abz, car, la, ft and orb) in 4 variants (edata rdata sdata and vdata) from Hurink, Jurisch and Thole 1994
  • 18 instances #a from Dauzère-Pérès and Paulli (1994)
  • 3 x 7 instances mt, setb4 et seti5 from Chambers and Barnes (1996)
  • 4 instances kacem from Kacem, Hammadi and Borne (2002)
  • 20 instances fattahi from Fattahi, Mehrabad and Jolai (2007)
  • 60 instances behnke from Behnke and Geiger (2012)
  • 50 instances dafjs and yfjs from Birgin et al. 2014

The Hurinkm Jurisch and Thole instances are classic jobshop problems modified into flexible jobshops

Classification of the flexible jobshop instances

We use the following engines as references for the benchmark

  • IBM ILOG CP Optimizer : representative of the CP-scheduling family of engines
  • Google CP-SAT : representative of the lazy clause generation family of engines
  • OptalCP : representative of the lazy clause generation family of engines

We have dropped Cplex from the flexible jobshop tests due to poor performance of linear solvers as reported by multiple authors in the literature and confirmed by ourselves.

Instances are divided into

  • easy : solved to optimality (with proof) in 1 minute by at least 1 reference engine
  • medium : solved to optimality (with proof) in 1 hour by at least 1 reference engine
  • hard : solved to optimality (with proof) in > 1h by at least 1 reference engine
  • closed : allegedly solved to optimality. Most of the time the optimal solution is known because 2 different methods independently found equal upper and lower bounds. The problem moves to hard only when the optimality proof can be reproduced by a reference engine.
  • open : no proof of optimality

Currently the instances divide as follows

  • mk : 9 easy, 2 medium, 1 hard, 3 open
  • abz : 8 easy, 1 medium, 3 hard, 2 closed, 6 open
  • car : 27 easy, 2 medium, 3 closed
  • la : 119 easy, 16 medium, 4 hard, 12 closed, 9 open
  • ft : 12 easy
  • orb : 40 easy
  • #a : 4 easy, 1 medium, 1 hard, 2 closed, 10 open
  • mt : 7 easy
  • setb4 : 7 easy
  • seti5 : 7 easy
  • kacem : 4 easy
  • fattahi : 20 easy
  • behnke : 15 easy, 12 medium, 33 open
  • dafjs : [status unknown]
  • yfjs : [status unknown]
Status distribution by family Status distribution by family easy medium hard closed open 0 32 64 96 128 160 mk 15 abz 20 car 32 la 160 ft 12 orb 40 #a 18 mt 7 setb 7 seti 7 kacem 4 fattahi 20 behnke 60

Formats

There are now three format supported in the FJSPLib

  • the json format
  • the text fjasp format (new format)
  • the text fjsp format (old format)

In the traditional text fjsp format precedences are implicit within the job for the consécutive operations. As a result all the operations of the same job, and all the options (or modes) for an operation need to be on the same line, creating very long lines. In the new format each operation and its different options (modes) appear on one line and the precedences appear later with the job number The new format is also more generic in that it accepts general precedence graphs, therefore also covering flexible jobshop variants like the flexible assembly jobshop problem and the jobshop problem with general precedences (which are essentially the same).

The new format (fajsp)

The new format uses

  • the first line is the header with #operations #precedences #machines
  • #precedences lines of the form x y j where x and y are the indices of 2 operations, and j the number of the job that links them
  • #operations lines of the form #options m1 d1 m2 d2 ... mk dk where $k \in 0 .. \mathtt{#options}-1$, $m_k$ is a machine between $0$ and $\mathtt{#machines}-1$ and $d_k$ is a duration

Notice that the format doesn’t say how many jobs exist in the instance. That number needs to be deduced from the third column of the precedence data.

For instance fattahi1 is

4 2 2
0 1 0
2 3 1
2 0 25 1 37
2 0 32 1 24
2 0 45 1 65
2 0 21 1 65

There are 4 operations from 0 to 3 with 2 options in each operation. There are two jobs 0 -> 1 and 2 -> 3

The old format

In the old format

  • each line represents a job
  • the first number of the line is the number of operations in the job
  • then for each operation is given the number of options and as many pairs machine duration as there are options
#jobs #machines average_flexibility
#operations (#options (duration machine) (duration machine)) (#options (duration machine))

For instance fattahi1 is

2 2 2
2 2 1 25 2 37 2 1 32 2 24
2 2 1 45 2 65 2 1 21 2 65

meaning

  • (2 jobs) (2 machines) (average flexibility 2.0)
  • (2 operations) (2 options : (1,25) (2,37)) (2 options : (1,32) (2,24))
  • (2 operations) (2 options : (1,45) (2,65)) (2 options : (1,21) (2,65))

The JSON format

The JSON format follows closely the new format

For instance fattahi1 is

{
  "instance": "fattahi1",
  "family": "fattahi",
  "family_long": "FattahiMehrabadJolai2007",
  "year": "2007",
  "format": "fajsp",
  "operations": [
    { "operation" : 0, "option" : 0, "machine" : 0, "duration" : 25 },
    { "operation" : 0, "option" : 1, "machine" : 1, "duration" : 37 },
    { "operation" : 1, "option" : 0, "machine" : 0, "duration" : 32 },
    { "operation" : 1, "option" : 1, "machine" : 1, "duration" : 24 },
    { "operation" : 2, "option" : 0, "machine" : 0, "duration" : 45 },
    { "operation" : 2, "option" : 1, "machine" : 1, "duration" : 65 },
    { "operation" : 3, "option" : 0, "machine" : 0, "duration" : 21 },
    { "operation" : 3, "option" : 1, "machine" : 1, "duration" : 65 }
  ],
  "precedences": [
    [0,1,0],
    [2,3,1]
  ]
}


Publications (instances)

The instances come from the following publications

  • Brandimarte, P (1993). Routing and scheduling in a flexible job shop by tabu search. Annals of Operations research, 41(3), 157-183.

  • Hurink, J., Jurisch, B., & Thole, M. (1994). Tabu search for the job-shop scheduling problem with multi-purpose machines. Operations-Research-Spektrum, 15(4), 205-215.

  • Dauzère-Pérès, S., & Paulli, J. (1994). Solving the general multiprocessor job-shop scheduling problem.

  • Chambers, J. B., & Barnes, J. W. (1996). Flexible job shop scheduling by tabu search. The University of Texas, Austin, TX, Technical Report Series ORP96-09, Graduate Program in Operations Research and Industrial Engineering.

  • Kacem, I., Hammadi, S., & Borne, P. (2002). Pareto-optimality approach for flexible job-shop scheduling problems: hybridization of evolutionary algorithms and fuzzy logic. Mathematics and computers in simulation, 60(3-5), 245-276.

  • Fattahi, P., Saidi Mehrabad, M., & Jolai, F. (2007). Mathematical modeling and heuristic approaches to flexible job shop scheduling problems. Journal of intelligent manufacturing, 18(3), 331-342.

  • Behnke, D., & Geiger, M. J. (2012). Test instances for the flexible job shop scheduling problem with work centers Technical report, Helmut-Schmidt-Universität, Lehrstuhl für Betriebswirtschaftslehre, insbes. Logistik-Management, RR 12-01-01.

  • Birgin, E. G., Feofiloff, P., Fernandes, C. G., De Melo, E. L., Oshiro, M. T., & Ronconi, D. P. (2014). A MILP model for an extended version of the flexible job shop problem. Optimization Letters, 8(4), 1417-1431.


Flexible jobshop benchmark

The flexible jobshop benchmark problems have been collected from the literature from 1993 to 2012. Some are modified versions of JSPLIB jobshop problems, but some instances come from industrial problems. On this page we keep track of the best known solutions (BKS) and classify the instances based on difficulty.

An instance is considered

  • easy if it is solved to optimality by a reference engine in < 1 minute
  • medium if it is solved to optimality by a reference engine in < 1h
  • hard if it is solved to optimality by a reference engine in > 1h
  • closed if the combination of upper and lower bounds found in the literature allows concluding the value of the optimal solution is known
  • open otherwise


For each instance we indicate the publication or engine that reaches that bound (lower or upper). When reporting the results:

  • we give priority to engines over publications because of reproductibility of the results
  • we give priority to the fastest engine to attain the bound
  • when an engine attains a bound previously reported in the literature, we attribute the bound to the engine and remove the correponding paper from the list of relevant references

Other databases keep instead the first publication or method to have achieved that bound for historical reference. This work instead is meant for engine and algorithm developers to have means of reproducing the claimed results for comparison.

Best known solutions

If you visualize the markdown in Visual Studio Code you will have colors !

Brandimarte (1993)

InstanceSizeProblemLBUBTypeSolved by
mk0110 x 6fjsp4040easyOptalCP < 1 min
mk0210 x 6fjsp2626easyOptalCP < 1 min
mk0315 x 8fjsp204204easyOptalCP < 1 min
mk0415 x 8fjsp6060easyOptalCP < 1 min
mk0515 x 4fjsp172172easyOptalCP < 1 min
mk0610 x 15fjsp5757mediumOptalCP < 1h
mk0720 x 5fjsp139139mediumOptalCP < 1h
mk0820 x 10fjsp523523easyOptalCP < 1 min
mk0920 x 10fjsp307307easyOptalCP < 1 min
mk1020 x 15fjsp189193openQuintiq
mk1130 x 5fjsp608609openOptalCP
mk1230 x 10fjsp508508easyOptalCP < 1 min
mk1330 x 10fjsp364390openOptalCP
mk1430 x 15fjsp694694easyOptalCP < 1 min
mk1530 x 15fjsp333333hardOptalCP in 2h

Instances mk11 to mk15 are present in the supplementary material of Test Instances for the Flexible Job Shop Scheduling Problem with Work Centers but absent of other problem repositories

Hurink, Jurisch and Thole (1994)

The problems in this benchmark are modified versions of the corresponding jobshop problems. They are divided into

  • sdata : each operation can be assigned to a single machine (jobshop)
  • edata : a few operations can be assigned to many machines
  • rdata : most operations can be assigned to a few machines
  • vdata : all operation can be assigned to many machines
InstanceSizesdataedatardatavdataSolved by
abz510 x 1012341167954859OptalCP
abz610 x 10943925807742OptalCP
abz720 x 15656604 / 610497 / 522492OptalCP, CPO2013 / Quintiq, CdGKGC2025 / DLLSXG2019, Quintiq
abz820 x 15667625 / 636509 / 535506 / 507OptalCP, CPO2013 / Quintiq, CdGKGC2025 / DLLSXG2019, OptalCP / Quintiq
abz920 x 15678644517 / 536497OptalCP, CPO2013, CPO2013 / Quintiq, OptalCP / Quintiq
InstanceSizesdataedatardatavdataSolved by
car111 x 57038617650345005OptalCP, OptalCP / Quintiq
car213 x 47166632759855929OptalCP
car312 x 57312685656225597OptalCP, Quintiq, OptalCP
car414 x 48003778965146514OptalCP
car510 x 67702722956154909OptalCP, OptalCP / CdGKGC2025
car68 x 98313799061475486OptalCP
car77 x 76558612344254281OptalCP
car88 x 88264768956924613OptalCP
InstanceSizesdataedatardatavdataSolved by
la0110 x 5666609570570OptalCP
la0210 x 5655655529529OptalCP
la0310 x 5597550477477OptalCP
la0410 x 5590568502502OptalCP
la0510 x 5593503457457OptalCP
la0615 x 5926833799799OptalCP
la0715 x 5890762749749OptalCP
la0815 x 5863845765765OptalCP
la0915 x 5951878853853OptalCP
la1015 x 5958866804804OptalCP
la1120 x 51222110310711071OptalCP
la1220 x 51039960936936OptalCP
la1320 x 51150105310381038OptalCP
la1420 x 51292112310701070OptalCP
la1520 x 51207111110891089OptalCP
la1610 x 10945892717717OptalCP
la1710 x 10784707646646OptalCP
la1810 x 10848842666663OptalCP
la1910 x 10842796700617OptalCP
la2010 x 10902857756756OptalCP
la2115 x 1010461009809 / 825800OptalCP, CdGKGC2025 / Quintiq, OptalCP
la2215 x 10927880745 / 753733OptalCP, CdGKGC2025 / DLLSXG2019, OptalCP / CPO2013
la2315 x 101032950820 / 831809OptalCP, CdGKGC2025 / DLLSXG2019, OptalCP / Quintiq
la2415 x 10935908780 / 795773OptalCP, CdGKGC2025 / DLLSXG2019, OptalCP / Quintiq
la2515 x 10977936771 / 779751OptalCP, CdGKGC2025 / DLLSXG2019, OptalCP / Quintiq
la2620 x 10121811061056 / 10571052OptalCP, MG2000 / Quintiq, OptalCP
la2720 x 101235118110851084OptalCP, MG2000 / Quintiq, OptalCP
la2820 x 10121611421075 / 10761069OptalCP, CPO2013, MG2000 / Quintiq, OptalCP
la2920 x 1011521107993 / 994993OptalCP, CPO2013, OptalCP / Quintiq
la3020 x 10135511881068 / 10711068OptalCP, CPO2013, OptalCP / Quintiq
la3130 x 101784153215201520OptalCP
la3230 x 101850169816571657OptalCP, OptalCP / Quintiq
la3330 x 101719154714971497OptalCP, OptalCP / Quintiq, OptalCP / MG2000
la3430 x 101721159915351535OptalCP, OptalCP / Quintiq, OptalCP
la3530 x 101888173615491549OptalCP, OptalCP / Quintiq, OptalCP
la3615 x 15126811601023948OptalCP
la3715 x 15139713971062986OptalCP
la3815 x 1511961141954943OptalCP
la3915 x 15123311841011922OptalCP
la4015 x 1512221144955955OptalCP
InstanceSizesdataedatardatavdataSolved by
ft066 x 655554747OptalCP
ft1010 x 10930871686655OptalCP
ft2020 x 51165108810221022OptalCP

FT instances are also known as MT because the 1963 paper of Fisher and Thompson was published in the book “Industrial scheduling” by Muth and Thompson.

InstanceSizesdataedatardatavdataSolved by
orb110 x 101059977746695OptalCP
orb210 x 10888865696620OptalCP
orb310 x 101005951712648OptalCP
orb410 x 101005984753753OptalCP
orb510 x 10887842639584OptalCP
orb610 x 101010958754715OptalCP
orb710 x 10397389302275OptalCP
orb810 x 10899894639573OptalCP
orb910 x 10934933694659OptalCP
orb1010 x 10944933742681OptalCP

Dauzère-Pérès and Paulli (1994)

InstanceSizeProblemLBUBTypeSolved by
01a10 x 5fjsp25052505easyOptalCP < 1 min
02a10 x 5fjsp22282228easyOptalCP < 1 min
03a10 x 5fjsp22282228easyOptalCP < 1 min
04a10 x 5fjsp25032503easyOptalCP < 1 min
05a10 x 5fjsp21952199openCdGKGC2025
06a10 x 5fjsp21642169openCdGKGC2025
07a15 x 8fjsp22162254openCPO2013 / DLLSXG2019
08a15 x 8fjsp20612061hardOptalCP in 10h
09a15 x 8fjsp20612061mediumOptalCP < 1h
10a15 x 8fjsp22122241openCPO2013 / Quintiq
11a15 x 8fjsp20192037openCdGKGC2025 / Quintiq
12a15 x 8fjsp19691984openOptalCP / Quintiq
13a20 x 10fjsp22062236openCdGKGC2025 / DLLSXG2019
14a20 x 10fjsp21612161closedOptalCP / Quintiq
15a20 x 10fjsp21612161closedOptalCP / Quintiq
16a20 x 10fjsp22022231openCdGKGC2025 / Quintiq
17a20 x 10fjsp20892105openCdGKGC2025 / Quintiq
18a20 x 10fjsp20572070openOptalCP / Quintiq

Chambers and Barnes (1996)

InstanceSizeProblemLBUBTypeSolved by
mt10c110 x 11fjsp927927easyOptalCP < 1 min
mt10cc10 x 12fjsp908908easyOptalCP < 1 min
mt10x10 x 11fjsp918918easyOptalCP < 1 min
mt10xx10 x 12fjsp918918easyOptalCP < 1 min
mt10xxx10 x 13fjsp918918easyOptalCP < 1 min
mt10xy10 x 12fjsp905905easyOptalCP < 1 min
mt10xyz10 x 13fjsp847847easyOptalCP < 1 min
setb4c915 x 11fjsp914914easyOptalCP < 1 min
setb4cc15 x 12fjsp907907easyOptalCP < 1 min
setb4x15 x 11fjsp925925easyOptalCP < 1 min
setb4xx15 x 12fjsp925925easyOptalCP < 1 min
setb4xxx15 x 13fjsp925925easyOptalCP < 1 min
setb4xy15 x 12fjsp910910easyOptalCP < 1 min
setb4xyz15 x 13fjsp902902easyOptalCP < 1 min
seti5c1215 x 16fjsp11691169easyOptalCP < 1 min
seti5cc15 x 17fjsp11351135easyOptalCP < 1 min
seti5x15 x 16fjsp11981198easyOptalCP < 1 min
seti5xx15 x 17fjsp11941194easyOptalCP < 1 min
seti5xxx15 x 18fjsp11941194easyOptalCP < 1 min
seti5xy15 x 17fjsp11351135easyOptalCP < 1 min
seti5xyz15 x 18fjsp11251125easyOptalCP < 1 min

Kacem, Hammadi and Borne (2002)

InstanceSizeProblemLBUBTypeSolved by
kacem14 x 6fjsp1111easyOptalCP < 1 min
kacem210 x 7fjsp1111easyOptalCP < 1 min
kacem310 x 10fjsp77easyOptalCP < 1 min
kacem415 x 10fjsp1111easyOptalCP < 1 min

Fattahi, Mehrabad and Jolai (2007)

InstanceSizeProblemLBUBTypeSolved by
fattahi12 x 2fjsp6666easyOptalCP < 1 min
fattahi22 x 2fjsp107107easyOptalCP < 1 min
fattahi33 x 2fjsp221221easyOptalCP < 1 min
fattahi43 x 2fjsp355355easyOptalCP < 1 min
fattahi53 x 2fjsp119119easyOptalCP < 1 min
fattahi63 x 2fjsp320320easyOptalCP < 1 min
fattahi73 x 5fjsp397397easyOptalCP < 1 min
fattahi83 x 4fjsp253253easyOptalCP < 1 min
fattahi93 x 3fjsp210210easyOptalCP < 1 min
fattahi104 x 5fjsp516516easyOptalCP < 1 min
fattahi115 x 6fjsp468468easyOptalCP < 1 min
fattahi125 x 7fjsp446446easyOptalCP < 1 min
fattahi136 x 7fjsp466466easyOptalCP < 1 min
fattahi147 x 7fjsp554554easyOptalCP < 1 min
fattahi157 x 7fjsp514514easyOptalCP < 1 min
fattahi168 x 7fjsp634634easyOptalCP < 1 min
fattahi178 x 7fjsp879879easyOptalCP < 1 min
fattahi189 x 8fjsp884884easyOptalCP < 1 min
fattahi1911 x 8fjsp10551055easyOptalCP < 1 min
fattahi2012 x 8fjsp11961196easyOptalCP < 1 min

Behnke and Geiger (2012)

InstanceSizeProblemLBUBTypeSolved by
behnke110 x 20fjsp9090easyOptalCP < 1 min
behnke210 x 20fjsp9191easyOptalCP < 1 min
behnke310 x 20fjsp9191easyOptalCP < 1 min
behnke410 x 20fjsp9797easyOptalCP < 1 min
behnke510 x 20fjsp9191easyOptalCP < 1 min
behnke620 x 20fjsp125125mediumOptalCP < 1h
behnke720 x 20fjsp117124openOptalCP
behnke820 x 20fjsp123123mediumOptalCP < 1h
behnke920 x 20fjsp125125mediumOptalCP < 1h
behnke1020 x 20fjsp127127mediumOptalCP < 1h
behnke1150 x 20fjsp163228openOptalCP
behnke1250 x 20fjsp157219openOptalCP
behnke1350 x 20fjsp160229openOptalCP
behnke1450 x 20fjsp164230openOptalCP
behnke1550 x 20fjsp159228openOptalCP
behnke16100 x 20fjsp327412openOptalCP
behnke17100 x 20fjsp320401openOptalCP
behnke18100 x 20fjsp321396openOptalCP
behnke19100 x 20fjsp323400openOptalCP
behnke20100 x 20fjsp322398openOptalCP
behnke2110 x 40fjsp8585easyOptalCP < 1 min
behnke2210 x 40fjsp8787easyOptalCP < 1 min
behnke2310 x 40fjsp8585easyOptalCP < 1 min
behnke2410 x 40fjsp8787easyOptalCP < 1 min
behnke2510 x 40fjsp8787easyOptalCP < 1 min
behnke2620 x 40fjsp113113mediumOptalCP < 1h
behnke2720 x 40fjsp122122mediumOptalCP < 1h
behnke2820 x 40fjsp114114mediumOptalCP < 1h
behnke2920 x 40fjsp114117openOptalCP
behnke3020 x 40fjsp120120mediumOptalCP < 1h
behnke3150 x 40fjsp108226openOptalCP
behnke3250 x 40fjsp101224openOptalCP
behnke3350 x 40fjsp107224openOptalCP
behnke3450 x 40fjsp110223openOptalCP
behnke3550 x 40fjsp101214openOptalCP
behnke36100 x 40fjsp152388openOptalCP
behnke37100 x 40fjsp153391openOptalCP
behnke38100 x 40fjsp151389openOptalCP
behnke39100 x 40fjsp153389openOptalCP
behnke40100 x 40fjsp156419openOptalCP
behnke4110 x 60fjsp8787easyOptalCP < 1 min
behnke4210 x 60fjsp8787easyOptalCP < 1 min
behnke4310 x 60fjsp8686easyOptalCP < 1 min
behnke4410 x 60fjsp8484easyOptalCP < 1 min
behnke4510 x 60fjsp8787easyOptalCP < 1 min
behnke4620 x 60fjsp114114mediumOptalCP < 1h
behnke4720 x 60fjsp117117mediumOptalCP < 1h
behnke4820 x 60fjsp120125openOptalCP
behnke4920 x 60fjsp113113mediumOptalCP < 1h
behnke5020 x 60fjsp123123mediumOptalCP < 1h
behnke5150 x 60fjsp98218openOptalCP
behnke5250 x 60fjsp116212openOptalCP
behnke5350 x 60fjsp108215openOptalCP
behnke5450 x 60fjsp103223openOptalCP
behnke5550 x 60fjsp110223openOptalCP
behnke56100 x 60fjsp103390openOptalCP
behnke57100 x 60fjsp99390openOptalCP
behnke58100 x 60fjsp100397openOptalCP
behnke59100 x 60fjsp113398openOptalCP
behnke60100 x 60fjsp101402openOptalCP

Publications (best known solutions)

The upper and lower bounds come from

  • MG2000 (4 bounds in la) : M. Mastrolilli, L. Gambardella, Effective neighbourhood functions for the flexible job shop problem, Journal of Scheduling 3 (2000) 3–20

  • Quintiq (33 bounds in #a, abz, car, la, mk) : Quintiq http://www.quintiq.com/optimization/fjssp-world-records.html (2013) - this site doesn’t exist anymore

  • CPO2013 (10 bounds in #a, abz, la) : Jean-François Puget Solving flexible job shop scheduling problems (cp optimizer 12.6) https://www.ibm.com/developerworks/community/blogs/jfp/entry/solving_flexible_job_shop_scheduling_problems?lang=en (2013) - this site doesn’t exist anymore

  • DLLSXG2019 (8 bounds in #a, abz, la) : J. Ding, Z. Lu, C.-M. Li, L. Shen, L. Xu, F. Glover (2019) A two-individual based evolutionary algorithm for the flexible job shop scheduling problem, in: Proceedings of the AAAI Conference on Artificial Intelligence, Vol. 33, 2019, pp. 2262–2271

  • CdGKGC2025 (14 bounds in #a, abz, car, la) : Marc-Emmanuel Coupvent des Graviers, Lotfi Kobrosly, Christophe Guettier, and Tristan Cazenave (2025). Updating Lower and Upper Bounds for the Job-Shop Scheduling Problem Test Instances CoRR abs/2504.16106

All other bounds were found with OptalCP