feat(moead): MOEA/D-DE, differential evolution in place of the crossover (Li and Zhang 2009) - #418
Merged
Merged
Conversation
…ver (Li and Zhang, 2009) DifferentialEvolutionCrossover makes each subproblem's child from its own solution and the scaled difference of two parents, with binomial crossover and a repair at the bounds (moead::Repair: Bounce by default, or the paper's random reset). A child whose parents came from the whole population may replace solutions anywhere, the paper's update range. Moead's crossover slot takes a sealed MoeadCrossover trait, implemented for every Crossover and for the new operator, so existing code and seeded runs are unchanged. Tests: the operator by hand, the paper's F2 (IGD under 0.004, the paper's 0.0028), ZDT1, a checkpoint resume and a portable run.
Moead with crossover=gx.DifferentialEvolutionCrossover(f, cr, repair) runs MOEA/D-DE on real genomes; other algorithms and genomes reject it. The MOEA/D settings are applied by one function for both kinds of crossover. Tests: a ZDT1 run evaluated in Rust, the settings' errors and a resumed checkpoint.
Merged
18 tasks done
tachsin
pushed a commit
that referenced
this pull request
Oct 2, 2026
## 🤖 New release * `genoxide`: 0.13.0 -> 0.13.1 (✓ API compatible changes) * `genoxide-python`: 0.13.0 -> 0.13.1 <details><summary><i><b>Changelog</b></i></summary><p> ## `genoxide` <blockquote> ## [0.13.1](v0.13.0...v0.13.1) - 2026-10-02 ### <!-- 0 -->Added - shift and rotation wrappers and seventeen CEC- and BBOB-style functions, each with its own example ([#409](#409)) - *(moead)* MOEA/D-DE, differential evolution in place of the crossover (Li and Zhang 2009) ([#418](#418)) - the constrained DTLZ8 and DTLZ9, the DC-DTLZ and the DAS-CMOP problems, each with its own example ([#414](#414)) - *(problems)* gradients for batch 10b's functions, and gradients and constraint values through Shifted and Rotated ([#420](#420)) - *(problems)* binary and combinatorial problems, batch 12, each with its own example ([#421](#421)) ### <!-- 4 -->Documentation - *(ctp)* CTP1-CTP8 checked against the published paper and Deb's 2001 book ([#419](#419)) </blockquote> </p></details> --- This PR was generated with [release-plz](https://github.com/release-plz/release-plz/). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
MOEA/D-DE (Li and Zhang 2009): differential-evolution variation for MOEA/D, for Pareto sets with complicated shapes and for constrained problems. Fan et al.'s DAS-CMOP problems (#414) need it. NSGA-II doesn't reach DAS-CMOP1, 2, 3 or 9's fronts, and neither does the paper's NSGA-II-CDP; the paper's MOEA/D-CDP with DE variation does.
API:
multi::DifferentialEvolutionCrossover::new(f, cr)?goes inMoead's existing.crossover(...)slot.moead::MoeadCrossover<R>, implemented for everyCrossover<R>and for the DE operator onRealonly. Existing code compiles unchanged, and DE on another genome is a compile error.Moeadalready compares solutions by Deb's rules (CDP), as Fan et al.'s MOEA/D-CDP does; the docs now say so.gx.DifferentialEvolutionCrossover(f, cr, repair).Checked in the paper: steps 2.1-2.5, eq. 6 (binomial crossover), eq. 7 (polynomial mutation), and section IV-A's settings: CR 1.0, F 0.5, η 20, p_m 1/n, T 20, δ 0.9, n_r 2. Documented differences:
Repair, one measured deviation: an out-of-bounds gene gets a random value between the parent's gene and the bound it crossed (
Repair::Bounce, the default), not a random value anywhere in its range (step 2.3's text, kept asRepair::Random). On the paper's F2, over 10 seeds:On DAS-CMOP (1,000 generations, 300 weight vectors, T = 30, δ = 0.2), the share of seeds reaching 99% of the front sample's hypervolume:
DAS-CMOP9 ends at 97.3-98.0% of the hypervolume. That is above the 96.8% that even each weight vector's exact optimum would give.
Tests:
portable_runsentries; existing seededMoeadresults are unchanged.