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.

  1. 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.

  2. 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.

  3. 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 access
python
import 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.

Distance above the best known schedule, by time budget Lower is better

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.

Schedules returned on large instances Objective value, lower is better

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.

Distance above the best known after 300 s Lower is better

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.

Bring your own instance

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.

Makespan against the lower bound Lower is better · the bound cannot be passed
RG300_70Closed: equals the lower boundLower bound 630 (2023)Best since 2007: 6344colors: 630RG300_65Closed: equals the lower boundLower bound 605 (2023)Best since 2007: 6074colors: 605RG300_70Closed: equals the lower boundLower bound 630 (2023)Best since 2007: 6344colors: 630RG300_65Closed: equals the lower boundLower bound 605 (2023)Best since 2007: 6074colors: 605
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 applications

Bring 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

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.

Request early accessDiscuss a technical evaluation

Academic and research access