NAME

Algorithm::Evolutionary::Simple - Run a simple, canonical evolutionary algorithm in Perl

VERSION

This document describes Algorithm::Evolutionary::Simple version 0.1.2

SYNOPSIS

use Algorithm::Evolutionary::Simple qw( random_chromosome max_ones max_ones_fast
get_pool_roulette_wheel get_pool_binary_tournament produce_offspring single_generation);

my @population;
my %fitness_of;
for (my \$i = 0; \$i < \$number_of_strings; \$i++) {
\$population[\$i] = random_chromosome( \$length);
\$fitness_of{\$population[\$i]} = max_ones( \$population[\$i] );
}

my @best;
my \$generations=0;
do {
my @pool;
if ( \$generations % 2 == 1 ) {
get_pool_roulette_wheel( \@population, \%fitness_of, \$number_of_strings );
} else {
get_pool_binary_tournament( \@population, \%fitness_of, \$number_of_strings );
}
my @new_pop = produce_offspring( \@pool, \$number_of_strings/2 );
for my \$p ( @new_pop ) {
if ( !\$fitness_of{\$p} ) {
\$fitness_of{\$p} = max_ones( \$p );
}
}
@best = rnkeytop { \$fitness_of{\$_} } \$number_of_strings/2 => @population;
@population = (@best, @new_pop);
print "Best so far \$best with fitness \$fitness_of{\$best}\n";
} while ( ( \$generations++ < \$number_of_generations ) and (\$fitness_of{\$best} != \$length ));

DESCRIPTION

Assorted functions needed by an evolutionary algorithm, mainly for demos and simple clients.

INTERFACE

random_chromosome( \$length )

Creates a binary chromosome, with uniform distribution of 0s and 1s, and returns it as a string.

max_ones( \$string )

Classical function that returns the number of ones in a binary string.

max_ones_fast( \$string )

Faster implementation of max_ones.

spin(\$wheel, \$slots )

Mainly for internal use, \$wheel has the normalized probability, and \$slots the number of individuals to return.

single_generation( \$population_arrayref, \$fitness_of_hashref )

Applies all steps to arrive to a new generation, except evaluation. Keeps the two best for the next generation.

get_pool_roulette_wheel( \$population_arrayref, \$fitness_of_hashref, \$how_many_I_need )

Obtains a pool of new chromosomes using fitness_proportional selection

get_pool_binary_tournament( \$population_arrayref, \$fitness_of_hashref, \$how_many_I_need )

Obtains a pool of new chromosomes using binary tournament, a greedier method.

produce_offspring( \$population_hashref, \$how_many_I_need )

Uses mutation first and then crossover to obtain a new population

mutate( \$string )

Bitflips a a single point in the binary string

crossover( \$one_string, \$another_string )

Applies two-point crossover to both strings, returning them changed

DIAGNOSTICS

Will complain if some argument is missing.

Algorithm::Evolutionary::Simple requires no configuration files or environment variables.

DEPENDENCIES

Sort::Key::Top for efficient sorting.

There are excellent evolutionary algorithm libraries out there; see for instance AI::Genetic::Pro

BUGS AND LIMITATIONS

It's intended for simplicity, not flexibility. If you want a full-featured evolutionary algorithm library, check Algorithm::Evolutionary

Please report any bugs or feature requests to bug-algorithm-evolutionary-simple@rt.cpan.org, or through the web interface at http://rt.cpan.org.

AUTHOR

JJ Merelo <jj@merelo.net>