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
+8 -7
View File
@@ -365,16 +365,17 @@ fn mantegna_sigma_u(alpha: f64) -> f64 {
// Stirling-ish via the standard recursion + Lanczos coefficients.
// For the typical α ∈ [1, 2] range we hit, the expressions Γ(1+α)
// and Γ((1+α)/2) are well-behaved.
// Lanczos coefficients for g = 7 (truncated to f64 precision).
let g = 7.0;
let p = [
0.999_999_999_999_809_93,
676.520_368_121_885_1,
-1_259.139_216_722_4023,
771.323_428_777_653_13,
-176.615_029_162_140_59,
0.999_999_999_999_81,
676.520_368_121_885,
-1_259.139_216_722_402,
771.323_428_777_653,
-176.615_029_162_141,
12.507_343_278_686_905,
-0.138_571_095_265_720_12,
9.984_369_578_019_571_6e-6,
-0.138_571_095_265_720_1,
9.984_369_578_019_572e-6,
1.505_632_735_149_311_6e-7,
];
if z < 0.5 {