Evolutionary optimization in Rust. GA, DE, NSGA-II, GP. When gradient descent can't help you.
- Genetic algorithms — tournament/roulette selection, single-point/two-point/uniform crossover, gaussian/bitflip mutation
- Differential evolution — DE/rand/1, DE/best/1, DE/current-to-best/1 with adaptive F/CR
- NSGA-II — multi-objective optimization with crowding distance and non-dominated sorting
- Genetic programming — tree-based GP with subtree crossover, tournament selection
All components are modular — mix and match operators to build the optimizer your problem needs.
[dependencies]
evo-rs = "0.1"use evo_rs::{
ga::{GAConfig, run_ga},
individual::RealCodedIndividual,
fitness::FitnessFn,
};
fn rastrigin(x: &[f64]) -> f64 {
10.0 * x.len() as f64 + x.iter().map(|xi| xi * xi - 10.0 * (2.0 * std::f64::consts::PI * xi).cos()).sum::<f64>()
}
let config = GAConfig {
pop_size: 200,
generations: 500,
mutation_rate: 0.1,
crossover_rate: 0.8,
..Default::default()
};
let best = run_ga(config, 10, -5.12..5.12, |ind| -rastrigin(ind.genes()));
println!("Best fitness: {}", best.fitness());use evo_rs::nsga2::{NSGA2Config, run_nsga2};
let front = run_nsga2(NSGA2Config::default(), 30, 0.0..1.0, |ind| {
let x = ind.genes()[0];
vec![x.powi(2), (x - 1.0).powi(2)]
});use evo_rs::gp::{GPTree, GPTerminal};MIT OR Apache-2.0