NSGA-III (2014)
Non-dominated Sorting Genetic Algorithm III — Kalyanmoy Deb and Himanshu Jain, An Evolutionary Many-Objective Optimization Algorithm Using Reference-Point-Based Non-dominated Sorting Approach, Part I: Solving Problems With Box Constraints, IEEE Transactions on Evolutionary Computation 18(4):577–601, 2014. DOI: 10.1109/TEVC.2013.2281535.
NSGA-III is NSGA-II's many-objective sibling: it keeps the exact same elitist
evolutionary skeleton and replaces only the diversity mechanism — crowding distance gives way to
reference-point niching. It is a sibling of AGE-MOEA (which instead replaces crowding
with a geometry-adaptive survival score), and AGE-MOEA in fact borrows NSGA-III's adaptive
normalization. OptunaSharp ships it as NSGAIIISampler, a first-class port of Optuna's own
sampler.
The idea
As the number of objectives M grows past three, almost every solution in a random population becomes
non-dominated, so NSGA-II's crowding distance can no longer tell good spread from bad. NSGA-III keeps
NSGA-II's Rₜ = Pₜ ∪ Qₜ combine, the fast non-dominated sort, and the fill-fronts-then-split-the-last
structure, but decides who survives from the splitting front by spreading solutions across a set of
structured reference points rather than by local crowding.
Reference points on a hyperplane. A set of reference points is placed on the normalized
(M−1)-dimensional unit simplex with Das and Dennis's systematic approach: with p divisions per
objective, H = C(M + p − 1, p) points (e.g. M = 3, p = 4 → 15 points). For high M two layers
(a boundary layer and an inside layer with small p) keep H manageable. NSGA-III sets the population
size N ≈ H, so it is effectively parameter-free beyond the usual GA parameters.
Adaptive normalization (recomputed every generation, so it copes with differently-scaled
objectives): find the ideal point z^min (per-objective minima over the selected set) and translate to
it; find each axis's extreme point by minimizing the achievement scalarizing function
ASF(x, w) = maxᵢ f'ᵢ(x) / wᵢ; solve the M-point hyperplane through those extremes for its axis
intercepts aᵢ; normalize f^n_i = f'_i / (aᵢ − z_i^min) so the front lies on Σᵢ f^n_i = 1.
Association. Draw a reference line from the origin through each reference point; associate every solution with the reference point whose line it is closest to (smallest perpendicular distance in the normalized objective space).
Niche-preservation (the selection that fills the last K slots). Track a niche count ρⱼ — how
many already-selected solutions are associated with reference point j. Repeat K times: pick a
reference point with the smallest niche count (ties broken at random); if the splitting front has
solutions associated with it, add one — the closest by perpendicular distance if the point was empty
(ρⱼ = 0), otherwise a random associate — and increment ρⱼ; if the front has none, drop that
reference point for this generation. This deterministically favors sparsely-populated reference
directions, preserving spread across the whole front.
In OptunaSharp
NSGAIIISampler reuses all of NSGA-II's genetic machinery and swaps in reference-point niching for
elite selection. It suits many-objective studies:
using OptunaSharp;
using OptunaSharp.Samplers;
var study = Optuna.CreateStudy(
directions: new[]
{
StudyDirection.Minimize, StudyDirection.Minimize,
StudyDirection.Minimize, StudyDirection.Minimize,
},
sampler: new NSGAIIISampler(
populationSize: 92,
dividingParameter: 3, // p — density of the default Das–Dennis reference points
seed: 42));
Supply your own referencePoints (a double[,] with n_objectives columns) to bias the search toward
preferred regions, or leave it null to generate uniformly-spread points from dividingParameter. The
crossover / mutation operators, crossoverProb, and swappingProb are shared with
NSGAIISampler. To optimize conditional / branch-defined parameters, use
NSGAIIICptSampler (NSGA-III-CPT) — a standalone copy of this sampler that takes a ConditionalParams
rule set; this sampler itself is a bit-exact Optuna port with no such extension (see the
Samplers guide).
Parity. The default path stays in exact MT19937 lock-step with Optuna — generation attribution,
parent cache, the tournament / crossover / mutation draws, and the niching rng.shuffle — and the
objective-value niching is bit-exact: the hyperplane-fit matrix_rank / solve route through
NumSharp's OpenBLAS LAPACK backend (byte-identical to NumPy), confirmed byte-for-byte over a 400-config
differential plus the live parity seeds. The one documented divergence is near-tie reference-point
selection, which can pick a different equally-close reference point.
Relationship to the lineage
- From NSGA-II (2002): inherits the whole elitist (μ+λ) skeleton unchanged; only crowding distance → reference-point niching. NSGA-III uses a large SBX distribution index and, in the unconstrained form, picks parents at random rather than by tournament.
- Beside AGE-MOEA (2019) / AGE-MOEA-2 (2022): all three are
NSGA-II with a many-objective diversity mechanism grafted on — NSGA-III uses structured reference
points, the AGE family uses the front's estimated
Lₚgeometry. AGE-MOEA reuses NSGA-III's adaptive normalization as the first step of its survival score.
See also
NSGA-II (2002) · AGE-MOEA (2019) · AGE-MOEA-2 (2022) · Samplers · Multi-objective Optimization · the API reference.