use crate::core::optimization_result::OptimizationResult;
use crate::core::parameters::Parameters;
use crate::core::genome::Genome;
use rand::distributions::{Distribution, Uniform};
pub trait EOA {
fn initialize<P: Parameters>(&self, params: &P, mode : InitializationMode)-> Vec<Genome>{
let n: usize = params.get_population_size();
let dim: usize = params.get_dimensions();
let mut positions : Vec<Genome> = Vec::with_capacity(n);
let intervall01 = Uniform::from(0.0f64..=1.0f64);
let mut rng = rand::thread_rng();
match mode {
InitializationMode::RealUniform => {
let lb = ¶ms.get_lower_bounds();
let ub = ¶ms.get_upper_bounds();
for i in 0..n{
let mut sln = Genome::new(i, dim);
for j in 0..dim {
sln.genes[j]= intervall01.sample(&mut rng)*(ub[j]-lb[j]) + lb[j];
}
positions.push(sln);
}
},
InitializationMode::BinaryUnifrom => {
for i in 0..n {
let mut sln = Genome::new(i, dim);
for j in 0..dim {
if intervall01.sample(&mut rng) < 0.5 {
sln.genes[j] = 0.0;
}
else {
sln.genes[j] = 1.0;
}
}
positions.push(sln);
}
}
}
positions
}
fn run(&mut self)-> OptimizationResult {
OptimizationResult {
best_genome : None,
best_fitness :None,
convergence_trend : None,
computation_time : None,
err_report : None,
}
}
fn randomize(randvect : &mut Vec<f64>) {
let between = Uniform::from(0.0..=1.0);
let mut rng = rand::thread_rng();
for item in randvect.iter_mut() {
*item = between.sample(&mut rng);
}
}
}
pub enum InitializationMode {
RealUniform,
BinaryUnifrom,
}