feat(algorithms): add KnEA (Knee point-driven EA)

Zhang, Tian & Jin 2015 KnEA: many-objective MOEA that biases survival
selection toward 'knee points' on the Pareto front — points where a
small improvement in one objective costs a large degradation in
another.

Each generation:
- NSGA-II-like loop with offspring + non_dominated_sort
- For the splitting front, identify knee points by perpendicular
  distance from the hyperplane connecting the front's extreme points.
  Members further from the hyperplane (= more 'kneeness') are preferred.
- Survival keeps every knee-tagged member; if room remains, fill from
  remaining members by largest perpendicular distance.

Knee points are intuitively the most attractive points on a Pareto
front when no preference information is available. KnEA pushes the
search toward them at the cost of less uniform front coverage.
This commit is contained in:
2026-05-05 09:51:12 -06:00
parent a95380376e
commit f0faf93b87
6 changed files with 278 additions and 16 deletions
+1 -1
View File
@@ -142,7 +142,7 @@ where
let final_pop: Vec<Candidate<Vec<f64>>> = decisions
.into_iter()
.zip(evals.into_iter())
.zip(evals)
.map(|(d, e)| Candidate::new(d, e))
.collect();
let best = best_candidate(&final_pop, &objectives);