use dsmga2::{fitness::MkTrap, Dsmga2};
fn main() {
println!("DSMGA-II: Linkage Learning Example\n");
let problem_size = 25;
let fitness_fn = MkTrap::new(5);
let mut ga = Dsmga2::new(problem_size, &fitness_fn)
.population_size(100)
.max_generations(5)
.seed(42)
.build();
ga.run();
println!("Results after {} generations:", ga.generation());
println!(" Best fitness: {:.1}", ga.best_fitness());
println!(" Evaluations: {}\n", ga.num_evaluations());
let mut linkages = ga.linkage();
linkages.sort_by(|a, b| b.2.partial_cmp(&a.2).unwrap());
println!("Top 15 learned dependencies (gene_i, gene_j, weight):");
println!("Expected: Strong links within blocks [0-4], [5-9], [10-14], [15-19], [20-24]\n");
for (i, j, weight) in linkages.iter().take(15) {
let block_i = i / 5;
let block_j = j / 5;
let same_block = if block_i == block_j {
format!(" block {}", block_i)
} else {
" cross-block".to_string()
};
println!(
" Gene {:2} - Gene {:2}: weight = {:8.2} ({})",
i, j, weight, same_block
);
}
println!(
"\nTotal linkages discovered: {} (out of {} possible pairs)",
linkages.len(),
problem_size * (problem_size - 1) / 2
);
}