The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

# 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[0] with fitness \$fitness_of{\$best[0]}\n";
} while ( ( \$generations++ < \$number_of_generations ) and (\$fitness_of{\$best[0]} != \$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>`

Copyright (c) 2011, JJ Merelo `<jj@merelo.net>`. All rights reserved.