Algorithm-Evolve
view release on metacpan or search on metacpan
examples/ArrayEvolver.pm view on Meta::CPAN
package ArrayEvolver;
use strict;
use Algorithm::Evolve::Util ':arr';
our $VERSION = '0.03';
our %configs;
sub import {
my $class = shift;
%configs = (
gene_length => 20,
alphabet => [0,1],
reference_gene => [ ('1') x 20 ],
mutation_rate => 0.05,
crossover_pts => 2,
@_
);
}
sub new {
my $pkg = shift;
my $array = shift
|| arr_random($configs{gene_length}, $configs{alphabet});
return bless { _gene => $array }, $pkg;
}
sub crossover {
my ($pkg, $c1, $c2) = @_;
return map { $pkg->new($_) }
arr_crossover($c1->gene, $c2->gene, $configs{crossover_pts});
}
sub fitness {
my $self = shift;
return arr_agreement($configs{reference_gene}, $self->gene);
}
sub mutate {
my $self = shift;
$self->gene(
arr_mutate($self->gene, $configs{mutation_rate}, $configs{alphabet})
);
}
sub gene {
my $self = shift;
$self->{_gene} = shift if @_;
return $self->{_gene};
}
1;
__END__
=head1 NAME
ArrayEvolver - A generic base critter class for use with Algorithm::Evolve
=head1 SYNOPSIS
package ArrayCritters;
use ArrayEvolver gene_length => 50,
alphabet => [qw(foo bar baz boo)],
...;
our @ISA = ('ArrayEvolver');
## ArrayCritters is now a valid critter class
sub foo_method {
my $self = shift;
$self->{foo}++; ## You can add object attributes
}
sub fitness {
my $self = shift;
## You can override the default inherited methods to suit the
## task at hand
}
You can use this class as a base class any time your representation is an
array gene.
=head1 USE ARGUMENTS
=over
( run in 1.692 second using v1.01-cache-2.11-cpan-39bf76dae61 )