NEROX/Scheduling
Problem Type

Scheduling

Assign jobs to machines, minimize makespan, and satisfy precedence and capacity constraints across complex production environments.

Supported scheduling problem types

Job Shop (JSP)
Each job has a fixed operation sequence across machines. Minimize makespan.
Flow Shop (FSP)
All jobs follow the same machine order. Classic industrial sequencing.
Open Shop (OSP)
Operation order is flexible per job. More freedom, more complexity.
Nurse / Staff Scheduling
Assign staff to shifts meeting skill, coverage, and fairness constraints.

Job Shop Scheduling example

python
import nerox

client = nerox.Client()

# 5 jobs, 4 machines
# Each row: list of (machine_id, processing_time) tuples in order
jobs = [
    [(0, 3), (1, 2), (2, 2)],
    [(0, 2), (2, 1), (1, 4)],
    [(1, 4), (2, 3)],
    [(0, 2), (1, 3), (2, 1)],
    [(2, 3), (0, 2), (1, 1)],
]

job = client.optimize.scheduling(
    jobs=jobs,
    problem_type="job_shop",   # job_shop | flow_shop | open_shop
    objective="makespan",      # minimize total completion time
    solver="tabu",             # Tabu Search excels at structured scheduling
)

result = job.wait()
print(f"Makespan: {result.objective}")
print(f"Schedule: {result.schedule}")  # dict: job_id -> [(machine, start, end), ...]

Machine capacity and shift constraints

python
# Add shift windows: machines only available during certain hours
machine_availability = {
    0: [(0, 480), (540, 960)],   # machine 0 available 0-480min, 540-960min
    1: [(0, 960)],               # machine 1 always available
}

job = client.optimize.scheduling(
    jobs=jobs,
    problem_type="job_shop",
    machine_availability=machine_availability,
    objective="makespan",
    solver="tabu",
)

Why Tabu Search for scheduling?

Scheduling problems have rich neighborhood structure — swapping two operations on the same machine is a well-defined, low-cost move. Tabu Search exploits this by exploring structured neighborhoods and maintaining a tabu list to avoid cycling. For job shop problems, Tabu Search typically outperforms GPU Annealing because the neighborhood guidance is more informative than random temperature-driven flips.

For very large scheduling instances (500+ jobs) or when a warm start is not available, switch to GPU Annealing with a high n_runs setting.