Algorithm-Genetic-Diploid
view release on metacpan or search on metacpan
lib/Algorithm/Genetic/Diploid/Experiment.pm view on Meta::CPAN
package Algorithm::Genetic::Diploid::Experiment;
use strict;
use Algorithm::Genetic::Diploid;
use base 'Algorithm::Genetic::Diploid::Base';
my $log = __PACKAGE__->logger;
=head1 NAME
Algorithm::Genetic::Diploid::Experiment - manages an evolutionary experiment
=head1 METHODS
=over
=item new
Constructor takes named arguments. Provides defaults for C<mutation_rate> (0.05),
C<crossover_rate> (0.60), C<reproduction_rate> (0.35) and C<ngens> (50).
=cut
sub new {
shift->SUPER::new(
'mutation_rate' => 0.05,
'crossover_rate' => 0.60,
'reproduction_rate' => 0.35,
'ngens' => 50,
'factory' => Algorithm::Genetic::Diploid::Factory->new,
'population' => undef,
'env' => undef,
@_
);
}
=item initialize
Sets up the experiment based on the provided arguments:
'individual_count' => number of individuals in the population, default is 50
'chromosome_count' => number of chromosome pairs per individual, default is 1
'gene_count' => number of genes per chromosome, default is 1
=cut
sub initialize {
my $self = shift;
my %args = (
'individual_count' => 50,
'chromosome_count' => 1,
'gene_count' => 1,
@_
);
my $fac = $self->factory;
my $pop = $fac->create_population;
# create individuals
my @individuals;
for my $i ( 1 .. $args{'individual_count'} ) {
push @individuals, $fac->create_individual( 'experiment' => $self );
# create chromosomes in homologous pairs
my @chromosomes;
for my $j ( 1 .. $args{'chromosome_count'} ) {
for ( 1 .. 2 ) {
push @chromosomes, $fac->create_chromosome(
'number' => $j,
'experiment' => $self,
);
# create genes
my @genes;
for my $k ( 1 .. $args{'gene_count'} ) {
push @genes, $fac->create_gene(
'experiment' => $self,
);
}
$chromosomes[-1]->genes(@genes);
}
}
$individuals[-1]->chromosomes(@chromosomes);
}
$pop->individuals(@individuals);
$self->population($pop);
( run in 1.267 second using v1.01-cache-2.11-cpan-39bf76dae61 )