use crate::solution::Solution;
use crate::utils::random::Random;
pub trait Operator {
fn name(&self) -> &str;
}
pub trait MutationOperator<T, Q = f64>: Operator
where
T: Clone,
Q: Clone,
{
fn execute(&self, solution: &mut Solution<T, Q>, probability: f64, rng: &mut Random);
}
pub trait CrossoverOperator<T, Q = f64>: Operator
where
T: Clone,
Q: Clone,
{
fn execute(
&self,
parent1: &Solution<T, Q>,
parent2: &Solution<T, Q>,
rng: &mut Random,
) -> Vec<Solution<T, Q>>;
fn execute_several(
&self,
parents: Vec<Solution<T, Q>>,
_rng: &mut Random,
) -> Vec<Solution<T, Q>> {
let mut offspring_result = vec![];
for i in 1..parents.len() {
offspring_result.push(parents[i].clone());
}
offspring_result
}
fn number_of_offspring(&self) -> usize {
2
}
}
pub trait SelectionOperator<T, Q = f64>: Operator
where
T: Clone,
Q: Clone,
{
fn execute<'a>(
&self,
population: &'a [Solution<T, Q>],
rng: &mut Random,
dominates: &dyn Fn(&Solution<T, Q>, &Solution<T, Q>) -> bool,
) -> &'a Solution<T, Q>;
fn select_many<'a>(
&self,
population: &'a [Solution<T, Q>],
count: usize,
rng: &mut Random,
dominates: fn(&Solution<T, Q>, &Solution<T, Q>) -> bool,
) -> Vec<&'a Solution<T, Q>> {
(0..count)
.map(|_| self.execute(population, rng, &dominates))
.collect()
}
}