use ndarray::Array1;
pub mod abco;
pub mod acgwo;
pub mod de;
pub mod fa;
pub mod ga;
pub mod gwo;
pub mod pso;
pub mod sa;
pub use self::abco::{ABCO, ABCOParams};
pub use self::acgwo::{ACGWO, ACGWOParams};
pub use self::de::{DE, DEParams, DEStrategy};
pub use self::fa::FireflyAlgorithm;
pub use self::ga::{GA, GAParams};
pub use self::gwo::{GWO, GWOParams};
pub use self::pso::{PSO, PSOParams};
pub use self::sa::{SA, SAParams};
pub trait ObjectiveFunction {
fn evaluate(&self, x: &Array1<f64>) -> f64;
fn dimensions(&self) -> usize;
fn bounds(&self) -> (Vec<f64>, Vec<f64>);
}
#[derive(Debug, Clone)]
pub struct OptimizationParams {
pub population_size: usize,
pub max_iterations: usize,
pub target_value: Option<f64>,
}
impl Default for OptimizationParams {
fn default() -> Self {
Self {
population_size: 50,
max_iterations: 1000,
target_value: None,
}
}
}
#[derive(Debug)]
pub struct OptimizationResult {
pub best_solution: Array1<f64>,
pub best_fitness: f64,
pub iterations: usize,
pub evaluations: usize,
}
pub(crate) fn argmin(array: &Array1<f64>) -> Option<usize> {
array.iter()
.enumerate()
.min_by(|(_, a), (_, b)| a.partial_cmp(b).unwrap())
.map(|(index, _)| index)
}