feat(operators): add PolynomialMutation

Deb's standard real-valued mutation pair to SBX, used together by
canonical NSGA-II. For each variable, with probability
`per_variable_probability` (typical: 1/n where n is dim), perturb the
parent value by a polynomial-distributed delta scaled by the bound
range, then clamp.

Per-dim formula:
- `u ~ U[0, 1)`
- `δ = (2u)^(1/(η+1)) − 1` if `u < 0.5` else `1 − (2(1−u))^(1/(η+1))`
- `child[j] = parent[j] + δ · (hi − lo)`, clamped to bounds

`eta` is the distribution index (typical 20; smaller → more spread).
This is the simple bound-rescale form; the bound-aware δ_q variant from
the full paper is left as a future refinement.

Always returns one child. Tests cover: child stays in bounds with high
sigma-equivalent eta, per_variable_probability=0 returns the parent
unchanged, and standard panics.
This commit is contained in:
2026-05-04 19:44:29 -06:00
parent 36a7dbb2ef
commit 464617b1f8
2 changed files with 112 additions and 2 deletions
+2 -2
View File
@@ -17,8 +17,8 @@ pub use crate::pareto::{
};
pub use crate::operators::{
BitFlipMutation, BoundedGaussianMutation, GaussianMutation, RealBounds,
SimulatedBinaryCrossover, SwapMutation,
BitFlipMutation, BoundedGaussianMutation, GaussianMutation, PolynomialMutation,
RealBounds, SimulatedBinaryCrossover, SwapMutation,
};
pub use crate::algorithms::{