Skip to the content.

The flexible jobshop scheduling problem benchmark library

FJSPLib is a comprehensive benchmark library for the Flexible Job Shop Scheduling Problem (FJSP), with three components:

The data and source code 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. Instances are now available in json or text formats. The standardized benchmark results for each engine on each instance is available in json format. And a json file of best known solutions is also provided with a trace of the evolution of the bounds.

Table of Contents


Overview of the flexible jobshop benchmark library

Flexible jobshop with machine-independent processing times (264)

Flexible jobshop instances (138)

Flexible assembly jobshop (50)


Classification of the flexible jobshop instances

The reference engines used are

We use the following criteria to classify instances by difficulty

The 10 minutes time limit reflects industrial workflows in which schedules are repeatedly regenerated after manual adjustments, parameter tuning, or changes in production data. Furthermore, problems that can be solved to optimality in less than 10 minutes are suitable as sub-problems in decomposition methods like Benders decomposition, Pareto frontier generation or rolling-horizon optimization.

What we expect from a scheduling engine is:

Why upper and lower bounds ? Because a decomposition may use the scheduling problem as a dual certificate, not only a primal one.


Currently the instances are distributed as follows

machine-independent flexible jobshop

flexible jobshop

Flexible jobshop with arbitrary precedence graphs / flexible assembly jobshop


Similar work

We have borrowed data and ideas from the following sources

Quintiq (2012 - 2014)

Around 2012, the Dutch company Quintiq started keeping track of the best known solutions for flexible jobshop problems (Barnes, Brandimarte, Dauzère and Hurink). Quintiq kept track of the lower and upper bounds, reference and date of the result. They also provided the instances and proven optimal solutions. Quintiq work is still visible thanks to the Internet Wayback Machine.

Jean-François Puget (2013)

In November 2013 Jean-François Puget benchmarked IBM ILOG CP Optimizer 12.6 on the same instances that Quintiq had worked on, improving 100 bounds and closing 69 new instances.

Time-limit %Opt #Improved LB #Improved UB #NewClosed
15mn 64.2% 48 20 52
3h 68.7% 56 35 65
24h 70.0% 59 41 69

JFP highlights the importance of clearly stated experimental protocols

A direct comparison between Quintiq Optimizer and CP Optimizer is difficult to perform because (1) the Quintiq page does not describe the experimental protocol and (2) Quintiq results are only available for the instances that were improved by Quintiq Optimizer. Nevertheless, on these instances improved by Quintiq optimizer, CP Optimizer is worse than Quintiq optimizer on 11 instances and is better on 24 instances.

Naderi, Ruiz and Roshanei (2022)

Our work was inspired by the outstanding work of Naderi, Ruiz and Roshanaei Mixed-Integer Programming versus Constraint Programming for shop scheduling problems : New Results and Outlook [NRR2022] which compares CPO, Cplex, Gurobi and OR-tools on a benchmark of 6623 instances over 17 benchmarks with a timeout of 1h. They have made all the raw results available

Scheduling Lab (2022 - present)

SchedulingLab collects instances of various types of scheduling problems, including instances not referenced here.

Dauzère-Perès, Ding, Shen and Tamssaouet and (2024)

The paper The flexible job shop scheduling problem: A review is an in-depht overview of the state-of-the-art for flexible jobshop and its variants. The supplementary material contains a summary of the best known solutions at the time of publication.


Formats

There are now three format supported in the FJSPLib

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" : [
	   { "before" : 0, "after" : 1, "job" : 0},
	   { "before" : 2, "after" : 3, "job" : 1}
   ]
}

The fjsp format

In the fjsp format

#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

The fajsp format

The fasp format uses

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


Publications (instances)

The instances come from the following publications


Standardized benchmark of engines

We track the State-Of-The-Art (SOTA) of optimization engines for scheduling with a standardized 10-minute benchmark of the reference engines

The engines that are benchmarked are


A short history of the reference engines

IBM ILOG Cplex (1988 - present)

Cplex is a MIP engine founded by Robert Bixby in 1987, and acquired in 1997 by ILOG, subsequently acquired by IBM in 2009.

Like similar state-of-the-art MIP engines, Cplex features

Improvements in a complex software like Cplex are incremental, but we can broadly divide its evolution as follows

From 2008, Bixby, Rothberg and Gu created Gurobi.

References


IBM ILOG CP Optimizer (2007 - present)

CP Optimizer is a descendant of ILOG Solver (architectured over the years by Jean-François Puget, Jean-Charles Régin and later Laurent Perron) and ILOG Scheduler (architectured by Claude Le Pape, then Philippe Laborie). CP Optimizer (led by Paul Shaw, Laurent Perron and Philippe Laborie) merged the general CP engine and the specific scheduling add-on in a single engine, promoted the model-and-run approach and pioneered a new scheduling language (optional intervals, noOverlap, cumulative functions, etc.) that has become an industry standard.

From a technical perspective CP Optimizer interleaves the following search methods

The temporal linear relaxation solved by an LP and objective landscapes act like a reduced cost / impact based oracle but for scheduling problems.

Because CP Optimizer was designed in a time where multi-core computers weren’t common, the engine alternates the different strategies on the same core. And replicates itself over various cores with different parameters if more cores are available

The main propagation algorithms in CP optimizer are

References


Google ORTools CP-SAT (2017 - present)

CP-SAT is an open-source lazy clause generation engine augmented with an LP, MIP-style cuts and CP-style propagators designed by Laurent Perron, Frédéric Didier and Steven Gay.

CP-SAT includes

CP-SAT is the “successor” of a more traditional CP + LS engine by Laurent Perron and Vincent Furnon, focusing more on VRP problems.

CP-SAT team doesn’t publish much about how CP SAT works, but maintains very informative comments in the source code. Here is an overview of the files and what they contain

Constraint Main source files Implemented algorithms
NoOverlap disjunctive.cc Detectable precedences, Edge Finding, Not-First/Not-Last, overload checking
Cumulative cumulative.cc, timetable.cc, timetable_edgefinding.cc Time-table propagation, Edge Finding, energetic reasoning
NoOverlap2D diffn.cc DiffN filtering, energetic reasoning
Circuit circuit.cc SCC detection, subtour elimination
AllDifferent all_different.cc Matching-based filtering, binary decomposition in some cases
Linear integer_expr.cc, linear_constraint.cc Integer propagation, pseudo-Boolean reasoning
Element element.cc Bounds consistency
Automaton table.cc, automaton.cc DFA propagation
Table table.cc Compact table propagation
Reservoir reservoir.cc Specialized cumulative reasoning

The paper From Literals to Atomic Constraints: Generalising Conflict-Driven Clause Learning for Constraint Programming contains a comparison of the implementation of various LCG-based CP solvers.

OR-Tools only creates literals for decisions. However, OR-Tools often decomposes constraints into a SAT representation, leading to more existing literals than only decision literals. During conflict analysis, an atomic constraint with no associated literal is repeatedly replaced with its reason until only existing literals are left. OR-Tools’s approach has the benefits that 1) it only creates literals that are “important” enough to be decisions, and 2) decomposed constraints ensure that there are enough literals for conflict analysis. However, OR-Tools suffers from the fact that 1) limiting created literals can lead to less general nogoods, and 2) since explanations are resolved until consisting of existing literals, explanation lifting and nogood minimisation can have less impact

The presolver of CP-SAT does a significant amount of work, closer to a MIP than a typical CP engine

Moreover some of the classic scheduling algorithms have been transformed into cutting planes (scheduling_cuts.cc) : energetic reasoning, time-table propagation, cumulative precedence, cumulative completion time, energetic reasoning for disjunctive resources.

References


OptalCP (2021 - present)

OptalCP was architectured by Petr Vilim, Nicolas Bonifas and Diego Olivier Fernandez Pons (initially with input from Philippe Laborie). Compared to CPO the parallelism is done with one strategy per core instead of interleaving. The strategies used are

OptalCP continues the legacy of CP Optimizer (engine style, modeling language). The hybridization of OptalCP with heuristics and meta-heuristics is done outside by communicating upper and lower bounds in real time (during search)

References


If your name appears in this section and you notice an error contact me


Comparison of reference solvers

We adopt the following metrics to compare the engines

\[LB_{avg} = \exp\left(\sum_k\log\frac{LB}{LB_{best}}\right)\] \[UB_{avg} = \exp\left(\sum_k\log\frac{UB}{UB_{best}}\right)\] \[GAP = \exp\left(\sum_k\log\left(1 + \frac{UB - LB}{UB}\right)\right) - 1\]


Comparisons were performed on a Windows PC with an i7 4-core 3GHz 32GB ram in 600 seconds

The raw data is in the solutions folder

We recommend to run your own benchmarks on your own machines. All required code is provided with HOWTO instructions in each README file.

Important caveats


Best known solutions

In this section are collected the best known solutions (upper and lower bound) for each problem in the benchmark.

The solutions may come from

The type of hardware and time required to find the best known solution are difficult to track and compare, in particular for bounds coming from published papers. Which is why


We do not systematically run the instances for very long times on large machines. Most of the instances that appear as having been solved after a large comptation time (eg. 40h) had peculiarities (e.g. best lb + 1 == best ub) that justified exploring how long it would take to solve them to optimality. We also devote more effort to solve instances which best known solutions are given by papers that are old, difficult to find and difficlt to reproduce. This allows verifying the paper claims and having a more accessible way of generating the result.


Best known solutions json format

The best known solutions are now collected in a json file with the following syntax

{
    "instance":"dpp06a",
    "size":"10 x 5",
    "type":"flexible jobshop",
    "family":"dpp",
    "family_long":"Dauzère-Pérès and Paulli (1994)",
    "status":"open",
    "lower_bound":2164,
    "upper_bound":2169,
    "lb_data":[{
        "value":2164,
        "date":"2026-01-01",
        "solver":"CdGKGC2025",
        "time":"?",
        "hardware":"?",
        "certificate":"no"
    }],
    "ub_data":[{
        "value":2169,
        "date":"2026-01-01",
        "solver":"CdGKGC2025",
        "time":"?",
        "hardware":"?",
        "certificate":"no"
    }]
}

For most of the best known solutions, the date, hardware, running time and certificate (valid primal or valid dual solution) are not known. The data will be progressively updated to the best of our knowledge.


Best known solutions per instance family

Hurink, Jurisch and Thole (1994) - Machine independent processing times

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

InstanceSizeProblemLBUBTypeSolved by
abz5_sdata10 x 10machine-independent flexible jobshop12341234toyOptalCP in < 1m
abz5_edata10 x 10machine-independent flexible jobshop11671167toyOptalCP in < 1m
abz5_rdata10 x 10machine-independent flexible jobshop954954toyOptalCP in < 1m
abz5_vdata10 x 10machine-independent flexible jobshop859859toyOptalCP in < 1m
abz6_sdata10 x 10machine-independent flexible jobshop943943toyOptalCP in < 1m
abz6_edata10 x 10machine-independent flexible jobshop925925toyOptalCP in < 1m
abz6_rdata10 x 10machine-independent flexible jobshop807807toyOptalCP in < 1m
abz6_vdata10 x 10machine-independent flexible jobshop742742toyOptalCP in < 1m
abz7_sdata20 x 15machine-independent flexible jobshop656656mediumOptalCP in < 1h
abz7_edata20 x 15machine-independent flexible jobshop604610openlb CPO2013 | ub Quintiq
abz7_rdata20 x 15machine-independent flexible jobshop497522openlb CdGKGC2025 | ub DLLSXG2019
abz7_vdata20 x 15machine-independent flexible jobshop492492closedQuintiq
abz8_sdata20 x 15machine-independent flexible jobshop667667hardOptalCP in < NaNh
abz8_edata20 x 15machine-independent flexible jobshop625636openlb Quintiq | ub CPO2013
abz8_rdata20 x 15machine-independent flexible jobshop509535openlb CdGKGC2025 | ub DLLSXG2019
abz8_vdata20 x 15machine-independent flexible jobshop506507openlb OptalCP | ub Quintiq
abz9_sdata20 x 15machine-independent flexible jobshop678678hardOptalCP in < NaNh
abz9_edata20 x 15machine-independent flexible jobshop644644hardCPO2013 in < 24h
abz9_rdata20 x 15machine-independent flexible jobshop517536openlb CPO2013 | ub Quintiq
abz9_vdata20 x 15machine-independent flexible jobshop497497closedlb OptalCP | ub Quintiq

Hurink, Jurisch and Thole 1994

InstanceSizeProblemLBUBTypeSolved by
car1_sdata11 x 5machine-independent flexible jobshop70387038toyOptalCP in < 1m
car1_edata11 x 5machine-independent flexible jobshop61766176toyOptalCP in < 1m
car1_rdata11 x 5machine-independent flexible jobshop50345034mediumOptalCP in < 1h
car1_vdata11 x 5machine-independent flexible jobshop50055005mediumOptalCP in < 1h
car2_sdata13 x 4machine-independent flexible jobshop71667166toyOptalCP in < 1m
car2_edata13 x 4machine-independent flexible jobshop63276327toyOptalCP in < 1m
car2_rdata13 x 4machine-independent flexible jobshop59855985toyOptalCP in < 1m
car2_vdata13 x 4machine-independent flexible jobshop59295929toyOptalCP in < 1m
car3_sdata12 x 5machine-independent flexible jobshop73127312toyOptalCP in < 1m
car3_edata12 x 5machine-independent flexible jobshop68566856toyOptalCP in < 1m
car3_rdata12 x 5machine-independent flexible jobshop56225622closedlb OptalCP | ub Quintiq
car3_vdata12 x 5machine-independent flexible jobshop55975597mediumOptalCP in < 1h
car4_sdata14 x 4machine-independent flexible jobshop80038003toyOptalCP in < 1m
car4_edata14 x 4machine-independent flexible jobshop77897789toyOptalCP in < 1m
car4_rdata14 x 4machine-independent flexible jobshop65146514toyOptalCP in < 1m
car4_vdata14 x 4machine-independent flexible jobshop65146514toyOptalCP in < 1m
car5_sdata10 x 6machine-independent flexible jobshop77027702toyOptalCP in < 1m
car5_edata10 x 6machine-independent flexible jobshop72297229toyOptalCP in < 1m
car5_rdata10 x 6machine-independent flexible jobshop56155615toyOptalCP in < 1m
car5_vdata10 x 6machine-independent flexible jobshop49094909closedlb OptalCP | ub CdGKGC2025
car6_sdata8 x 9machine-independent flexible jobshop83138313toyOptalCP in < 1m
car6_edata8 x 9machine-independent flexible jobshop79907990toyOptalCP in < 1m
car6_rdata8 x 9machine-independent flexible jobshop61476147toyOptalCP in < 1m
car6_vdata8 x 9machine-independent flexible jobshop54865486toyOptalCP in < 1m
car7_sdata7 x 7machine-independent flexible jobshop65586558toyOptalCP in < 1m
car7_edata7 x 7machine-independent flexible jobshop61236123toyOptalCP in < 1m
car7_rdata7 x 7machine-independent flexible jobshop44254425toyOptalCP in < 1m
car7_vdata7 x 7machine-independent flexible jobshop42814281toyOptalCP in < 1m
car8_sdata8 x 8machine-independent flexible jobshop82648264toyOptalCP in < 1m
car8_edata8 x 8machine-independent flexible jobshop76897689toyOptalCP in < 1m
car8_rdata8 x 8machine-independent flexible jobshop56925692toyOptalCP in < 1m
car8_vdata8 x 8machine-independent flexible jobshop46134613toyOptalCP in < 1m

Hurink, Jurisch and Thole 1994

InstanceSizeProblemLBUBTypeSolved by
la01_sdata10 x 5machine-independent flexible jobshop666666toyOptalCP in < 1m
la01_edata10 x 5machine-independent flexible jobshop609609toyOptalCP in < 1m
la01_rdata10 x 5machine-independent flexible jobshop570570mediumOptalCP in < 1h
la01_vdata10 x 5machine-independent flexible jobshop570570toyOptalCP in < 1m
la02_sdata10 x 5machine-independent flexible jobshop655655toyOptalCP in < 1m
la02_edata10 x 5machine-independent flexible jobshop655655toyOptalCP in < 1m
la02_rdata10 x 5machine-independent flexible jobshop529529toyOptalCP in < 1m
la02_vdata10 x 5machine-independent flexible jobshop529529toyOptalCP in < 1m
la03_sdata10 x 5machine-independent flexible jobshop597597toyOptalCP in < 1m
la03_edata10 x 5machine-independent flexible jobshop550550toyOptalCP in < 1m
la03_rdata10 x 5machine-independent flexible jobshop477477toyOptalCP in < 1m
la03_vdata10 x 5machine-independent flexible jobshop477477toyOptalCP in < 1m
la04_sdata10 x 5machine-independent flexible jobshop590590toyOptalCP in < 1m
la04_edata10 x 5machine-independent flexible jobshop568568toyOptalCP in < 1m
la04_rdata10 x 5machine-independent flexible jobshop502502toyOptalCP in < 1m
la04_vdata10 x 5machine-independent flexible jobshop502502toyOptalCP in < 1m
la05_sdata10 x 5machine-independent flexible jobshop593593toyOptalCP in < 1m
la05_edata10 x 5machine-independent flexible jobshop503503toyOptalCP in < 1m
la05_rdata10 x 5machine-independent flexible jobshop457457toyOptalCP in < 1m
la05_vdata10 x 5machine-independent flexible jobshop457457toyOptalCP in < 1m
la06_sdata15 x 5machine-independent flexible jobshop926926toyOptalCP in < 1m
la06_edata15 x 5machine-independent flexible jobshop833833toyOptalCP in < 1m
la06_rdata15 x 5machine-independent flexible jobshop799799toyOptalCP in < 1m
la06_vdata15 x 5machine-independent flexible jobshop799799toyOptalCP in < 1m
la07_sdata15 x 5machine-independent flexible jobshop890890toyOptalCP in < 1m
la07_edata15 x 5machine-independent flexible jobshop762762toyOptalCP in < 1m
la07_rdata15 x 5machine-independent flexible jobshop749749toyOptalCP in < 1m
la07_vdata15 x 5machine-independent flexible jobshop749749toyOptalCP in < 1m
la08_sdata15 x 5machine-independent flexible jobshop863863toyOptalCP in < 1m
la08_edata15 x 5machine-independent flexible jobshop845845toyOptalCP in < 1m
la08_rdata15 x 5machine-independent flexible jobshop765765toyOptalCP in < 1m
la08_vdata15 x 5machine-independent flexible jobshop765765toyOptalCP in < 1m
la09_sdata15 x 5machine-independent flexible jobshop951951toyOptalCP in < 1m
la09_edata15 x 5machine-independent flexible jobshop878878toyOptalCP in < 1m
la09_rdata15 x 5machine-independent flexible jobshop853853toyOptalCP in < 1m
la09_vdata15 x 5machine-independent flexible jobshop853853toyOptalCP in < 1m
la10_sdata15 x 5machine-independent flexible jobshop958958toyOptalCP in < 1m
la10_edata15 x 5machine-independent flexible jobshop866866toyOptalCP in < 1m
la10_rdata15 x 5machine-independent flexible jobshop804804toyOptalCP in < 1m
la10_vdata15 x 5machine-independent flexible jobshop804804toyOptalCP in < 1m
la11_sdata20 x 5machine-independent flexible jobshop12221222toyOptalCP in < 1m
la11_edata20 x 5machine-independent flexible jobshop11031103toyOptalCP in < 1m
la11_rdata20 x 5machine-independent flexible jobshop10711071toyOptalCP in < 1m
la11_vdata20 x 5machine-independent flexible jobshop10711071toyOptalCP in < 1m
la12_sdata20 x 5machine-independent flexible jobshop10391039toyOptalCP in < 1m
la12_edata20 x 5machine-independent flexible jobshop960960toyOptalCP in < 1m
la12_rdata20 x 5machine-independent flexible jobshop936936toyOptalCP in < 1m
la12_vdata20 x 5machine-independent flexible jobshop936936toyOptalCP in < 1m
la13_sdata20 x 5machine-independent flexible jobshop11501150toyOptalCP in < 1m
la13_edata20 x 5machine-independent flexible jobshop10531053toyOptalCP in < 1m
la13_rdata20 x 5machine-independent flexible jobshop10381038toyOptalCP in < 1m
la13_vdata20 x 5machine-independent flexible jobshop10381038toyOptalCP in < 1m
la14_sdata20 x 5machine-independent flexible jobshop12921292toyOptalCP in < 1m
la14_edata20 x 5machine-independent flexible jobshop11231123toyOptalCP in < 1m
la14_rdata20 x 5machine-independent flexible jobshop10701070toyOptalCP in < 1m
la14_vdata20 x 5machine-independent flexible jobshop10701070toyOptalCP in < 1m
la15_sdata20 x 5machine-independent flexible jobshop12071207toyOptalCP in < 1m
la15_edata20 x 5machine-independent flexible jobshop11111111toyOptalCP in < 1m
la15_rdata20 x 5machine-independent flexible jobshop10891089toyOptalCP in < 1m
la15_vdata20 x 5machine-independent flexible jobshop10891089toyOptalCP in < 1m
la16_sdata10 x 10machine-independent flexible jobshop945945toyOptalCP in < 1m
la16_edata10 x 10machine-independent flexible jobshop892892toyOptalCP in < 1m
la16_rdata10 x 10machine-independent flexible jobshop717717toyOptalCP in < 1m
la16_vdata10 x 10machine-independent flexible jobshop717717toyOptalCP in < 1m
la17_sdata10 x 10machine-independent flexible jobshop784784toyOptalCP in < 1m
la17_edata10 x 10machine-independent flexible jobshop707707toyOptalCP in < 1m
la17_rdata10 x 10machine-independent flexible jobshop646646toyOptalCP in < 1m
la17_vdata10 x 10machine-independent flexible jobshop646646toyOptalCP in < 1m
la18_sdata10 x 10machine-independent flexible jobshop848848toyOptalCP in < 1m
la18_edata10 x 10machine-independent flexible jobshop842842toyOptalCP in < 1m
la18_rdata10 x 10machine-independent flexible jobshop666666toyOptalCP in < 1m
la18_vdata10 x 10machine-independent flexible jobshop663663toyOptalCP in < 1m
la19_sdata10 x 10machine-independent flexible jobshop842842toyOptalCP in < 1m
la19_edata10 x 10machine-independent flexible jobshop796796toyOptalCP in < 1m
la19_rdata10 x 10machine-independent flexible jobshop700700toyOptalCP in < 1m
la19_vdata10 x 10machine-independent flexible jobshop617617toyOptalCP in < 1m
la20_sdata10 x 10machine-independent flexible jobshop902902toyOptalCP in < 1m
la20_edata10 x 10machine-independent flexible jobshop857857toyOptalCP in < 1m
la20_rdata10 x 10machine-independent flexible jobshop756756toyOptalCP in < 1m
la20_vdata10 x 10machine-independent flexible jobshop756756toyOptalCP in < 1m
la21_sdata15 x 10machine-independent flexible jobshop10461046toyOptalCP in < 1m
la21_edata15 x 10machine-independent flexible jobshop10091009toyOptalCP in < 1m
la21_rdata15 x 10machine-independent flexible jobshop809825openlb CdGKGC2025 | ub Quintiq
la21_vdata15 x 10machine-independent flexible jobshop800800mediumOptalCP in < 1h
la22_sdata15 x 10machine-independent flexible jobshop927927toyOptalCP in < 1m
la22_edata15 x 10machine-independent flexible jobshop880880toyOptalCP in < 1m
la22_rdata15 x 10machine-independent flexible jobshop745753openlb CdGKGC2025 | ub DLLSXG2019
la22_vdata15 x 10machine-independent flexible jobshop733733closedlb OptalCP | ub CPO2013
la23_sdata15 x 10machine-independent flexible jobshop10321032toyOptalCP in < 1m
la23_edata15 x 10machine-independent flexible jobshop950950toyOptalCP in < 1m
la23_rdata15 x 10machine-independent flexible jobshop820831openlb CdGKGC2025 | ub DLLSXG2019
la23_vdata15 x 10machine-independent flexible jobshop809809mediumOptalCP in < 1h
la24_sdata15 x 10machine-independent flexible jobshop935935toyOptalCP in < 1m
la24_edata15 x 10machine-independent flexible jobshop908908toyOptalCP in < 1m
la24_rdata15 x 10machine-independent flexible jobshop780795openlb CdGKGC2025 | ub DLLSXG2019
la24_vdata15 x 10machine-independent flexible jobshop773773hardOptalCP in < NaNh
la25_sdata15 x 10machine-independent flexible jobshop977977toyOptalCP in < 1m
la25_edata15 x 10machine-independent flexible jobshop936936toyOptalCP in < 1m
la25_rdata15 x 10machine-independent flexible jobshop771779openlb CdGKGC2025 | ub DLLSXG2019
la25_vdata15 x 10machine-independent flexible jobshop751751closedlb OptalCP | ub Quintiq
la26_sdata20 x 10machine-independent flexible jobshop12181218toyOptalCP in < 1m
la26_edata20 x 10machine-independent flexible jobshop11061106mediumOptalCP in < 1h
la26_rdata20 x 10machine-independent flexible jobshop10561057openlb DOFP2026a | ub Quintiq
la26_vdata20 x 10machine-independent flexible jobshop10521052mediumOptalCP in < 1h
la27_sdata20 x 10machine-independent flexible jobshop12351235toyOptalCP in < 1m
la27_edata20 x 10machine-independent flexible jobshop11811181toyOptalCP in < 1m
la27_rdata20 x 10machine-independent flexible jobshop10851085closedlb DOFP2026a | ub Quintiq
la27_vdata20 x 10machine-independent flexible jobshop10841084mediumOptalCP in < 1h
la28_sdata20 x 10machine-independent flexible jobshop12161216toyOptalCP in < 1m
la28_edata20 x 10machine-independent flexible jobshop11421142hardCPO2013 in < 24h
la28_rdata20 x 10machine-independent flexible jobshop10751076openlb DOFP2026a | ub Quintiq
la28_vdata20 x 10machine-independent flexible jobshop10691069mediumOptalCP in < 1h
la29_sdata20 x 10machine-independent flexible jobshop11521152mediumOptalCP in < 1h
la29_edata20 x 10machine-independent flexible jobshop11071107hardCPO2013 in < 24h
la29_rdata20 x 10machine-independent flexible jobshop993994openlb OptalCP | ub Quintiq
la29_vdata20 x 10machine-independent flexible jobshop993993closedlb OptalCP | ub Quintiq
la30_sdata20 x 10machine-independent flexible jobshop13551355toyOptalCP in < 1m
la30_edata20 x 10machine-independent flexible jobshop11881188hardCPO2013 in < 24h
la30_rdata20 x 10machine-independent flexible jobshop10681071openlb OptalCP | ub Quintiq
la30_vdata20 x 10machine-independent flexible jobshop10681068closedlb OptalCP | ub Quintiq
la31_sdata30 x 10machine-independent flexible jobshop17841784toyOptalCP in < 1m
la31_edata30 x 10machine-independent flexible jobshop15321532mediumOptalCP in < 1h
la31_rdata30 x 10machine-independent flexible jobshop15201520mediumOptalCP in < 1h
la31_vdata30 x 10machine-independent flexible jobshop15201520mediumOptalCP in < 1h
la32_sdata30 x 10machine-independent flexible jobshop18501850toyOptalCP in < 1m
la32_edata30 x 10machine-independent flexible jobshop16981698toyOptalCP in < 1m
la32_rdata30 x 10machine-independent flexible jobshop16571657closedlb OptalCP | ub Quintiq
la32_vdata30 x 10machine-independent flexible jobshop16571657closedlb OptalCP | ub Quintiq
la33_sdata30 x 10machine-independent flexible jobshop17191719toyOptalCP in < 1m
la33_edata30 x 10machine-independent flexible jobshop15471547toyOptalCP in < 1m
la33_rdata30 x 10machine-independent flexible jobshop14971497closedlb OptalCP | ub Quintiq
la33_vdata30 x 10machine-independent flexible jobshop14971497closedlb OptalCP | ub MG2000
la34_sdata30 x 10machine-independent flexible jobshop17211721toyOptalCP in < 1m
la34_edata30 x 10machine-independent flexible jobshop15991599toyOptalCP in < 1m
la34_rdata30 x 10machine-independent flexible jobshop15351535closedlb OptalCP | ub Quintiq
la34_vdata30 x 10machine-independent flexible jobshop15351535mediumOptalCP in < 1h
la35_sdata30 x 10machine-independent flexible jobshop18881888toyOptalCP in < 1m
la35_edata30 x 10machine-independent flexible jobshop17361736toyOptalCP in < 1m
la35_rdata30 x 10machine-independent flexible jobshop15491549closedlb OptalCP | ub Quintiq
la35_vdata30 x 10machine-independent flexible jobshop15491549mediumOptalCP in < 1h
la36_sdata15 x 15machine-independent flexible jobshop12681268toyOptalCP in < 1m
la36_edata15 x 15machine-independent flexible jobshop11601160toyOptalCP in < 1m
la36_rdata15 x 15machine-independent flexible jobshop10231023toyOptalCP in < 1m
la36_vdata15 x 15machine-independent flexible jobshop948948toyOptalCP in < 1m
la37_sdata15 x 15machine-independent flexible jobshop13971397toyOptalCP in < 1m
la37_edata15 x 15machine-independent flexible jobshop13971397toyOptalCP in < 1m
la37_rdata15 x 15machine-independent flexible jobshop10621062mediumOptalCP in < 1h
la37_vdata15 x 15machine-independent flexible jobshop986986toyOptalCP in < 1m
la38_sdata15 x 15machine-independent flexible jobshop11961196mediumOptalCP in < 1h
la38_edata15 x 15machine-independent flexible jobshop11411141toyOptalCP in < 1m
la38_rdata15 x 15machine-independent flexible jobshop954954toyOptalCP in < 1m
la38_vdata15 x 15machine-independent flexible jobshop943943toyOptalCP in < 1m
la39_sdata15 x 15machine-independent flexible jobshop12331233toyOptalCP in < 1m
la39_edata15 x 15machine-independent flexible jobshop11841184toyOptalCP in < 1m
la39_rdata15 x 15machine-independent flexible jobshop10111011toyOptalCP in < 1m
la39_vdata15 x 15machine-independent flexible jobshop922922toyOptalCP in < 1m
la40_sdata15 x 15machine-independent flexible jobshop12221222toyOptalCP in < 1m
la40_edata15 x 15machine-independent flexible jobshop11441144mediumOptalCP in < 1h
la40_rdata15 x 15machine-independent flexible jobshop955955mediumOptalCP in < 1h
la40_vdata15 x 15machine-independent flexible jobshop955955toyOptalCP in < 1m

Hurink, Jurisch and Thole 1994

InstanceSizeProblemLBUBTypeSolved by
ft06_sdata6 x 6machine-independent flexible jobshop5555toyOptalCP in < 1m
ft06_edata6 x 6machine-independent flexible jobshop5555toyOptalCP in < 1m
ft06_rdata6 x 6machine-independent flexible jobshop4747toyOptalCP in < 1m
ft06_vdata6 x 6machine-independent flexible jobshop4747toyOptalCP in < 1m
ft10_sdata10 x 10machine-independent flexible jobshop930930toyOptalCP in < 1m
ft10_edata10 x 10machine-independent flexible jobshop871871toyOptalCP in < 1m
ft10_rdata10 x 10machine-independent flexible jobshop686686toyOptalCP in < 1m
ft10_vdata10 x 10machine-independent flexible jobshop655655toyOptalCP in < 1m
ft20_sdata20 x 5machine-independent flexible jobshop11651165toyOptalCP in < 1m
ft20_edata20 x 5machine-independent flexible jobshop10881088toyOptalCP in < 1m
ft20_rdata20 x 5machine-independent flexible jobshop10221022toyOptalCP in < 1m
ft20_vdata20 x 5machine-independent flexible jobshop10221022toyOptalCP in < 1m

Hurink, Jurisch and Thole 1994

InstanceSizeProblemLBUBTypeSolved by
orb1_sdata10 x 10machine-independent flexible jobshop10591059toyOptalCP in < 1m
orb1_edata10 x 10machine-independent flexible jobshop977977toyOptalCP in < 1m
orb1_rdata10 x 10machine-independent flexible jobshop746746toyOptalCP in < 1m
orb1_vdata10 x 10machine-independent flexible jobshop695695toyOptalCP in < 1m
orb2_sdata10 x 10machine-independent flexible jobshop888888toyOptalCP in < 1m
orb2_edata10 x 10machine-independent flexible jobshop865865toyOptalCP in < 1m
orb2_rdata10 x 10machine-independent flexible jobshop696696toyOptalCP in < 1m
orb2_vdata10 x 10machine-independent flexible jobshop620620toyOptalCP in < 1m
orb3_sdata10 x 10machine-independent flexible jobshop10051005toyOptalCP in < 1m
orb3_edata10 x 10machine-independent flexible jobshop951951toyOptalCP in < 1m
orb3_rdata10 x 10machine-independent flexible jobshop712712toyOptalCP in < 1m
orb3_vdata10 x 10machine-independent flexible jobshop648648toyOptalCP in < 1m
orb4_sdata10 x 10machine-independent flexible jobshop10051005toyOptalCP in < 1m
orb4_edata10 x 10machine-independent flexible jobshop984984toyOptalCP in < 1m
orb4_rdata10 x 10machine-independent flexible jobshop753753toyOptalCP in < 1m
orb4_vdata10 x 10machine-independent flexible jobshop753753toyOptalCP in < 1m
orb5_sdata10 x 10machine-independent flexible jobshop887887toyOptalCP in < 1m
orb5_edata10 x 10machine-independent flexible jobshop842842toyOptalCP in < 1m
orb5_rdata10 x 10machine-independent flexible jobshop639639toyOptalCP in < 1m
orb5_vdata10 x 10machine-independent flexible jobshop584584toyOptalCP in < 1m
orb6_sdata10 x 10machine-independent flexible jobshop10101010toyOptalCP in < 1m
orb6_edata10 x 10machine-independent flexible jobshop958958toyOptalCP in < 1m
orb6_rdata10 x 10machine-independent flexible jobshop754754toyOptalCP in < 1m
orb6_vdata10 x 10machine-independent flexible jobshop715715toyOptalCP in < 1m
orb7_sdata10 x 10machine-independent flexible jobshop397397toyOptalCP in < 1m
orb7_edata10 x 10machine-independent flexible jobshop389389toyOptalCP in < 1m
orb7_rdata10 x 10machine-independent flexible jobshop302302toyOptalCP in < 1m
orb7_vdata10 x 10machine-independent flexible jobshop275275toyOptalCP in < 1m
orb8_sdata10 x 10machine-independent flexible jobshop899899toyOptalCP in < 1m
orb8_edata10 x 10machine-independent flexible jobshop894894toyOptalCP in < 1m
orb8_rdata10 x 10machine-independent flexible jobshop639639toyOptalCP in < 1m
orb8_vdata10 x 10machine-independent flexible jobshop573573toyOptalCP in < 1m
orb9_sdata10 x 10machine-independent flexible jobshop934934toyOptalCP in < 1m
orb9_edata10 x 10machine-independent flexible jobshop933933toyOptalCP in < 1m
orb9_rdata10 x 10machine-independent flexible jobshop694694toyOptalCP in < 1m
orb9_vdata10 x 10machine-independent flexible jobshop659659toyOptalCP in < 1m
orb10_sdata10 x 10machine-independent flexible jobshop944944toyOptalCP in < 1m
orb10_edata10 x 10machine-independent flexible jobshop933933toyOptalCP in < 1m
orb10_rdata10 x 10machine-independent flexible jobshop742742toyOptalCP in < 1m
orb10_vdata10 x 10machine-independent flexible jobshop681681toyOptalCP in < 1m

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.

Brandimarte (1993)

InstanceSizeProblemLBUBTypeSolved by
mk0110 x 6flexible jobshop4040toyOptalCP in < 1m
mk0210 x 6flexible jobshop2626toyOptalCP in < 1m
mk0315 x 8flexible jobshop204204toyOptalCP in < 1m
mk0415 x 8flexible jobshop6060toyOptalCP in < 1m
mk0515 x 4flexible jobshop172172toyOptalCP in < 1m
mk0610 x 15flexible jobshop5757mediumOptalCP in < 1h
mk0720 x 5flexible jobshop139139mediumOptalCP in < 1h
mk0820 x 10flexible jobshop523523toyOptalCP in < 1m
mk0920 x 10flexible jobshop307307toyOptalCP in < 1m
mk1020 x 15flexible jobshop189193openlb DOFP2026a | ub Quintiq
mk1130 x 5flexible jobshop609609hardOptalCP in < 24h
mk1230 x 10flexible jobshop508508toyOptalCP in < 1m
mk1330 x 10flexible jobshop381390openlb DOFP2026a | ub OptalCP
mk1430 x 15flexible jobshop694694toyOptalCP in < 1m
mk1530 x 15flexible jobshop333333hardOptalCP 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 from other problem repositories

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

InstanceSizeProblemLBUBTypeSolved by
dpp01a10 x 5flexible jobshop25052505toyOptalCP in < 1m
dpp02a10 x 5flexible jobshop22282228toyOptalCP in < 1m
dpp03a10 x 5flexible jobshop22282228toyOptalCP in < 1m
dpp04a10 x 5flexible jobshop25032503toyOptalCP in < 1m
dpp05a10 x 5flexible jobshop21952199openCdGKGC2025
dpp06a10 x 5flexible jobshop21642169openCdGKGC2025
dpp07a15 x 8flexible jobshop22162254openlb CPO2013 | ub DLLSXG2019
dpp08a15 x 8flexible jobshop20612061hardOptalCP in < 10h
dpp09a15 x 8flexible jobshop20612061mediumOptalCP in < 1h
dpp10a15 x 8flexible jobshop22122241openlb CPO2013 | ub Quintiq
dpp11a15 x 8flexible jobshop20192037openlb CdGKGC2025 | ub Quintiq
dpp12a15 x 8flexible jobshop19691984openlb OptalCP | ub Quintiq
dpp13a20 x 10flexible jobshop22062236openlb CdGKGC2025 | ub DLLSXG2019
dpp14a20 x 10flexible jobshop21612161closedlb OptalCP | ub Quintiq
dpp15a20 x 10flexible jobshop21612161closedlb OptalCP | ub Quintiq
dpp16a20 x 10flexible jobshop22022231openlb CdGKGC2025 | ub Quintiq
dpp17a20 x 10flexible jobshop20892105openlb CdGKGC2025 | ub Quintiq
dpp18a20 x 10flexible jobshop20572070openlb OptalCP | ub Quintiq

Chambers and Barnes (1996)

InstanceSizeProblemLBUBTypeSolved by
mt10c110 x 11flexible jobshop927927toyOptalCP in < 1m
mt10cc10 x 12flexible jobshop908908toyOptalCP in < 1m
mt10x10 x 11flexible jobshop918918toyOptalCP in < 1m
mt10xx10 x 12flexible jobshop918918toyOptalCP in < 1m
mt10xxx10 x 13flexible jobshop918918toyOptalCP in < 1m
mt10xy10 x 12flexible jobshop905905toyOptalCP in < 1m
mt10xyz10 x 13flexible jobshop847847toyOptalCP in < 1m
setb4c915 x 11flexible jobshop914914toyOptalCP in < 1m
setb4cc15 x 12flexible jobshop907907toyOptalCP in < 1m
setb4x15 x 11flexible jobshop925925toyOptalCP in < 1m
setb4xx15 x 12flexible jobshop925925toyOptalCP in < 1m
setb4xxx15 x 13flexible jobshop925925toyOptalCP in < 1m
setb4xy15 x 12flexible jobshop910910toyOptalCP in < 1m
setb4xyz15 x 13flexible jobshop902902toyOptalCP in < 1m
seti5c1215 x 16flexible jobshop11691169toyOptalCP in < 1m
seti5cc15 x 17flexible jobshop11351135toyOptalCP in < 1m
seti5x15 x 16flexible jobshop11981198toyOptalCP in < 1m
seti5xx15 x 17flexible jobshop11941194toyOptalCP in < 1m
seti5xxx15 x 18flexible jobshop11941194toyOptalCP in < 1m
seti5xy15 x 17flexible jobshop11351135toyOptalCP in < 1m
seti5xyz15 x 18flexible jobshop11251125toyOptalCP in < 1m

Kacem, Hammadi and Borne (2002)

InstanceSizeProblemLBUBTypeSolved by
kacem14 x 6flexible jobshop1111toyOptalCP in < 1m
kacem210 x 7flexible jobshop1111toyOptalCP in < 1m
kacem310 x 10flexible jobshop77toyOptalCP in < 1m
kacem415 x 10flexible jobshop1111toyOptalCP in < 1m

Fattahi, Mehrabad and Jolai (2007)

InstanceSizeProblemLBUBTypeSolved by
fattahi12 x 2flexible jobshop6666toyOptalCP in < 1m
fattahi22 x 2flexible jobshop107107toyOptalCP in < 1m
fattahi33 x 2flexible jobshop221221toyOptalCP in < 1m
fattahi43 x 2flexible jobshop355355toyOptalCP in < 1m
fattahi53 x 2flexible jobshop119119toyOptalCP in < 1m
fattahi63 x 2flexible jobshop320320toyOptalCP in < 1m
fattahi73 x 5flexible jobshop397397toyOptalCP in < 1m
fattahi83 x 4flexible jobshop253253toyOptalCP in < 1m
fattahi93 x 3flexible jobshop210210toyOptalCP in < 1m
fattahi104 x 5flexible jobshop516516toyOptalCP in < 1m
fattahi115 x 6flexible jobshop468468toyOptalCP in < 1m
fattahi125 x 7flexible jobshop446446toyOptalCP in < 1m
fattahi136 x 7flexible jobshop466466toyOptalCP in < 1m
fattahi147 x 7flexible jobshop554554toyOptalCP in < 1m
fattahi157 x 7flexible jobshop514514toyOptalCP in < 1m
fattahi168 x 7flexible jobshop634634toyOptalCP in < 1m
fattahi178 x 7flexible jobshop879879toyOptalCP in < 1m
fattahi189 x 8flexible jobshop884884toyOptalCP in < 1m
fattahi1911 x 8flexible jobshop10551055toyOptalCP in < 1m
fattahi2012 x 8flexible jobshop11961196toyOptalCP in < 1m

Behnke and Geiger (2012)

InstanceSizeProblemLBUBTypeSolved by
behnke110 x 20flexible jobshop9090toyOptalCP in < 1m
behnke210 x 20flexible jobshop9191toyOptalCP in < 1m
behnke310 x 20flexible jobshop9191toyOptalCP in < 1m
behnke410 x 20flexible jobshop9797toyOptalCP in < 1m
behnke510 x 20flexible jobshop9191toyOptalCP in < 1m
behnke620 x 20flexible jobshop125125mediumOptalCP in < 1h
behnke720 x 20flexible jobshop117124openOptalCP
behnke820 x 20flexible jobshop123123mediumOptalCP in < 1h
behnke920 x 20flexible jobshop125125mediumOptalCP in < 1h
behnke1020 x 20flexible jobshop127127mediumOptalCP in < 1h
behnke1150 x 20flexible jobshop223228openlb DOFP2026a | ub OptalCP
behnke1250 x 20flexible jobshop213219openlb DOFP2026a | ub OptalCP
behnke1350 x 20flexible jobshop223229openlb DOFP2026a | ub OptalCP
behnke1450 x 20flexible jobshop221230openlb DOFP2026a | ub OptalCP
behnke1550 x 20flexible jobshop219228openlb DOFP2026a | ub OptalCP
behnke16100 x 20flexible jobshop391412openlb DOFP2026a | ub OptalCP
behnke17100 x 20flexible jobshop392401openlb DOFP2026a | ub OptalCP
behnke18100 x 20flexible jobshop390396openlb DOFP2026a | ub OptalCP
behnke19100 x 20flexible jobshop395400openlb DOFP2026a | ub OptalCP
behnke20100 x 20flexible jobshop391398openlb DOFP2026a | ub OptalCP
behnke2110 x 40flexible jobshop8585toyOptalCP in < 1m
behnke2210 x 40flexible jobshop8787toyOptalCP in < 1m
behnke2310 x 40flexible jobshop8585toyOptalCP in < 1m
behnke2410 x 40flexible jobshop8787toyOptalCP in < 1m
behnke2510 x 40flexible jobshop8787toyOptalCP in < 1m
behnke2620 x 40flexible jobshop113113mediumOptalCP in < 1h
behnke2720 x 40flexible jobshop122122mediumOptalCP in < 1h
behnke2820 x 40flexible jobshop114114mediumOptalCP in < 1h
behnke2920 x 40flexible jobshop116117openlb DOFP2026a | ub OptalCP
behnke3020 x 40flexible jobshop120120mediumOptalCP in < 1h
behnke3150 x 40flexible jobshop226226closedlb DOFP2026a | ub OptalCP
behnke3250 x 40flexible jobshop220224openlb DOFP2026a | ub OptalCP
behnke3350 x 40flexible jobshop223224openlb DOFP2026a | ub OptalCP
behnke3450 x 40flexible jobshop219223openlb DOFP2026a | ub OptalCP
behnke3550 x 40flexible jobshop211214openlb DOFP2026a | ub OptalCP
behnke36100 x 40flexible jobshop381388openlb DOFP2026a | ub OptalCP
behnke37100 x 40flexible jobshop387391openlb DOFP2026a | ub OptalCP
behnke38100 x 40flexible jobshop386389openlb DOFP2026a | ub OptalCP
behnke39100 x 40flexible jobshop384389openlb DOFP2026a | ub OptalCP
behnke40100 x 40flexible jobshop415419openOptalCP
behnke4110 x 60flexible jobshop8787toyOptalCP in < 1m
behnke4210 x 60flexible jobshop8787toyOptalCP in < 1m
behnke4310 x 60flexible jobshop8686toyOptalCP in < 1m
behnke4410 x 60flexible jobshop8484toyOptalCP in < 1m
behnke4510 x 60flexible jobshop8787toyOptalCP in < 1m
behnke4620 x 60flexible jobshop114114mediumOptalCP in < 1h
behnke4720 x 60flexible jobshop117117mediumOptalCP in < 1h
behnke4820 x 60flexible jobshop124125openlb DOFP2026a | ub OptalCP
behnke4920 x 60flexible jobshop113113mediumOptalCP in < 1h
behnke5020 x 60flexible jobshop123123mediumOptalCP in < 1h
behnke5150 x 60flexible jobshop215218openlb DOFP2026a | ub OptalCP
behnke5250 x 60flexible jobshop210212openlb DOFP2026a | ub OptalCP
behnke5350 x 60flexible jobshop211215openlb DOFP2026a | ub OptalCP
behnke5450 x 60flexible jobshop221223openlb DOFP2026a | ub OptalCP
behnke5550 x 60flexible jobshop221223openlb DOFP2026a | ub OptalCP
behnke56100 x 60flexible jobshop384390openlb DOFP2026a | ub OptalCP
behnke57100 x 60flexible jobshop385390openlb DOFP2026a | ub OptalCP
behnke58100 x 60flexible jobshop392397openlb DOFP2026a | ub OptalCP
behnke59100 x 60flexible jobshop392398openlb DOFP2026a | ub OptalCP
behnke60100 x 60flexible jobshop397402openlb DOFP2026a | ub OptalCP

Birgin et al. (2014) - arbitrary precedence DAGs

[Results to be published soon]

Publications (best known solutions)

The upper and lower bounds come from

All other bounds were found with OptalCP