pub mod builder;
pub mod particle;
pub mod probe;
pub mod swarm;
pub mod termination_condition;
pub mod util;
use crate::pso::probe::stdout_probe::StdoutProbe;
use crate::pso::probe::Probe;
use crate::pso::swarm::Swarm;
use crate::pso::termination_condition::{GenerationLimit, TerminationCondition};
use crate::test_functions::rosenbrock;
pub struct PSOAlgorithmCfg {
dimensions: usize,
lower_bound: f64,
upper_bound: f64,
particle_count: usize,
inertia_weight: f64,
cognitive_coefficient: f64,
social_coefficient: f64,
function: fn(&Vec<f64>) -> f64,
termination_condition: Box<dyn TerminationCondition>,
probe: Box<dyn Probe>,
}
impl Default for PSOAlgorithmCfg {
fn default() -> Self {
PSOAlgorithmCfg {
dimensions: 2,
lower_bound: -10.0,
upper_bound: 10.0,
particle_count: 30,
inertia_weight: 0.5,
cognitive_coefficient: 1.0,
social_coefficient: 3.0,
function: rosenbrock,
termination_condition: Box::new(GenerationLimit::new(500)),
probe: Box::new(StdoutProbe::new()),
}
}
}
pub struct PSOAlgorithm {
config: PSOAlgorithmCfg,
swarm: Swarm,
}
impl PSOAlgorithm {
pub fn new(config: PSOAlgorithmCfg) -> Self {
let swarm = Swarm::generate(
config.particle_count,
config.dimensions,
config.lower_bound,
config.upper_bound,
config.function,
);
PSOAlgorithm { config, swarm }
}
pub fn run(&mut self) {
self.config.probe.on_begin(&self.swarm);
let mut iteration = 0;
while !self.config.termination_condition.is_met(iteration, &self.swarm) {
iteration += 1;
self.swarm.update_velocities(
&self.config.inertia_weight,
&self.config.cognitive_coefficient,
&self.config.social_coefficient,
);
self.swarm.update_positions(self.config.function);
self.swarm.update_best_position(self.config.function);
self.config.probe.on_new_generation(&self.swarm, iteration);
}
self.config.probe.on_end(&self.swarm, iteration);
}
}