Supported scheduling problem types
Job Shop Scheduling example
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
# 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.
