use individual::{Individual, IndividualWrapper};
#[derive(Clone)]
pub struct Population<T: Individual> {
pub num_of_individuals: u32,
pub population: Vec<IndividualWrapper<T>>,
pub reset_limit: u32,
pub reset_limit_start: u32,
pub reset_limit_end: u32,
pub reset_limit_increment: u32,
pub reset_counter: u32,
pub id: u32,
pub fitness_counter: u64
}
impl<T: Individual + Send + Sync + Clone> Population<T> {
pub fn calculate_fitness(&mut self) {
for wrapper in &mut self.population {
wrapper.fitness = wrapper.individual.calculate_fitness();
}
}
pub fn run_body(&mut self) {
if self.reset_limit_end > 0 {
self.reset_counter += 1;
if self.reset_counter > self.reset_limit {
self.reset_limit += self.reset_limit_increment;
if self.reset_limit >= self.reset_limit_end {
self.reset_limit = self.reset_limit_start;
info!("reset_limit reset to reset_limit_start: {}, id: {}", self.reset_limit_start, self.id);
}
self.reset_counter = 0;
info!("new reset_limit: {}, id: {}, counter: {}", self.reset_limit, self.id, self.fitness_counter);
for wrapper in &mut self.population {
wrapper.individual.reset();
wrapper.fitness = wrapper.individual.calculate_fitness();
}
}
}
let orig_population = self.population.clone();
for wrapper in &mut self.population {
for _ in 0..wrapper.num_of_mutations {
wrapper.individual.mutate();
}
wrapper.fitness = wrapper.individual.calculate_fitness();
}
self.population.extend(orig_population.iter().cloned());
self.population.sort();
self.population.truncate(self.num_of_individuals as usize);
for (individual, orig_individual) in self.population
.iter_mut()
.zip(orig_population.iter()) {
individual.num_of_mutations = orig_individual.num_of_mutations;
}
}
}