NEROX/Simulated Annealing
Solver

Simulated Annealing

The classical single-chain Metropolis-Hastings annealer. Fully deterministic with fixed seed, lowest per-job overhead, and ideal for small-to-medium QUBO instances.

When to use classical SA

Use solver="sa" when your problem has fewer than ~500 variables and lowest-latency results matter more than solution quality improvement from multiple runs. Classical SA starts in milliseconds versus ~1 second GPU initialization overhead.

It's also the right choice for reproducibility-critical workflows: with a fixed seed, classical SA produces identical results across every run, making it easier to debug QUBO formulations without introducing stochastic noise.

Usage

python
import nerox

client = nerox.Client()

job = client.optimize.qubo(
    Q=Q_matrix,
    solver="sa",           # classical simulated annealing
    n_sweeps=100000,       # more sweeps compensate for single chain
    seed=0,                # fully reproducible
)

result = job.wait()
print(result.solution, result.objective)

vs. GPU Annealing

SA (cpu)GPU Annealing
Variables≤ 500up to 50,000
Startup latency< 50ms~1s
Chains1256–4096
ReproducibleYesYes (per seed)
Best forDebug, small problemsProduction, quality