pub struct GeneticEngine<C, T>{ /* private fields */ }Expand description
The GeneticEngine is the core component of the Radiate library’s genetic algorithm implementation. The engine is designed to be fast, flexible and extensible, allowing users to customize various aspects of the genetic algorithm to suit their specific needs.
Essentially, it is a high-level abstraction that orchestrates all aspects of the genetic algorithm. It is responsible for managing the population of individuals, evaluating the fitness of each individual, selecting the individuals that will survive to the next generation, and creating the next generation through crossover and mutation.
§Examples
use radiate_engines::*;
// Define a codec that encodes and decodes individuals in the population, in this case using floats.
let codec = FloatCodec::matrix(vec![5], 0.0..100.0);
// This codec will encode Genotype instances with 1 Chromosome and 5 FloatGenes,
// with random alleles between 0.0 and 100.0. It will decode into a Vec<Vec<f32>>.
// eg: [[1.0, 2.0, 3.0, 4.0, 5.0]]
// Create a new instance of the genetic engine with the given codec.
let mut engine = GeneticEngine::builder()
.codec(codec)
.minimizing()
.population_size(150)
.max_age(15)
.offspring_fraction(0.5)
.offspring_selector(BoltzmannSelector::new(4_f32))
.survivor_selector(TournamentSelector::new(3))
.alter(alters![
ArithmeticMutator::new(0.01),
MeanCrossover::new(0.5)
])
.fitness_fn(|genotype: Vec<Vec<f32>>| {
genotype.iter().fold(0.0, |acc, chromosome| {
acc + chromosome.iter().sum::<f32>()
})
})
.build();
// Run the genetic algorithm until the score of the best individual is 0, then return the result.
let result = engine.run(|output| output.score().as_i32() == 0);§Type Parameters
C: The type of the chromosome used in the genotype, which must implement the Chromosome trait.T: The type of the phenotype produced by the genetic algorithm, which must beClone,Send, andstatic.
Implementations§
Source§impl<C, T> GeneticEngine<C, T>
impl<C, T> GeneticEngine<C, T>
Sourcepub fn builder() -> GeneticEngineBuilder<C, T>
pub fn builder() -> GeneticEngineBuilder<C, T>
Creates a new builder for configuring and constructing a genetic engine.
The builder pattern provides a fluent interface for configuring all aspects of the genetic algorithm, including population settings, selection strategies, evolutionary operators, and fitness functions.
Sourcepub fn control(&mut self) -> ThreadSync
pub fn control(&mut self) -> ThreadSync
Returns a clone of the engine’s control interface.
The control interface allows for pausing, resuming, and stopping the engine’s execution from external contexts. If the control interface has not been initialized yet, this method will create a new instance.
Sourcepub fn iter(self) -> EngineRuntime<Self> ⓘwhere
C: 'static,
pub fn iter(self) -> EngineRuntime<Self> ⓘwhere
C: 'static,
Converts the engine into an iterator that yields generations.
This method allows you to iterate over the evolutionary process manually,
giving you fine-grained control over when and how generations are processed.
The iterator yields Generation objects containing the current state and
statistics for each generation.
§Use Cases
Manual iteration is useful when you need to:
- Implement custom termination logic
- Monitor progress between generations
- Apply external control or adaptation
- Integrate with custom monitoring systems
- Implement interactive evolutionary algorithms
§Note
The iterator consumes the engine, so you can only iterate once. If you need to run the engine multiple times, create a new instance using the builder.
Sourcepub fn subscribe<E: Event>(&self, handler: impl Handler<E>) -> Subscription
pub fn subscribe<E: Event>(&self, handler: impl Handler<E>) -> Subscription
Subscribes to events of type E emitted by the engine.
This method returns a Subscription that allows you to define
how to handle events of type E. You can use this to listen for events
such as epoch completions, improvements, or custom messages emitted during the evolutionary process.
Trait Implementations§
Source§impl<C, T> Engine for GeneticEngine<C, T>
Implementation of the Engine trait for GeneticEngine.
impl<C, T> Engine for GeneticEngine<C, T>
Implementation of the Engine trait for GeneticEngine.
This implementation provides the core evolutionary logic, advancing the
population through one complete generation cycle. Each call to next()
represents one generation of evolution, including fitness evaluation,
selection, reproduction, and population replacement.
§Evolutionary Cycle
Each generation follows this sequence:
- Event Emission: Start of epoch events
- Pipeline Execution: Run evolutionary operators
- Metrics Collection: Record timing and performance data
- Best Individual Update: Track improvements and best solutions
- Event Completion: End of epoch events
- Generation Advancement: Increment generation counter
§Performance Optimizations
- Efficient Metrics: Metrics are updated incrementally to minimize overhead
- Event Batching: Events are emitted efficiently without blocking execution
- Pipeline Optimization: Evolutionary operators are executed in optimized sequences
Source§type Epoch = Generation<C, T>
type Epoch = Generation<C, T>
Source§type Ctx = EvolutionContext<C, T>
type Ctx = EvolutionContext<C, T>
Source§fn context(&self) -> &Self::Ctx
fn context(&self) -> &Self::Ctx
Source§fn epoch(&self) -> Self::Epoch
fn epoch(&self) -> Self::Epoch
Epoch here can be given to iterators, callers, or anyone else who needs it.
Essentially to say, this shouldn’t borrow anything from the engine, but instead be an owned snapshot
of the engineSource§fn state(&self) -> EngineState
fn state(&self) -> EngineState
Source§fn start(&mut self)
fn start(&mut self)
Source§fn stop(&mut self)
fn stop(&mut self)
Source§fn step(&mut self) -> Result<()>
fn step(&mut self) -> Result<()>
epoch() method or the next() method. It’s done this way so we
can advance the engine without having to clone or create any new data, and possibly perform operations
outside of the engine which don’t require a snapshot of the engine state.Source§impl<C, T> EngineStream for GeneticEngine<C, T>
Implementation of the EngineStream trait for GeneticEngine.
impl<C, T> EngineStream for GeneticEngine<C, T>
Implementation of the EngineStream trait for GeneticEngine.
Auto Trait Implementations§
impl<C, T> !RefUnwindSafe for GeneticEngine<C, T>
impl<C, T> !UnwindSafe for GeneticEngine<C, T>
impl<C, T> Freeze for GeneticEngine<C, T>
impl<C, T> Send for GeneticEngine<C, T>
impl<C, T> Sync for GeneticEngine<C, T>
impl<C, T> Unpin for GeneticEngine<C, T>
impl<C, T> UnsafeUnpin for GeneticEngine<C, T>
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
Source§impl<E> EngineExt<E> for Ewhere
E: Engine,
impl<E> EngineExt<E> for Ewhere
E: Engine,
Source§fn run<F>(&mut self, limit: F) -> <E as Engine>::Epoch
fn run<F>(&mut self, limit: F) -> <E as Engine>::Epoch
Use the EngineStream trait impl instead, which provides a more flexible and efficient way to run engines with custom termination conditions. Instead of an E::Epoch being given to the fn, a GenerationView<'a, C, T> is provided instead which is much more efficient.