feat: the constrained DTLZ8 and DTLZ9, the DC-DTLZ and the DAS-CMOP problems, each with its own example - #414
Merged
Conversation
…ith derived fronts
…culty triplets and sampled fronts
…authors' sampled fronts
…rams, outputs and traces
…dex and the family cards
…00 generations on DTLZ3
…s the front in every run of 20
18 tasks done
tachsin
added a commit
that referenced
this pull request
Oct 2, 2026
…ver (Li and Zhang 2009) (#418) 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 in `Moead`'s existing `.crossover(...)` slot. - The slot takes a sealed `moead::MoeadCrossover<R>`, implemented for every `Crossover<R>` and for the DE operator on `Real` only. Existing code compiles unchanged, and DE on another genome is a compile error. - As in the paper's step 2.1, a DE child whose parents came from the whole population may replace solutions anywhere, at most n_r of them. SBX keeps neighborhood-only replacement. - `Moead` already compares solutions by Deb's rules (CDP), as Fan et al.'s MOEA/D-CDP does; the docs now say so. - Python: `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: - children are bred and evaluated a generation at a time; - replacement requires strictly better; - the ideal point uses feasible values only. **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 as `Repair::Random`). On the paper's F2, over 10 seeds: | Repair | IGD | |---|---| | Paper (reported mean) | 0.0028 | | Bounce | 0.0026-0.0039 | | Random | 0.007-0.031 | **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: | Problem | MOEA/D-DE | SBX MOEA/D | |---|---|---| | DAS-CMOP1 | 20/20 | 0-69% of the hypervolume | | DAS-CMOP2 | 20/20 | 0-69% of the hypervolume | | DAS-CMOP3 | 20/20 | 0-69% of the hypervolume | | DAS-CMOP9 | converges onto the front (largest distance 0.004) | | 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:** - The operator against hand-computed children, and the setting errors. - Replacement across the whole population for DE only. - The paper's F2 (IGD < 0.004, where SBX stays above 0.04) and ZDT1. - A checkpoint resume. - `portable_runs` entries; existing seeded `Moead` results are unchanged. - Python tests.
…CMOP9, with NSGA-II as the contrast
Merged
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.
Batch 11 of #260: the advanced constrained multi-objective suites, 17 problems, each with its own example.
The problems
All are in
multi::problems::all::<M>()andgx.problems, with their fronts.{Dtlz8, Dtlz9}::<M>::new(n), 10M variables by default), from the TIK-112 report, sections 8.8-8.9, eqs. 28-29. The block sums run from ⌊(j−1)n/M⌋+1 to ⌊jn/M⌋, as the plan's erratum says.{Dc1Dtlz1, Dc1Dtlz3, Dc2Dtlz1, Dc2Dtlz3, Dc3Dtlz1, Dc3Dtlz3}::<M>::new(n),with_parameters(n, a, b)), from Li, Chen, Fu and Yao (2019), the supplement and arXiv.DasCmop1…DasCmop9), from Fan et al. (2020), arXiv v3, tables 2-3 and figure 6. ADifficultytriplet sets the difficulty: the paper's 16 standard triplets of table 3, or any. The defaults are 30 variables and figure 6's triplet.Examples
17 examples at orders 179-195, the free range between C3-DTLZ4 (178) and convex DTLZ2 (200); no existing example moves. Rust and Python give identical output and identical traces.
DAS-CMOP1-3 and 9: their distance variables are linked, and reaching the front needs differential-evolution-style variation, as the paper's MOEA/D-CDP has. None of the operators available to genoxide's multi-objective algorithms moves linked variables together. NSGA-II, NSGA-III, MOEA/D and SMS-EMOA were tried with SBX, blend and arithmetic crossover; all fail, as the paper's NSGA-II-CDP does. The READMEs say so. A DE-style variation for the multi-objective algorithms would close this gap.
DC2 and DC3: the main runs drop some constraints and score the result with the real problem, following the C1-DTLZ3 example. Each example also shows constraint dominance alone stalling, as the C-TAEA paper's C-NSGA-III does: no feasible solution on DC2 in 20 of 20 runs, and stuck in a band of g on DC3.
DTLZ8 and DTLZ9: each also shows NSGA-II for the report's 500 generations failing (DTLZ9 IGD+ about 4).
Tests
Locally, rebased on today's
main:cargo docwith and without features, all with-D warningson Rust 1.99 (WSL).cargo test --all-featurespasses, including 649 lib tests and the doc tests.mypy --strict genoxidereports no issues, andpytestpasses (991 passed, 1 skipped).examples/check_traces.pypasses for all traces.