genevo is a library for implementing and executing simulations of
optimization and search problems using a genetic algorithm (GA).
It provides a default implementation of the genetic algorithm to be used to find solutions for a wide variety of search and optimization problems.
The implementation is split into building blocks which are all represented by traits. This crate provides most common implementation for all building blocks. So it can be used for many problems out of the box.
Anyway if one wants to use different implementations for one or the other building block it can be extended by implementing any of the traits in a more sophisticated and customized way.
The building blocks (defined as traits) are:
- Phenotype and Genotype
The simulation can run an algorithm that is executed in a loop. An algorithm
implements the steps to be done for each iteration of the loop. The provided
implementation of the genetic algorithm implements the
Algorithm trait and
can therefore be executed by the
Simulator which is the provided
implementation of the
Simulator holds state about the simulation and tracks statistics about
the execution of the algorithm, such as number of iterations and processing
The simulation runs until the termination criteria are met. The termination
criteria can be a single one such as max number of iterations or a logical
combination of multiple termination criteria, e.g. max number of iterations
OR a minimum fitness value has been reached. Of coarse
Termination is a
trait as well and one can implement any termination criteria he/she can think
The algorithm can make use of operators that perform different stages of the
algorithm. E.g. the basic genetic algorithm defines the stages: selection,
crossover, mutation and accepting. These stages are performed by the appropriate
This crate provides multiple implementations for each one of those operators. So one can experiment with combining the different implementations to compose the best algorithm for a specific search or optimization problem. Now you may have guessed that the defined operators are traits as well and you are free to implement any of these operators in a way that suits best for your problem and plug them into the provided implementation of the genetic algorithm.
The genetic algorithm needs a population that it evolves with each iteration.
A population contains a number of individuals. Each individual represents a
possible candidate solution for an optimization problem for which the best
solution is searched for. This crate provides a
PopulationBuilder to build
population of genomes. To run the population builder it needs an implementation
GenomeBuilder trait. A
GenomeBuilder defines how to create one
individual (or genome) within the population.
Last but maybe most important are the traits
FitnessFunction. These are the traits which define the domain of the
optimization problem. They must be implemented individually for each application
of the genetic algorithm.
Enough words about the building blocks. Show me some concrete examples. Have a look at the examples in the examples folder to find out how to use this crate:
algorithm module defines traits and structs for implementing
concrete algorithms such as the
ga::GeneticAlgorithm and various
operators as defined in the
encoding module provides basic scheme of encoding
This module provides an
algorithm::Algorithm which implements the genetic
The ‘genetic’ module defines types for the genetic algorithm. The traits defined in this module should be implemented to formulate an optimization or search problem. The types are named after terms as they are found in genetic biology.
mutation module provides
of various mutation schemes for binary encoded, value encoded, permutation
encoded and tree encoded
operator module defines the types of genetic operators as traits.
A genetic operator defines a function that performs a specific stage in
the genetic algorithm. Each of these genetic operator can be implemented
in variety of ways using different algorithms and methods.
population module defines the
Population struct and the
PopulationBuilder for building random populations.
random module defines functions that are used to generate random
values for specific purposes.
recombination module provides default implementations of the
operator::CrossoverOp. The provided crossover operators are organized
in the categories:
reinsertion module provides implementations of the
operator::ReinsertionOp for basic strategies of reinsertion.
selection module provides implementations of the
operator::SelectionOp genetic operator.
statistic module provides functionality to collect and display
statistic about a genetic algorithm application and its execution.
Termination determines when to stop the process of the genetic algorithm. Common termination conditions are:
This module provides implementations of the
genetic::Fitness trait for
some primitive types, such as
i64 et cetera.
This is because Rust does not allow programmers to implement
a foreign trait for a foreign type, which would stop you as a library user
from using primitive types as fitness values.