Moo
------------------------------------------------
< Moo. Breeding Genetic Algorithms with Haskell. >
------------------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Installation
Installation from Hackage
Hackage is a Haskell community's package archive. This is where the
latest versions of packages are published first.
To install Moo from Hackage use Cabal-Install:
- install Haskell Platform or GHC and Cabal-Install
- run
cabal update
- run
cabal install moo
Installation with Stack
Stackage is a stable package archive. Stackage builds are supposed to
be reproducible. Stackage also provides Long Term Support releases.
To build Moo with Stackage dependencies, use the stack
tool:
- install
stack
- if necessary, install GHC: run
stack setup
- run:
stack update
- in the project source directory run:
stack build
- to run tests:
stack test
Build Status
Features
| | Binary GA | Continuous GA |
|-----------------------+----------------------+--------------------------|
|Encoding | binary bit-string | sequence of real values |
| | Gray bit-string | |
|-----------------------+----------------------+--------------------------|
|Initialization | random uniform |
| | constrained random uniform |
| | arbitrary custom |
|-----------------------+-------------------------------------------------|
|Objective | minimization and maximiation |
| | optional scaling |
| | optional ranking |
| | optional niching (fitness sharing) |
|-----------------------+-------------------------------------------------|
|Selection | roulette |
| | stochastic universal sampling |
| | tournament |
| | optional elitism |
| | optionally constrained |
| | custom non-adaptive ^ |
|-----------------------+-------------------------------------------------|
|Crossover | one-point |
| | two-point |
| | uniform |
| | custom non-adaptive ^ |
| +----------------------+--------------------------|
| | | BLX-α (blend) |
| | | SBX (simulated binary) |
| | | UNDX (unimodal normally |
| | | distributed) |
|-----------------------+----------------------+--------------------------|
|Mutation | point | Gaussian |
| | asymmetric | |
| | constant frequency | |
| +----------------------+--------------------------|
| | custom non-adaptive ^ |
|-----------------------+-------------------------------------------------|
|Replacement | generational with elitism |
| | steady state |
|-----------------------+-------------------------------------------------|
|Stop | number of generations |
|condition | values of objective function |
| | stall of objective function |
| | custom or interactive (`loopIO`) |
| | time limit (`loopIO`) |
| | compound conditions (`And`, `Or`) |
|-----------------------+-------------------------------------------------|
|Logging | pure periodic (any monoid) |
| | periodic with `IO` |
|-----------------------+-------------------------------------------------|
|Constrainted | constrained initialization |
|optimization | constrained selection |
| | death penalty |
|-----------------------+-------------------------------------------------|
|Multiobjective | NSGA-II |
|optimization | constrained NSGA-II |
^
non-adaptive: any function which doesn't depend on generation number
There are other possible encodings which are possible to represent
with list-like genomes (type Genome a = [a]
):
- permutation encodings (
a
being an integer, or other Enum
type)
- tree encodings (
a
being a subtree type)
- hybrid encodings (
a
being a sum type)
Contributing
There are many ways you can help developing the library:
-
I'm not a native speaker of English. If you are, please proof-read
and correct the comments and the documentation.
-
Moo is designed with possibility of implementing custom genetic
operators in mind. If you write new operators (SelectionOp
,
CrossoverOp
, MutationOp
) or replacement strategies
(StepGA
), consider contributing them to the library.
In the comments please give a reference to an academic
work which introduces or studies the method. Explain when or why
it should be used. Provide tests and examples if possible.
-
Implementing some methods (like adaptive genetic algorithms) will
require to change some library types. Please discuss your approach
first.
-
Contribute examples. Solutions of known problems with known optima
and interesting properties. Try to avoid examples which are too
contrived.
An example
Minimizing Beale's function (optimal value f(3, 0.5) = 0):
import Moo.GeneticAlgorithm.Continuous
beale :: [Double] -> Double
beale [x, y] = (1.5 - x + x*y)**2 + (2.25 - x + x*y*y)**2 + (2.625 - x + x*y*y*y)**2
popsize = 101
elitesize = 1
tolerance = 1e-6
selection = tournamentSelect Minimizing 2 (popsize - elitesize)
crossover = unimodalCrossoverRP
mutation = gaussianMutate 0.25 0.1
step = nextGeneration Minimizing beale selection elitesize crossover mutation
stop = IfObjective (\values -> (minimum values) < tolerance)
initialize = getRandomGenomes popsize [(-4.5, 4.5), (-4.5, 4.5)]
main = do
population <- runGA initialize (loop stop step)
print (head . bestFirst Minimizing $ population)
For more examples, see examples/ folder.