feat(algorithms): add SmsEmoa (S-Metric Selection EMOA)

Beume, Naujoks & Emmerich 2007: a steady-state MOEA that uses
hypervolume contribution as the secondary survival selection criterion.

Each generation:
- Generate ONE child via parent selection + variation + evaluation.
- Combine population + child, run non_dominated_sort.
- The discarded individual is the worst-front member with the
  smallest hypervolume contribution (computed via the new
  hypervolume_nd_from_evaluations helper).

Selection-quality is excellent at moderate objective counts (2–4) at
the cost of higher per-step compute (each survival selection requires
N+1 hypervolume evaluations of size ≤ N each). Best paired with a
tightly-bounded objective space — the user supplies a fixed reference
point in the config.

Tests: produces a non-empty front on Schaffer N.1, deterministic
reruns, panic on `population_size == 0`, panic on
`reference_point.len() != objectives.len()`.
This commit is contained in:
2026-05-05 09:51:11 -06:00
parent e2d8b4e4c2
commit cfc241980c
3 changed files with 274 additions and 1 deletions
+2
View File
@@ -15,6 +15,7 @@ pub(crate) mod parallel_eval;
pub mod particle_swarm;
pub mod random_search;
pub mod simulated_annealing;
pub mod sms_emoa;
pub mod spea2;
pub mod tabu_search;
pub mod umda;
@@ -33,6 +34,7 @@ pub use paes::*;
pub use particle_swarm::*;
pub use random_search::*;
pub use simulated_annealing::*;
pub use sms_emoa::*;
pub use spea2::*;
pub use tabu_search::*;
pub use umda::*;