use evaluable::Evaluable;
use evaluator::Evaluator;
use reproducer::Reproducer;
use mutable::Mutable;
pub struct Universe<'a, 'b, T: Evaluable + Mutable + Ord + PartialOrd + Clone + ToString> {
population: Vec<T>,
evaluator: &'a mut Evaluator<T>,
reproducer: &'b mut Reproducer<T>,
pop_limit: usize,
limit_cycle: usize,
mutation_rate: f32
}
impl<'a, 'b, T: Evaluable + Mutable + Ord + PartialOrd + Clone + ToString> Universe<'a, 'b, T> {
pub fn new(evaluator: &'a mut Evaluator<T>, reproducer: &'b mut Reproducer<T>) -> Universe<'a, 'b, T> {
let pop_limit = 50;
Universe{
population: Vec::with_capacity(pop_limit),
evaluator: evaluator,
reproducer: reproducer,
pop_limit: pop_limit,
limit_cycle: 10_000,
mutation_rate: 0.01
}
}
pub fn go(&mut self, pop_vec: &Vec<T>) {
self.population = pop_vec.clone();
for cycle in 0..self.limit_cycle {
println!("cycle: {}", cycle);
self.print_best();
self.evaluator.measure_fitness(&mut self.population);
self.order_population();
self.reproducer.reproduce(&mut self.population);
self.mutate_population();
}
}
fn order_population(&mut self) {
self.population.sort_by(|a, b| b.cmp(a));
}
fn mutate_population(&mut self) {
for indi in self.population.iter_mut() {
indi.mutate(self.mutation_rate);
}
}
fn print_best(&self) {
if let Some(indi) = self.population.first() {
println!("best: {}", indi.to_string());
}
else {
println!("Empty population!");
}
}
}