test(tlbo,umda,simulated_annealing,tabu_search,tpe,snes,rvea,spea2): pin comparison and geometry helpers
Phase 1 tests for eight more algorithms — the feasibility-first comparison helpers (better / better_than / compare_so / worse_than), plus algorithm-specific pure functions: - tlbo: best_index min/max/tie. - tpe: oriented_target sign-flip + penalty; split_good_bad partition and clamp-to-at-least-one-each. - snes: nes_utilities sum-to-zero + descending + positive-best. - rvea: unit_normalize (3-4-5 → 0.6/0.8), zero-vector passthrough; closest_reference smallest-angle; smallest_neighbor_angle = π/2 for orthogonal refs. - spea2: euclidean distance basics; binary_tournament prefers lower fitness.
This commit is contained in:
@@ -601,4 +601,30 @@ mod tests {
|
||||
);
|
||||
let _ = opt.run(&SchafferN1);
|
||||
}
|
||||
|
||||
// ---- Mutation-test pinned helpers --------------------------------------
|
||||
|
||||
#[test]
|
||||
fn euclidean_distance_basics() {
|
||||
// (0,0) to (3,4) = 5.
|
||||
assert!((euclidean(&[0.0, 0.0], &[3.0, 4.0]) - 5.0).abs() < 1e-12);
|
||||
// symmetric and zero-to-self.
|
||||
assert!((euclidean(&[3.0, 4.0], &[0.0, 0.0]) - 5.0).abs() < 1e-12);
|
||||
assert_eq!(euclidean(&[1.0, 2.0, 3.0], &[1.0, 2.0, 3.0]), 0.0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn binary_tournament_prefers_lower_fitness() {
|
||||
// SPEA2 fitness is "lower is better" — index 1 here is the best.
|
||||
use crate::core::rng::rng_from_seed;
|
||||
let fitness = vec![5.0_f64, 0.5];
|
||||
let mut wins1 = 0;
|
||||
for seed in 0..200 {
|
||||
let mut rng = rng_from_seed(seed);
|
||||
if binary_tournament(&fitness, &mut rng) == 1 {
|
||||
wins1 += 1;
|
||||
}
|
||||
}
|
||||
assert!(wins1 > 130, "lower-fitness index won only {wins1}/200");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user