NEROX/Tabu Search
Solver

Tabu Search

Memory-augmented local search that escapes local optima by forbidding recently visited moves. Ideal for scheduling, routing, and problems with well-defined neighborhood structure.

How Tabu Search works

Tabu Search is an iterative improvement algorithm. At each step it evaluates all moves in the current solution's neighborhood, selects the best non-tabu move (even if it worsens the objective), and adds the reverse move to the tabu list for tabu_tenure iterations. This prevents cycling back to recently visited solutions and forces exploration of new regions.

The aspiration criterion overrides the tabu status: if a tabu move would produce a new global best solution, it's allowed regardless of its tabu status.

Usage

python
import nerox

client = nerox.Client()

job = client.optimize.scheduling(
    jobs=jobs,
    problem_type="job_shop",
    solver="tabu",
    tabu_tenure=20,         # moves forbidden for 20 iterations
    max_iter=10000,
    aspiration=True,        # allow tabu move if it beats global best
)

# Also works for general QUBO
job2 = client.optimize.qubo(
    Q=Q_matrix,
    solver="tabu",
    tabu_tenure=15,
    max_iter=50000,
)

result = job.wait()

Neighborhood structure

For QUBO problems, the neighborhood is all single bit-flip moves (n moves for an n-variable problem). For structured problems (TSP, scheduling), NEROX uses problem-specific neighborhoods: 2-opt moves for TSP, operation-swap moves for job shop scheduling. Problem-specific neighborhoods typically converge 10–50× faster than generic QUBO bit flips.

When Tabu Search beats GPU Annealing

On scheduling problems with clear local move semantics (swap two operations on the same machine), Tabu Search consistently finds better solutions than GPU Annealing given the same wall-clock time — because domain-guided moves are far more informative than random bit flips. For scheduling benchmarks (FT10, LA-series), Tabu Search on NEROX matches or exceeds published STS results.