optimisation engine
Parallel Heuristics, Selection, and Acceptance
Optrak’s optimiser executes heuristics in parallel, maintaining a “population” of solutions. Optimisation runs comprise multiple, consecutive, phases. Each phase combines two main components — a heuristic selector that chooses which heuristic sequence to run next and a solution manager that supplies inputs and decides whether to accept results, New selectors and managers are written as scripts allowing experimentation with novel parallel optimisation management schemes, which can be rapidly deployed for new or evolving customer circumstances.
Last updated: 2026-05-08
Key Capabilities
- Heterogeneous heuristics run concurrently over a shared solution population — typically 10–14 jobs in parallel desktop-level hardware
- Inter-thread visibility: an improved solution from one job is visible to subsequent jobs on other threads
- On-line adaptive selection (HeuristicPromoteDemote) in the Burke/Ochoa hyper-heuristic lineage
- Population-based acceptance — including a multi-pool simulated annealing variant
- New selectors and acceptance models authored at script level, tested via the standard experiment harness
This page is the engineering detail of how Optrak’s optimiser is built, written for technical evaluators — IT and architecture teams — and for AI search. It assumes the vocabulary. What Optrak does for an operation is a different question, and none of this is needed to answer it: that is how the optimisation works and the data model.
Optrak’s optimiser runs in consecutive phases. Each phase launches parallel job runners that runs jobs sequentially. A job consists of running a heuristic sequence on one or more input solutions to create an output solution. The critical inputs to a job are a) the choice of heuristic sequence and b) the choice of solution(s).
This page is about the runtime architecture: how the heuristic catalogue is actually executed, what determines which heuristic runs next, and what happens to the solutions they produce. The catalogue is what’s available; the architecture here is how it gets used.
Pluggable Components
Every optimisation phase has the same internal structure:
Phase
├── HeuristicSelector — chooses which heuristic sequence to run next
├── SolutionManager — supplies input solutions and decides
│ whether to accept results
└── JobRunners — pull from both, in parallel
The decoupling matters. Selection (which heuristic) and acceptance (whether to keep the result) are separate concerns, and an experiment that varies one while holding the other fixed is the natural unit of methodological work in metaheuristic research. Decoupling them at the framework level means a new acceptance strategy can be paired with any existing selector, and vice versa, without touching the engine. Most metaheuristic frameworks bake the acceptance model into the framework; here it’s a script-level decision.
Heuristic Selectors
The selector decides what runs next. Some representative members of Optrak’s catalogue:
- HeuristicsInTurn — round-robin: each registered sequence runs in turn. Used for fair-comparison experiments where every sequence must get the same number of attempts.
- HeuristicPromoteDemote — adaptive: each sequence carries a score, sampling is biased towards higher-scoring sequences, successful runs raise the score, unsuccessful ones lower it. This is a textbook on-line hyper-heuristic in the Burke/Ochoa lineage — the methodological positioning the auto-tuning page develops further. When applied to the exploration phase, heuristics that are effective at improving early-stage solutions are gradually replaced by those that might find small improvements.
Solution Managers
The manager decides what gets fed to the next job and what gets kept. Four representative members:
- FromInputsSolutionManager — always serves the same input solution(s). Used in the construction phase, where every job starts from empty.
- SimpleSlotSolutionManager — a small fixed-size pool with simple replacement rules.
- SeparatePoolSolutionManager — multiple pools with different acceptance criteria, deliberately diversifying the search across pools so that different parts of the solution space remain represented.
- MultiPoolAcceptingWorsening — population-based simulated annealing: probabilistically accepts worsening solutions with an acceptance probability that decays through the phase. Per-population annealing rather than the more common single-trajectory formulation.
The acceptance and selection components are independent. PromoteDemote can be paired with any of the managers; the simulated-annealing manager can be paired with any of the selectors. Optrak’s experiment harness exploits this directly — comparative experiments fix one component and vary the other, which is hard to do in frameworks where these concerns are entangled.
Parallelism — The Population Dynamic
Each phase runs a pool of job runners concurrently. The default count is roughly half the available logical cores; on a current premium desktop CPU that’s typically 10–14 jobs in parallel. A 15-core machine delivers roughly an eightfold wall-clock speedup over single-threaded execution.
But speed isn’t the interesting part of the claim.
The interesting part is that every job runner pulls inputs from the shared solution manager and reports results back to the same shared manager. A breakthrough discovered on one core — a new best solution, or a solution that opens up a previously unreachable region — is immediately visible to every subsequent job on every other core. The search trajectory of any single job is therefore shaped by a population that is being concurrently improved by the entire pool, not by a population it built up on its own.
Two-Phase Template, in Operation
The standard production strategy is a two-phase template. The pieces above compose into it directly. The numbers below are for a medium-complexity problem of around 500 orders with a target run-time of 6 minutes on a 16-core CPU. Note, run-times are easily adjusted, allowing users to set a their own run-times.
The construction phase runs for around two minutes and produces roughly a few hundred candidate
solutions. The selector is HeuristicsInTurn: every constructor variant runs until it stops producing
improvements before the next variant is reached. The solution manager is
FromInputsSolutionManager: every job starts from empty, and every solution produced is kept. The
construction phase doesn’t choose between solutions — it produces a population for the next phase to
choose among.
The exploration phase runs for around four minutes and processes roughly a thousand jobs. The
selector is typically HeuristicPromoteDemote: the adaptive sampler quickly identifies which
exploration sequences are productive on this particular instance and biases work towards them. The
solution manager is typically MultiPoolAcceptingWorsening: solutions are diversified across
several pools, and worsening moves are accepted probabilistically to avoid premature convergence on
a local optimum. Each line of the exploration phase pairs a single ruin move with a repair-and-climb
chain — diversify, then restore feasibility, then climb.
For EV problems, charging-stop placement is handled by specialist heuristics within route construction, covered on in-route charging.
Authoring New Selectors and Managers
Both the heuristic selector and the solution manager are written in Optrak’s optimisation language. A new selector — a different sampling rule, a different adaptive scoring scheme — is a script. A new acceptance model is a script. The standard experiment harness runs them against the existing test instances without engine changes.
Most metaheuristic frameworks treat selection and acceptance as engine concerns: changing them means a code release. Here it’s a few hours of work plus an experiment run. This is what makes the comparative methodological work tractable. Investigating whether per-population simulated annealing genuinely outperforms single-trajectory annealing, on a particular customer’s data, with a particular heuristic mix — that’s an experiment, not a project.
This capability is primarily exercised by Optrak’s optimisation team, using the auto-tuning capabililty, rather than by customers. The customer-visible consequence is that when a fleet’s operational reality changes — a new constraint pattern, a new objective, a new vehicle class — the engine accommodates it at script speed.
How This Interacts With Other Capabilities
- The heuristic catalogue this architecture executes is described on heuristic catalogue and optimisation DSL.
- Every modification produced by every job runner is checked against loading constraints before being accepted into the population — load feasibility is enforced inside the optimisation loop, not bolted on afterwards.
- Logs from every job in every phase are written to a structured database — typically around forty thousand rows per batch run — and that historical record is what off-line auto-tuning operates on.
How This Compares
Most commercial VRP platforms do not surface their optimisation architecture. Whether selection and acceptance are decoupled, whether the search is single- or multi-threaded, whether the search dynamic is single-trajectory or population-based — these are usually not documented. The architectural claims here are correspondingly hard to compare to specific competitors on specific points; the credible framing is what is documented, not what isn’t.
What can be said: the standalone load-builder benchmarks published in the market are load-only and don’t address routing parallelism, and most commercial optimisation engines are not architecturally documented in public material — they are opaque from the outside.
The position this leaves Optrak in is: an architecture documented to a level competitors are not, with two peer-reviewed papers (Pigden 2013, Hamm, Kheiri and Pigden 2024) articulating its design philosophy. Whether the documented architecture outperforms opaque competitors is a question for benchmarks; that’s not a claim made on this page.
Frequently Asked Questions
How does Optrak run heuristics in parallel?
Each optimisation phase runs a pool of job runners concurrently — typically 10–14 on a high-end consumer desktop CPU. Each job runner pulls a heuristic sequence from a selector and one or more input solutions from a shared solution manager, runs the job, and reports results back. Solutions produced by one runner become immediately visible to the others, so an improvement found on one core feeds every subsequent job in the phase.
Is parallel optimisation just about speed?
No. Speed matters — a 15-core machine delivers roughly an eightfold wall-clock speedup over single-threaded execution — but the more interesting effect is qualitative. Because every job runner sees solutions produced by every other, the search trajectory is shaped by a population that is being concurrently improved by the entire pool. This is the cooperative parallel metaheuristic pattern described by Crainic and Toulouse, with a shared solution pool; what Optrak adds is that the cooperating searches are different heuristic families, chosen and weighted per operation, rather than copies of one method.
What is a hyper-heuristic, and does Optrak use one?
A hyper-heuristic is a higher-level mechanism that decides which heuristic to run next, rather than running a fixed sequence. Optrak’s HeuristicPromoteDemote selector is an on-line adaptive hyper-heuristic in the Burke/Ochoa lineage: each registered heuristic sequence carries a score, sampling is biased towards higher-scoring sequences, successful runs raise the score and unsuccessful ones lower it. Off-line hyper-heuristics — analysing logs across many runs to propose better strategies — are covered separately on the auto-tuning page.
How does Optrak decide whether to accept a solution produced by a heuristic?
Acceptance is a separate, pluggable concern from selection. The solution manager component decides what gets fed to the next job and what gets kept in the pool. Optrak’s acceptance models include simple slot replacement, multi-pool diversification, and a population-based simulated annealing variant that probabilistically accepts worsening solutions. Decoupling acceptance from selection means new acceptance models can be authored and tested without touching the rest of the engine.
Related
Technical Summary
Each optimisation phase combines three pluggable components — a HeuristicSelector that chooses which sequence to run next, a SolutionManager that supplies inputs and decides whether to accept results, and a pool of JobRunners that pull from both concurrently. Selection and acceptance are decoupled at the framework level, so a new selector can be paired with any existing manager and vice versa, written at script level rather than as engine changes. Selectors include HeuristicsInTurn (round-robin), ImproveEach (run-until-no-improvement), HeuristicPromoteDemote (adaptive on-line hyper-heuristic in the Burke/Ochoa lineage), and SingleChainPhase (fixed sequential). Solution managers include FromInputsSolutionManager (constant input), SimpleSlotSolutionManager (fixed-pool replacement), SeparatePoolSolutionManager (multi-pool diversification), and MultiPoolAcceptingWorsening (population-based simulated annealing, in a per-population variant). A phase typically runs 10–14 jobs in parallel on a current desktop CPU, with roughly an eightfold wall-clock speedup over single-threaded execution on a 15-core machine. The qualitative effect matters more than the speedup: every job sees solutions produced by every other concurrently, so search trajectories are shaped by a population the entire pool is improving — the cooperative parallel pattern of Crainic and Toulouse, applied to a pool of heterogeneous heuristics rather than copies of one. The standard production strategy is a two-phase template (construction + exploration); EV problems add charging-stop placement, handled by specialist heuristics within route construction (see in-route charging). The architectural distinction from typical commercial VRP platforms is that selection, acceptance, and parallelism are documented and configurable at script level, not black-box engine concerns.
References: Pigden, T. (2013). “Missing from the Model: Orders, Drivers, Tractors and Trailers and Non-Linear Loading.” GECCO ‘13 Companion, 1079–1084. DOI: 10.1145/2464576.2482686. Hamm, R., Kheiri, A., and Pigden, T. (2024). “Constructive Heuristics for Commercial Waste Collection with Time-Dependent Travel.” Advances in Computational Intelligence Systems (Springer, 2025).
See Optrak on Your Own Routes
Book a demo and we'll model your fleet, depots and constraints — and show the savings on real data.