Skip to content

Feasible niching, equal-CV sort, and two-layer reference directions - #11

Merged
jkbennitt merged 2 commits into
mainfrom
cursor/constraints-reference-layers-0e0a
Sep 30, 2026
Merged

jkbennitt merged 2 commits into
mainfrom
cursor/constraints-reference-layers-0e0a

Conversation

@jkbennitt

Copy link
Copy Markdown
Member

Summary

Constrained survival now follows pymoo Survival.filter_infeasible (Jain & Deb, NSGA-III Part II): niche only feasible members, fill any shortfall by ascending constraint violation, and build the hyperplane from feasible objectives when any feasible member exists. An all-infeasible generation does not move the hyperplane. The locked whole-pool ideal fixture is replaced in the same change.

Equal constraint violation in CompareConstraintDominated is mutual non-domination (Deb). Tournament comparators, including default RankNicheDistance, are unchanged. TwoLayerDasDennis adds Part I’s inside layer; single-layer DasDennis / WithDasDennis stays the default, and the M≤3 oracles do not use the second layer. OSY, TNK, and C1-DTLZ1 have formulation and survival self-tests. No new IGD table, and the package version is not bumped.

Checklist

  • dotnet test Unsga3.slnx -c Release passes locally
  • CHANGELOG.md updated under Unreleased (if user-visible)
  • Public API changes documented (XML docs / README)
  • If survival / normalization / metrics changed: noted oracle impact (or re-ran multi-seed)

Test plan

  • dotnet test Unsga3.slnx -c Release — 87 passed.
  • Feasible (1, 1) beside infeasible (0, 0) now sets ideal to (1, 1), not (0, 0). An all-infeasible population leaves a previously learned hyperplane in place.
  • Survival tests: enough feasible members exclude an infeasible point; a shortfall is filled by ascending CV with no niche id; equal CV keeps the earlier index; an all-infeasible pool truncates by CV.
  • Equal-CV individuals that Pareto-dominate each other share a front.
  • OSY / TNK / C1-DTLZ1 match the pymoo-shaped formulas at fixed points, exercise CV fill on evaluated individuals, and keep a feasible seed through a 3-generation run. No IGD assertion.
  • Two-layer Das–Dennis: outer prefix, scale 0.5, centroid duplicate removed, scale 1 collapses to the outer layer. A 2-generation DTLZ2 run accepts the array. Existing single-layer counts are unchanged.
  • Unconstrained niche fixture PrepareForSelection_overwrites_survival_niche_ids still locks the previous Das–Dennis p=1 survival ids. Published Wilcoxon tables are not rewritten.
Open in Web Open in Cursor 

cursoragent and others added 2 commits September 30, 2026 08:01
Niche only feasible members and fill a shortfall by ascending constraint
violation, and build the hyperplane from feasible objectives. Equal
constraint violation no longer falls through to Pareto. Single-layer
Das–Dennis stays the default; TwoLayerDasDennis is opt-in. OSY, TNK, and
C1-DTLZ1 have formulation and survival tests, with no new IGD table.

Co-authored-by: Jason <jkbennitt@users.noreply.github.com>
Resolve CHANGELOG Unreleased conflict after #10 (odd-N mating / two-shuffle)
landed on main: keep both constraint/two-layer notes and mating-pool notes.
@jkbennitt
jkbennitt merged commit 2d3fd50 into main Sep 30, 2026
2 checks passed
@jkbennitt jkbennitt mentioned this pull request Sep 30, 2026
5 tasks done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants