Skip to content

Use pro_m=1 for polynomial mutation in ten algorithms (pro_m=1/D mutated each gene with probability 1/D²) - #47

Merged
Zhenyu2Liang merged 1 commit into
EMI-Group:mainfrom
flyingdoubleG:fix-mutation-rate
Oct 28, 2026
Merged

Zhenyu2Liang merged 1 commit into
EMI-Group:mainfrom
flyingdoubleG:fix-mutation-rate

Conversation

@flyingdoubleG

Copy link
Copy Markdown
Contributor

evox.operators.mutation.polynomial_mutation selects mutation sites with torch.rand(n, d) < pro_m / d, so pro_m is the expected number of mutated genes per solution, and the default pro_m=1 gives the usual 1/D per gene (PlatEMO's proM = 1).

Ten algorithms pass pro_m=1.0 / D (as self.lb.numel(), D, self.dim or self.pop.shape[1]). That makes the per-gene probability 1/D²: 1/900 for 30-variable ZDT1, i.e. about one gene in thirty solutions. This PR drops the argument so they use the default, like the other algorithms in EvoMO:

BiGE, CMOEA_MS, CMOPSO, EFRRR, KnEA, MaOEACSS, NSGAII_SDR, TSNSGAII, TSSparseEA, WOF.

IGD after 150 generations, pop_size=100, seeds 0–2 (mean):

algorithm ZDT1 (n=30) main ZDT1 this PR DTLZ2 (m=3, d=12) main DTLZ2 this PR
BiGE 0.0438 0.0123 0.0756 0.0740
CMOEA_MS 0.0790 0.0073 0.0555 0.0576
CMOPSO 0.0064 0.0073 0.0658 0.0694
EFRRR 0.0584 0.0062 0.0545 0.0551
KnEA 0.0571 0.0062 0.0585 0.0617
MaOEACSS 0.1428 0.0112 0.0541 0.0537
NSGAII_SDR 0.1497 0.0230 0.0576 0.0620
TSNSGAII* 0.1408 0.0335 0.0620 0.1323
TSSparseEA 0.0050 0.0042 0.0818 0.0800
WOF 0.0061 0.0050 0.0715 0.0677

ZDT1, which needs mutation to converge in 30 variables, improves 3–13× for most of them. DTLZ2 changes little either way. CMOPSO is slightly worse on both, since it relies mostly on its particle update.

* TSNSGAII on main has the selection problems fixed in #46. With #46 applied, this change keeps DTLZ2 at 0.0541 (0.0540 without it) and brings ZDT1 from 0.0837 to 0.0198, so the DTLZ2 number above is an artefact of the unfixed selection.

unit_test/algorithms/test_moea_generated.py passes. The test_moea.py failures I see locally are the same eight compiled tests on main (no MSVC for torch.compile here), all for algorithms this PR does not touch. ruff check is clean.

This was prepared with AI assistance (Claude); I reviewed and tested the change.

evox's polynomial_mutation already divides pro_m by the number of decision
variables, so pro_m=1/D gave a per-gene mutation probability of 1/D^2
(1/900 on 30-variable ZDT1), almost no mutation. Use the default pro_m=1,
i.e. 1/D per gene, which is PlatEMO's proM = 1 and what the other
algorithms here use. Affects BiGE, CMOEA_MS, CMOPSO, EFRRR, KnEA,
MaOEACSS, NSGAII_SDR, TSNSGAII, TSSparseEA and WOF.
@Zhenyu2Liang
Zhenyu2Liang merged commit f7e57b1 into EMI-Group:main Oct 28, 2026
6 checks passed
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