docs: correct disconnected-front and sequencing guidance from compare results
The `compare` harness contradicts two recommendations in the decision trees: - "Disconnected or non-convex front -> AGE-MOEA, KnEA, IBEA" had it backwards. Added KnEA to the ZDT3 table (the disconnected-front benchmark) so the claim is actually exercised: AGE-MOEA and KnEA finish *last and second-last*; IBEA wins, MOEA/D and NSGA-II follow. The trees now split "disconnected" from "non-convex contiguous", lead disconnected with IBEA, and note the geometry-aware methods trail when the front is in pieces. - The book filed Simulated Annealing on permutations as a "one-decision baseline" and led the JSS row with GA. On the harness SA *wins* the FT06 job-shop table and ties for the TSP optimum; SA/Tabu edge out the GA. Reframed SA/Tabu as strong sequencing methods. Also regenerated examples/compare-results.md for the new ZDT3 row. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -60,10 +60,17 @@ dominated gaps between them.
|
||||
|
||||
| algorithm | hypervolume ↑ | spacing ↓ | front | ms |
|
||||
|---|---|---|---|---|
|
||||
| **IBEA** | **126.2072 ± 1.2280** | 0.0164 ± 0.0036 | 48 | 131 |
|
||||
| MOEA/D | 125.2413 ± 2.1647 | 0.0198 ± 0.0043 | 92 | 27 |
|
||||
| NSGA-II | 123.1826 ± 1.5829 | **0.0092 ± 0.0020** | 98 | 40 |
|
||||
| AGE-MOEA | 119.5132 ± 1.2732 | 0.0136 ± 0.0023 | 90 | 171 |
|
||||
| **IBEA** | **126.2072 ± 1.2280** | 0.0164 ± 0.0036 | 48 | 126 |
|
||||
| MOEA/D | 125.2413 ± 2.1647 | 0.0198 ± 0.0043 | 92 | 26 |
|
||||
| NSGA-II | 123.1826 ± 1.5829 | **0.0092 ± 0.0020** | 98 | 39 |
|
||||
| AGE-MOEA | 119.5132 ± 1.2732 | 0.0136 ± 0.0023 | 90 | 170 |
|
||||
| KnEA | 117.2180 ± 0.7027 | 0.0147 ± 0.0049 | 79 | 32 |
|
||||
|
||||
The **geometry-aware methods finish last** on the disconnected front:
|
||||
AGE-MOEA and KnEA both trail the dominance- and decomposition-based
|
||||
methods. Estimating a single front geometry — or chasing knee points —
|
||||
doesn't help when the front is in pieces; IBEA's indicator-based
|
||||
selection wins here.
|
||||
|
||||
## DTLZ2 (3-obj, dim=12, 30000 evals/run × 10 seeds)
|
||||
|
||||
|
||||
@@ -1574,6 +1574,29 @@ fn zdt3_age_moea(seed: u64) -> MoRun {
|
||||
}
|
||||
}
|
||||
|
||||
fn zdt3_knea(seed: u64) -> MoRun {
|
||||
let problem = zdt3_problem();
|
||||
let bounds = vec![(0.0, 1.0); ZDT3_DIM];
|
||||
let initializer = RealBounds::new(bounds.clone());
|
||||
let variation = CompositeVariation {
|
||||
crossover: SimulatedBinaryCrossover::new(bounds.clone(), 15.0, 0.5),
|
||||
mutation: PolynomialMutation::new(bounds, 20.0, 1.0 / ZDT3_DIM as f64),
|
||||
};
|
||||
let pop = 100;
|
||||
let config = KneaConfig {
|
||||
population_size: pop,
|
||||
generations: ZDT3_BUDGET / pop,
|
||||
seed,
|
||||
};
|
||||
let mut opt = Knea::new(config, initializer, variation);
|
||||
let t0 = Instant::now();
|
||||
let result = opt.run(&problem);
|
||||
MoRun {
|
||||
front: result.pareto_front,
|
||||
wall_ms: t0.elapsed().as_millis(),
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// DTLZ1 runners (curated many-obj subset)
|
||||
// -----------------------------------------------------------------------------
|
||||
@@ -1998,6 +2021,7 @@ fn run_zdt3_comparison() {
|
||||
("MOEA/D", zdt3_moead),
|
||||
("IBEA", zdt3_ibea),
|
||||
("AGE-MOEA", zdt3_age_moea),
|
||||
("KnEA", zdt3_knea),
|
||||
];
|
||||
let mut rows: Vec<(f64, Vec<String>)> = Vec::new();
|
||||
for (name, runner) in runners {
|
||||
|
||||
Reference in New Issue
Block a user