### 12 releases (6 breaking)

0.7.1 | Mar 13, 2022 |
---|---|

0.7.0 | Nov 7, 2021 |

0.6.0 | Nov 7, 2021 |

0.5.0 | Nov 10, 2019 |

0.1.2 | Nov 7, 2017 |

#**311** in Algorithms

**8,851** downloads per month

Used in exilent

**MIT/Apache**

210KB

4.5K
SLoC

# genevo

*genevo* provides building blocks to run simulations of optimization and search
problems using genetic algorithms (GA).

The vision for *genevo* is to be a flexible and greatly extensible framework
for implementing genetic algorithm applications.

*genevo* is written in Rust. The library's API utilizes lots of traits and
types for modelling the domain of genetic algorithms.

## Features

This crate 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:

- Simulation
- Algorithm
- Termination
- Operator
- Population
- Phenotype and Genotype
- FitnessFunction

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

trait and
can therefore be executed by the `Algorithm`

which is the provided
implementation of the `Simulator`

trait.`Simulation`

The

holds state about the simulation and tracks statistics about
the execution of the algorithm, such as number of iterations and processing
time.`Simulator`

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

is a
trait as well and one can implement any termination criteria he/she can think
of.`Termination`

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
operators:

, `SelectionOp`

, `CrossoverOp`

, `MutationOp`

and
`RecombinationOp`

.`ReinsertionOp`

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

to build
population of genomes. To run the population builder it needs an implementation
of the `PopulationBuilder`

trait. A `GenomeBuilder`

defines how to create one
individual (or genome) within the population.`GenomeBuilder`

Last but maybe most important are the traits

, `Phenotype`

and
`Genotype`

. These are the traits which define the domain of the
optimization problem. They must be implemented individually for each application
of the genetic algorithm.`FitnessFunction`

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:

- knapsack: tries to solve the 0-1 knapsack problem
- monkeys: explores the idea of Shakespeare's monkeys, also known as the infinite monkey theorem
- queens: searches for solutions of the N Queens Problem

## Usage

Add this to your

:`Cargo.toml`

`[``dependencies``]`
`genevo ``=` `"`0.7`"`

## Crate Features

provides additional data types to be used as genotypes through optional crate features:`genevo`

: provides`fixedbitset`

to be used as genotype`Fixedbitset`

: provides`Smallvec`

to be used as genotype`Smallvec`

since version 0.7.0

supports wasm targets. To use `genevo`

for target
`genevo`

enable the crate feature `wasm32-unknown-unknown`

. Note: on wasm32 targets
multithreading (implemented using `wasm-bindgen`

) is disabled!`rayon`

`[``dependencies``]`
`genevo = { version = "0.7", features ``=` `[``"`wasm-bindgen`"``]` }

## References

I started this project mainly to learn about genetic algorithms (GAs). During this journey I searched a lot for information about GA. Here are the links to sources of information about GA that I found most useful for me.

[JFGA]: Jeremy Fisher: Genetic Algorithms

[OBI98]: Marek Obitko: Genetic Algorithms Tutorial

[GEAT]: GEATbx: Evolutionary Algorithms

[IGAYT]: Noureddin Sadawi: A Practical Introduction to Genetic Algorithms

[CT9YT]: The Coding Train: 9: Genetic Algorithms - The Nature of Code

[BT95]: Tobias Blickle, Lothar Thiele, 1995: A Comparison of Selection Schemes used in Genetic Algorithms.

[RRCGH]: StefanoD: Rust_Random_Choice Rust library.

[TSP95]: TSPLIB95: library of sample instances for the TSP (and related problems)

Copyright © 2017-2019, Innoave.com and contributors

#### Dependencies

~1.3–2.4MB

~39K SLoC