use super::{Chromosome, Genotype, Population, random_provider};
use std::sync::Arc;
pub trait ReplacementStrategy<C: Chromosome>: Send + Sync {
fn replace(
&self,
population: &Population<C>,
encoder: Arc<dyn Fn() -> Genotype<C> + Send + Sync>,
) -> Genotype<C>;
}
pub struct EncodeReplace;
impl<C: Chromosome> ReplacementStrategy<C> for EncodeReplace {
fn replace(
&self,
_: &Population<C>,
encoder: Arc<dyn Fn() -> Genotype<C> + Send + Sync>,
) -> Genotype<C> {
encoder()
}
}
pub struct PopulationSampleReplace;
impl<C: Chromosome + Clone> ReplacementStrategy<C> for PopulationSampleReplace {
fn replace(
&self,
population: &Population<C>,
_: Arc<dyn Fn() -> Genotype<C> + Send + Sync>,
) -> Genotype<C> {
let random_member = random_provider::range(0..population.len());
population[random_member].genotype().clone()
}
}