use rand::prelude::*;
use serde::{Deserialize, Serialize};
use super::{
budget::ConvergenceTracker, Budget, OptimizationResult, PerturbativeMetaheuristic, SearchSpace,
};
use crate::metaheuristics::traits::TerminationReason;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DifferentialEvolution {
pub population_size: usize,
pub mutation_factor: f64,
pub crossover_rate: f64,
pub strategy: DEStrategy,
pub adaptation: AdaptationStrategy,
#[serde(default)]
seed: Option<u64>,
#[serde(skip)]
population: Vec<Vec<f64>>,
#[serde(skip)]
fitness: Vec<f64>,
#[serde(skip)]
best_idx: usize,
#[serde(skip)]
history: Vec<f64>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
pub enum DEStrategy {
#[default]
Rand1Bin,
Best1Bin,
Rand2Bin,
CurrentToBest1Bin,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub enum AdaptationStrategy {
#[default]
None,
JADE {
archive: Vec<Vec<f64>>,
archive_size: usize,
mu_f: f64,
mu_cr: f64,
c: f64,
},
SHADE {
memory_f: Vec<f64>,
memory_cr: Vec<f64>,
memory_size: usize,
memory_index: usize,
},
}
include!("de_impl.rs");
include!("de_optimize.rs");
#[cfg(test)]
#[path = "tests_de_contract.rs"]
mod tests_de_contract;