use fugue_evo::prelude::*;
use rand::rngs::StdRng;
use rand::SeedableRng;
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== Sphere Function Optimization ===\n");
let mut rng = StdRng::seed_from_u64(42);
const DIM: usize = 10;
let fitness = Sphere::new(DIM);
let bounds = MultiBounds::symmetric(5.12, DIM);
let result = SimpleGABuilder::real_valued()
.population_size(100)
.bounds(bounds)
.fitness(fitness)
.max_generations(200)
.build()?
.run(&mut rng)?;
println!("Optimization complete!");
println!(
" Best fitness (sum of squares): {:.6}",
-result.best_fitness
);
println!(" Generations: {}", result.generations);
println!(" Evaluations: {}", result.evaluations);
println!("\nBest solution:");
for (i, val) in result.best_genome.genes().iter().enumerate() {
println!(" x[{}] = {:.6}", i, val);
}
let distance_from_optimum: f64 = result
.best_genome
.genes()
.iter()
.map(|x| x * x)
.sum::<f64>()
.sqrt();
println!("\nDistance from optimum: {:.6}", distance_from_optimum);
println!("\n{}", result.stats.summary());
Ok(())
}