Struct argmin::solver::particleswarm::ParticleSwarm
source · pub struct ParticleSwarm<P, F, R> { /* private fields */ }
Expand description
§Particle Swarm Optimization (PSO)
Canonical implementation of the particle swarm optimization method as outlined in [0] in chapter II, section A.
The rayon
feature enables parallel computation of the cost function. This can be beneficial
for expensive cost functions, but may cause a drop in performance for cheap cost functions. Be
sure to benchmark both parallel and sequential computation.
§Requirements on the optimization problem
The optimization problem is required to implement CostFunction
.
§References
[0] Zambrano-Bigiarini, M. et.al. (2013): Standard Particle Swarm Optimisation 2011 at CEC-2013: A baseline for future PSO improvements. 2013 IEEE Congress on Evolutionary Computation. https://doi.org/10.1109/CEC.2013.6557848
[1] https://en.wikipedia.org/wiki/Particle_swarm_optimization
Implementations§
source§impl<P, F> ParticleSwarm<P, F, StdRng>where
P: Clone + SyncAlias + ArgminSub<P, P> + ArgminMul<F, P> + ArgminRandom + ArgminZeroLike,
F: ArgminFloat,
impl<P, F> ParticleSwarm<P, F, StdRng>where
P: Clone + SyncAlias + ArgminSub<P, P> + ArgminMul<F, P> + ArgminRandom + ArgminZeroLike,
F: ArgminFloat,
sourcepub fn new(bounds: (P, P), num_particles: usize) -> Self
pub fn new(bounds: (P, P), num_particles: usize) -> Self
Construct a new instance of ParticleSwarm
Takes the number of particles and bounds on the search space as inputs. bounds
is a tuple
(lower_bound, upper_bound)
, where lower_bound
and upper_bound
are of the same type as
the position of a particle (P
) and of the same length as the problem as dimensions.
The inertia weight on velocity and the social and cognitive acceleration factors can be
adapted with with_inertia_factor
,
with_cognitive_factor
and
with_social_factor
, respectively.
The weights and acceleration factors default to:
- inertia:
1/(2 * ln(2))
- cognitive:
0.5 + ln(2)
- social:
0.5 + ln(2)
§Example
let pso: ParticleSwarm<_, f64, _> = ParticleSwarm::new((lower_bound, upper_bound), 40);
source§impl<P, F, R0> ParticleSwarm<P, F, R0>where
P: Clone + SyncAlias + ArgminSub<P, P> + ArgminMul<F, P> + ArgminRandom + ArgminZeroLike,
F: ArgminFloat,
R0: Rng,
impl<P, F, R0> ParticleSwarm<P, F, R0>where
P: Clone + SyncAlias + ArgminSub<P, P> + ArgminMul<F, P> + ArgminRandom + ArgminZeroLike,
F: ArgminFloat,
R0: Rng,
sourcepub fn with_rng_generator<R1: Rng>(
self,
generator: R1,
) -> ParticleSwarm<P, F, R1>
pub fn with_rng_generator<R1: Rng>( self, generator: R1, ) -> ParticleSwarm<P, F, R1>
Set the random number generator
Defaults to rand::rngs::StdRng::from_entropy()
§Example
let pso: ParticleSwarm<_, f64, _> =
ParticleSwarm::new((lower_bound, upper_bound), 40)
.with_rng_generator(rand_xoshiro::Xoroshiro128Plus::seed_from_u64(1729));
source§impl<P, F, R> ParticleSwarm<P, F, R>where
P: Clone + SyncAlias + ArgminSub<P, P> + ArgminMul<F, P> + ArgminRandom + ArgminZeroLike,
F: ArgminFloat,
R: Rng,
impl<P, F, R> ParticleSwarm<P, F, R>where
P: Clone + SyncAlias + ArgminSub<P, P> + ArgminMul<F, P> + ArgminRandom + ArgminZeroLike,
F: ArgminFloat,
R: Rng,
sourcepub fn with_inertia_factor(self, factor: F) -> Result<Self, Error>
pub fn with_inertia_factor(self, factor: F) -> Result<Self, Error>
Set inertia factor on particle velocity
Defaults to 1/(2 * ln(2))
.
§Example
let pso: ParticleSwarm<_, f64, _> =
ParticleSwarm::new((lower_bound, upper_bound), 40).with_inertia_factor(0.5)?;
sourcepub fn with_cognitive_factor(self, factor: F) -> Result<Self, Error>
pub fn with_cognitive_factor(self, factor: F) -> Result<Self, Error>
Set cognitive acceleration factor
Defaults to 0.5 + ln(2)
.
§Example
let pso: ParticleSwarm<_, f64, _> =
ParticleSwarm::new((lower_bound, upper_bound), 40).with_cognitive_factor(1.1)?;
Set social acceleration factor
Defaults to 0.5 + ln(2)
.
§Example
let pso: ParticleSwarm<_, f64, _> =
ParticleSwarm::new((lower_bound, upper_bound), 40).with_social_factor(1.1)?;
Trait Implementations§
source§impl<P: Clone, F: Clone, R: Clone> Clone for ParticleSwarm<P, F, R>
impl<P: Clone, F: Clone, R: Clone> Clone for ParticleSwarm<P, F, R>
source§fn clone(&self) -> ParticleSwarm<P, F, R>
fn clone(&self) -> ParticleSwarm<P, F, R>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl<'de, P, F, R> Deserialize<'de> for ParticleSwarm<P, F, R>
impl<'de, P, F, R> Deserialize<'de> for ParticleSwarm<P, F, R>
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
source§impl<P, F, R> Serialize for ParticleSwarm<P, F, R>
impl<P, F, R> Serialize for ParticleSwarm<P, F, R>
source§impl<O, P, F, R> Solver<O, PopulationState<Particle<P, F>, F>> for ParticleSwarm<P, F, R>where
O: CostFunction<Param = P, Output = F> + SyncAlias,
P: Clone + SyncAlias + ArgminAdd<P, P> + ArgminSub<P, P> + ArgminMul<F, P> + ArgminZeroLike + ArgminRandom + ArgminMinMax,
F: ArgminFloat,
R: Rng,
impl<O, P, F, R> Solver<O, PopulationState<Particle<P, F>, F>> for ParticleSwarm<P, F, R>where
O: CostFunction<Param = P, Output = F> + SyncAlias,
P: Clone + SyncAlias + ArgminAdd<P, P> + ArgminSub<P, P> + ArgminMul<F, P> + ArgminZeroLike + ArgminRandom + ArgminMinMax,
F: ArgminFloat,
R: Rng,
source§fn next_iter(
&mut self,
problem: &mut Problem<O>,
state: PopulationState<Particle<P, F>, F>,
) -> Result<(PopulationState<Particle<P, F>, F>, Option<KV>), Error>
fn next_iter( &mut self, problem: &mut Problem<O>, state: PopulationState<Particle<P, F>, F>, ) -> Result<(PopulationState<Particle<P, F>, F>, Option<KV>), Error>
Perform one iteration of algorithm
source§fn init(
&mut self,
problem: &mut Problem<O>,
state: PopulationState<Particle<P, F>, F>,
) -> Result<(PopulationState<Particle<P, F>, F>, Option<KV>), Error>
fn init( &mut self, problem: &mut Problem<O>, state: PopulationState<Particle<P, F>, F>, ) -> Result<(PopulationState<Particle<P, F>, F>, Option<KV>), Error>
source§fn terminate_internal(&mut self, state: &I) -> TerminationStatus
fn terminate_internal(&mut self, state: &I) -> TerminationStatus
source§fn terminate(&mut self, _state: &I) -> TerminationStatus
fn terminate(&mut self, _state: &I) -> TerminationStatus
terminate_internal
. Read moreAuto Trait Implementations§
impl<P, F, R> Freeze for ParticleSwarm<P, F, R>
impl<P, F, R> RefUnwindSafe for ParticleSwarm<P, F, R>
impl<P, F, R> Send for ParticleSwarm<P, F, R>
impl<P, F, R> Sync for ParticleSwarm<P, F, R>
impl<P, F, R> Unpin for ParticleSwarm<P, F, R>
impl<P, F, R> UnwindSafe for ParticleSwarm<P, F, R>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self
from the equivalent element of its
superset. Read more§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self
is actually part of its subset T
(and can be converted to it).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset
but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self
to the equivalent element of its superset.