4colors Optimizer for Scheduling
High-performance scheduling inside your software
Advanced scheduling algorithms for the software you build to manage jobs, machines, people and resources. Use them from Python or the API.
Good schedules in seconds where CP-SAT needs minutes or runs out of time. New benchmark records, beating results that stood almost 20 years.
Request Optimizer for Scheduling early accessDiscuss a technical evaluation
Better schedules than anyone found in almost 20 years
Project scheduling is among the hardest problems in operations: hundreds of tasks share a few limited resources, each waits for the tasks before it, and the whole project should finish as early as possible.
The hard part is what the calendar doesn't show: material that hasn't arrived, a machine that needs a long changeover, a deadline that moves three other tasks. A good schedule weighs all of it at once.
RG300, a set of 480 projects with 300 tasks each, has been the standard test for project-scheduling algorithms since 2007. The Optimizer's engine beat records there that had stood for 19 years, and every new schedule is published in the benchmark's official results.
RG300 project-scheduling benchmark
- 119 new best-known schedules, in the published results
- 19 years: median age of the records we replaced
- 49 first improvements ever to the original 2007 records
- 11 projects brought down to their proven lower bound
From operational rules to a usable schedule
Model your operational constraints and return executable plans within the time available.
- 01
Model the operation:
Describe jobs, durations, eligible resources, dependencies, calendars and objectives through the Python module or the API, in the terms your own system already uses.
- 02
Search to a deadline:
Find feasible assignments and sequences, then improve the best schedule within the selected computation budget. Follow new candidates as they arrive or stop early.
- 03
Use the plan:
Retrieve resource assignments, start and finish times, objective measures and reported status for your application. Supported models can reuse a previous solution when replanning.
Your scheduling rules in a few lines of Python
Describe jobs, machines and the rules between them. The solver sends a first schedule at once, then better ones until the time budget ends.
4colors Optimizer for Scheduling
Python module
Machines, changeovers, a maintenance window, a shared crew and no-wait steps in one model, with a time budget for the search.
Write the rules the way your planners describe them: what runs where, what must wait and what each change costs. The model stays readable for whoever opens it next.
Call it from your own application or a notebook. A first schedule arrives within seconds, so your users see progress while the search improves it.
Request early accessimport fourcolorsfrom fourcolors.scheduling import Modelm = Model()press, oven = m.machines("press", "oven")m.changeover(press, "steel", "alu", minutes=15) # setup timem.unavailable(oven, start=240, end=300) # planned maintenancecrew = m.resource("operators", capacity=2) # shared crewfor name, metal in [("A", "steel"), ("B", "alu"), ("C", "steel")]: order = m.job(name) cut = order.task(press, minutes=40, family=metal, uses=crew) order.task(oven, minutes=90, after=cut, no_wait=True) # straight inm.minimize("makespan")job = fourcolors.scheduling.submit(m, time_limit_s=60)print(job.result().schedule)Any language or pipeline
Direct API
Send the model as JSON from any language, follow better schedules live, and stop early when one is good enough.
Request early access- POST /v1/jobs
- Submit a model and a time budget
- GET /v1/jobs/{id}/events
- Follow each better solution live
- GET /v1/jobs/{id}
- Read the best solution and its objective
- POST /v1/jobs/{id}/stop
- Stop early and keep the best solution
Performance
How it compares with Google's CP-SAT
CP-SAT, from Google OR-Tools, is the widely used open-source constraint solver. Both ran on standard scheduling benchmarks, on the same machine with the same time budgets.
A good schedule in seconds, a better one with time
Plans change by the hour, so speed decides. The Optimizer returns a strong schedule within seconds and keeps improving it, while a general-purpose constraint solver is still searching.
On every instance shown, the Optimizer is never behind CP-SAT at any budget, and on most of the classic job shops it reaches the best known schedule within the shortest one. Your users get a usable plan the moment they ask, and a better one if they can wait.
ta41 job shop 30×20
4colors3.9%
CP-SAT13.4%
ta51 job shop 50×15 at best known
4colorsbest known
CP-SAT9.5%
ta61 job shop 50×20 at best known
4colorsbest known
CP-SAT9.8%
ta71 job shop 100×20 at best known
4colorsbest known
CP-SAT7.4%
mk10 flexible job shop 20×15
4colors6.7%
CP-SAT10.9%
behnke_lar04_1 flexible job shop 100×60
4colors9.3%
CP-SATnone
j12013_1 project, 120 tasks
4colors1.6%
CP-SAT4.8%
RG300_100 project, 300 tasks
4colors8.5%
CP-SAT9.2%
ta41 job shop 30×20
4colors3.5%
CP-SAT7.1%
ta51 job shop 50×15 at best known
4colorsbest known
CP-SAT1.4%
ta61 job shop 50×20 at best known
4colorsbest known
CP-SAT3.1%
ta71 job shop 100×20 at best known
4colorsbest known
CP-SAT6.0%
mk10 flexible job shop 20×15
4colors4.7%
CP-SAT9.3%
behnke_lar04_1 flexible job shop 100×60
4colors6.2%
CP-SAT20.7%
j12013_1 project, 120 tasks
4colors1.6%
CP-SAT4.0%
RG300_100 project, 300 tasks
4colors7.0%
CP-SAT8.6%
ta41 job shop 30×20
4colors2.8%
CP-SAT5.6%
ta51 job shop 50×15 at best known
4colorsbest known
CP-SATbest known
ta61 job shop 50×20 at best known
4colorsbest known
CP-SAT0.8%
ta71 job shop 100×20 at best known
4colorsbest known
CP-SAT2.8%
mk10 flexible job shop 20×15
4colors4.1%
CP-SAT10.4%
behnke_lar04_1 flexible job shop 100×60
4colors4.4%
CP-SAT12.7%
j12013_1 project, 120 tasks
4colors1.6%
CP-SAT4.0%
RG300_100 project, 300 tasks
4colors5.3%
CP-SAT6.4%
- 4colors
- CP-SAT, default settings
How we measuredClose ×
Instances: Taillard job shops (ta), flexible job shops (mk10, behnke_lar04_1) and project scheduling (j12013_1, RG300_100). Distance above the best known value from published results. On ta51, ta61 and ta71 our schedule is optimal.
Same machine, same wall-clock budgets of 10, 60 and 300 s, counted from process start. CP-SAT 9.15 (Google OR-Tools) with default settings unless a setting is named, seed 1, on a standard CP-SAT model: interval variables, no-overlap and cumulative constraints. Every schedule re-checked by an independent validator.
A schedule where CP-SAT returns none
Large flow shops and parallel machines with setup times are where general-purpose solvers run out of time or memory. The Optimizer returns a usable schedule on every instance shown, with a modest memory footprint.
These are the sizes real operations run at: hundreds of jobs, dozens of machines and setups that depend on the sequence. Where CP-SAT does find a schedule, the Optimizer's is far better on the problems with setups.
ta111 flow shop 500×20
4colors28,431
CP-SATnone
VFR500_60_1 flow shop 500×60
4colors34,938
CP-SATnone
VFR800_60_1 flow shop 800×60
4colors51,776
CP-SATnone
upm_large 150_20 150 jobs, 20 machines, setups
4colors207
CP-SATnone
upm_large 250_30 250 jobs, 30 machines, setups
4colors480
CP-SATnone
ta111 flow shop 500×20
4colors28,040
CP-SAT30,291
VFR500_60_1 flow shop 500×60
4colors34,550
CP-SATnone
VFR800_60_1 flow shop 800×60
4colors51,618
CP-SATnone
upm_large 150_20 150 jobs, 20 machines, setups
4colors202
CP-SAT3,131
upm_large 250_30 250 jobs, 30 machines, setups
4colors469
CP-SAT26,073
ta111 flow shop 500×20
4colors27,627
CP-SAT30,228
VFR500_60_1 flow shop 500×60
4colors34,375
CP-SAT35,899
VFR800_60_1 flow shop 800×60
4colors51,146
CP-SATnone
upm_large 150_20 150 jobs, 20 machines, setups
4colors197
CP-SAT3,558
- 4colors
- CP-SAT, default settings
How we measuredClose ×
Objective value of the returned schedule as each benchmark defines it: Taillard and VFR flow shops, and parallel machines with setup times (upm_large). Given 300 s, CP-SAT ran out of memory on the 250-job instance.
Same machine, same wall-clock budgets of 10, 60 and 300 s, counted from process start. CP-SAT 9.15 (Google OR-Tools) with default settings unless a setting is named, seed 1, on a standard CP-SAT model: interval variables, no-overlap and cumulative constraints. Every schedule re-checked by an independent validator.
Tuned CP-SAT settings do not close the gap
The gap is not a matter of settings. Even with the best of its tuned settings, CP-SAT does not reach the Optimizer's schedule on these instances.
For each instance we kept the best result from CP-SAT's tuned settings. The Optimizer still finds the better schedule on every instance shown, so the advantage comes from the algorithms, not from the configuration.
ta41 job shop 30×20
CP-SAT: defaults 5.6%, presolve off 6.0%, greedy warm start 4.8%, warm start with large-neighborhood search only 5.5%, earliest-start search 5.1%; 4colors 2.8%2.8% vs 4.8%
ta71 job shop 100×20
CP-SAT: defaults 2.8%, presolve off 4.2%, greedy warm start 5.0%, warm start with large-neighborhood search only 5.6%, earliest-start search 7.1%; 4colors 0.0%0.0% vs 2.8%
mk10 flexible job shop 20×15
CP-SAT: defaults 10.4%, presolve off 10.4%, greedy warm start 8.3%, warm start with large-neighborhood search only 6.7%, earliest-start search 10.9%; 4colors 4.1%4.1% vs 6.7%
behnke_lar04_1 flexible job shop 100×60
CP-SAT: defaults 12.7%, presolve off 43.2%, greedy warm start 13.2%, warm start with large-neighborhood search only 28.9%, earliest-start search 10.9%; 4colors 4.4%4.4% vs 10.9%
j12013_1 project, 120 tasks
CP-SAT: defaults 4.0%, presolve off 3.2%, greedy warm start 3.2%, warm start with large-neighborhood search only 3.2%, earliest-start search 3.2%; 4colors 1.6%1.6% vs 3.2%
0% · best known15%+
- 4colors
- CP-SAT, each of five settings
- Gap to CP-SAT's best setting
How we measuredClose ×
Distance above the best known value from published results, after 300 s. CP-SAT settings: defaults; presolve off; a greedy warm start; a warm start with large-neighborhood search only; earliest-start search. Our solver: seed 1.
Same machine, same wall-clock budgets of 10, 60 and 300 s, counted from process start. CP-SAT 9.15 (Google OR-Tools) with default settings unless a setting is named, seed 1, on a standard CP-SAT model: interval variables, no-overlap and cumulative constraints. Every schedule re-checked by an independent validator.
Tested where others have searched for years
Public benchmarks keep the problem fixed and publish every result, so progress can be checked by anyone.
Schedules that reach the lower bound
A lower bound is a proven floor: no valid schedule can finish earlier. On these projects the best schedules had stayed above the bound since 2007. Ours meet it exactly, so no shorter schedule can ever exist.
Our schedules meet the proven lower bound on 11 RG300 projects. Each of those projects is now solved for good.
How we measuredClose ×
Benchmark time units. Lower bounds are other researchers' published proofs (2023); previous best schedules from Debels and Vanhoucke (2007). A schedule equal to the lower bound cannot be improved: the instance is closed. RG300_70 posted 26 October 2026.
Scheduling that adapts
Explore planning applicationsBring an urgent order forward, adjust available capacity or revise a deadline. The optimizer searches for a new schedule around your operating rules, with the tradeoffs visible in the result.
Model
Your operating rules
Jobs, durations, eligible resources, dependencies and calendars in one model.
Model
Your objectives
Tell the search what a better schedule means for your operation.
Search
A computation budget
Set the time available and get the best schedule found within it.
Search
Results as they arrive
Follow new candidates during the run and stop early when one is good enough.
Plan
Replanning
Supported models can reuse a previous solution when the plan changes.
Plan
Output your software can use
Assignments, start and finish times, objective measures and status.
Planning apps built on the Optimizer
Takt
Production schedules for jobs, machines, changeovers and deadlines, re-planned when a rush order lands.
Roster
Rosters that cover every shift with the right skills, fairly, re-planned when someone calls in sick.
Stride
Project schedules built on the people and equipment you have, re-planned when a project slips.
Understand scheduling decisions
Explore more use cases- Guide
Reading Optimization Results With Confidence
A solver's objective value is only part of the story it tells about a result.
Read the guide - Case study
Nineteen years, three hundred tasks, a better schedule
How 4colors found new answers to a scheduling challenge that has occupied optimization researchers for nearly two decades.
Read the case study - Guide
Modeling Changeovers in Production Scheduling
The order of jobs can determine how long a factory spends changing products rather than making them.
Read the guide - Use case
Why Scheduling a Factory Is Harder Than Lining Up the Jobs
A factory contains several clocks, and they do not always agree. A machine becomes free just as the necessary operator goes off shift.
Explore the use case - Insight
Batch Manufacturing: Why the Order of Production Matters
Two schedules can produce the same products and consume very different amounts of time.
Read the insight - Insight
The Schedule Broke. Now What?
The fastest way to recover may begin with the schedule you already have.
Read the insight
Bring a schedule you already run
Send a representative instance and we will compare the Optimizer's result with your current schedule, under the same rules and time limit.