Algorithm-Evolve
view release on metacpan or search on metacpan
examples/rock_paper_scissors.pl view on Meta::CPAN
#!/usr/bin/perl
use strict;
use warnings;
## this example script has POD -- check it out!
use StringEvolver alphabet => [qw/R P S/], mutation_rate => 0.05;
our @ISA = ('StringEvolver');
use lib '../lib';
use Algorithm::Evolve;
sub compare {
my ($class, $crit1, $crit2) = @_;
my ($string1, $string2) = ($crit1->gene, $crit2->gene);
my ($score1, $score2) = (0, 0);
my $length = length($string1);
my $offset1 = int rand $length;
my $offset2 = int rand $length;
## .. and wrap around
$string1 x= 2;
$string2 x= 2;
for (1 .. $length) {
my $char1 = substr($string1, $offset1++, 1);
my $char2 = substr($string2, $offset2++, 1);
next if $char1 eq $char2; ## tie
if (($char1 eq 'R' && $char2 eq 'S') or
($char1 eq 'S' && $char2 eq 'P') or
($char1 eq 'P' && $char2 eq 'R'))
{
$score1++;
} else {
$score2++;
}
}
return $score1 <=> $score2;
}
sub callback {
my $p = shift;
my %occurences;
for (@{$p->critters}) {
my $gene = $_->gene;
$occurences{R} += $gene =~ tr/R/R/;
$occurences{P} += $gene =~ tr/P/P/;
$occurences{S} += $gene =~ tr/S/S/;
}
print "$occurences{R} $occurences{P} $occurences{S}\n";
$p->suspend if $p->generations >= 1000;
}
my $p = Algorithm::Evolve->new(
critter_class => 'main',
selection => 'gladitorial',
parents_per_gen => 10,
size => 80,
callback => \&callback,
random_seed => shift
);
$p->start;
( run in 0.569 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )