Help language development. Donate to The Perl Foundation
Algorithm::Evolutionary::Simple - A simple evolutionary algorithm
use Algorithm::Evolutionary::Simple;
Algorithm::Evolutionary::Simple is a module for writing simple and quasi-canonical evolutionary algorithms in Perl 6. It uses binary representation, integer fitness (which is needed for the kind of data structure we are using) and a single fitness function.
It is intended mainly for demo purposes, although it's been actually used in research. In the future, more versions will be available.
It uses a fitness cache for storing and not reevaluating, so take care of memory bloat.
Creates the initial population of binary chromosomes with the indicated length; returns an array.
Generates a random chromosome of indicated length. Returns a Seq
of Bool
s
Returns the number of trues (or ones) in the chromosome.
Returns the number of ones from the beginning of the chromosome.
That's a bumpy road, returns 1 for each block of 4 which has the same true or false value.
Evaluates the chromosomes, storing values in the fitness cache. If auto-t
is set to 'True', uses autothreading for faster operation (if needed). In absence of that parameter, defaults to sequential.
Evaluates the population, returning a Mix, but does not use a cache. Intended mainly for concurrent operation.
Returns $need
elements with probability proportional to its weight, which is fitness in this case.
Returns the chromosome with a random bit flipped.
Returns two chromosomes, with parts of it crossed over. Generally you will want to do crossover first, then mutation.
Produces offspring from an array that contains the reproductive pool; it returns a Seq
.
Produces offspring from an array that contains the reproductive pool without using mutation; it returns a Seq
.
Returns the fitness of the first element. Mainly useful to check if the algorithm is finished.
Single generation of an evolutionary algorithm. The initial Mix
has to be evaluated before entering here using the evaluate
function. Will use auto-threading if $auto-t
is True
.
Single generation of an evolutionary algorithm. The initial Mix
has to be evaluated before entering here using the evaluate
function. Will not use mutation if that variable is set to True
Returns False
if the number of generations in $generations
has not been reached without changing; it returns True
otherwise.
Mixes the two populations, returning a single one of the indicated size and with type Mix.
Packs the individual in a single Int
. The invidual must be binary, and the maximum length is 64.
Unpacks the individual that has been packed previously using pack-individual
Packs a population, producing a buffer which can be sent to a channel or stored in a compact form.
Unpacks the population that has been packed using pack-population
$population
can be an array or a Mix, in which case the keys are extracted. This returns the per-bit (or gene) frequency of one (or True) for the population.
$population
is a Mix, in which case the keys are extracted. This returns the per-bit (or gene) frequency of one (or True) for the population of the best part of the population; the size of the population will be divided by the $proportion variable.
Generates a population of that size with every gene according to the indicated frequency.
Generates a new array with random elements of the two arrays that are used as arguments.
There is a very interesting implementation of an evolutionary algorithm in Algorithm::Genetic. Check it out.
This is also a port of Algorithm::Evolutionary::Simple to Perl6, which has a few more goodies, but it's not simply a port, since most of the code is completely different.
JJ Merelo [email protected]
Copyright 2018, 2019 JJ Merelo
This library is free software; you can redistribute it and/or modify it under the Artistic License 2.0.