Algorithm-Evolutionary
view release on metacpan or search on metacpan
lib/Algorithm/Evolutionary/Op/Generation_Skeleton.pm view on Meta::CPAN
=head2 set( $ref_to_params_hash, $ref_to_code_hash, $ref_to_operators_hash )
Sets the instance variables. Takes a ref-to-hash as
input. Not intended to be used from outside the class
=cut
sub set {
my $self = shift;
my $hashref = shift || croak "No params here";
my $codehash = shift || croak "No code here";
my $opshash = shift || croak "No ops here";
for ( keys %$codehash ) {
$self->{"_$_"} = eval "sub { $codehash->{$_} } ";
}
$self->{_ops} =();
for ( keys %$opshash ) {
push @{$self->{_ops}},
Algorithm::Evolutionary::Op::Base::fromXML( $_, $opshash->{$_}->[1], $opshash->{$_}->[0] ) ;
}
}
=head2 apply( $population )
Applies the algorithm to the population, which should have
been evaluated first; checks that it receives a
ref-to-array as input, croaks if it does not. Returns a sorted,
culled, evaluated population for next generation.
=cut
sub apply ($) {
my $self = shift;
my $pop = shift || croak "No population here";
croak "Incorrect type ".(ref $pop) if ref( $pop ) ne $APPLIESTO;
#Breed
my $selector = $self->{'_selector'};
my @genitors = $selector->apply( @$pop );
#Reproduce
my $totRate = 0;
my @rates;
my @ops = @{$self->{'_ops'}};
for ( @ops ) {
push( @rates, $_->{'rate'});
}
my $opWheel = new Algorithm::Evolutionary::Wheel @rates;
my @newpop;
my $pringaos = @$pop * $self->{'_replacementRate'} ;
for ( my $i = 0; $i < $pringaos; $i++ ) {
my @offspring;
my $selectedOp = $ops[ $opWheel->spin()];
# print $selectedOp->asXML;
for ( my $j = 0; $j < $selectedOp->arity(); $j ++ ) {
my $chosen = $genitors[ rand( @genitors )];
# print "Elegido ", $chosen->asString(), "\n";
push( @offspring, $chosen->clone() );
}
my $mutante = $selectedOp->apply( @offspring );
push( @newpop, $mutante );
}
my $eval = $self->{'_eval'};
map( $_->evaluate( $eval), @newpop );
#Eliminate and substitute
my $pop_hash = $self->{'_replacement_op'}->apply( $pop, \@newpop );
@$pop = rnkeysort { $_->{'_fitness'} } @$pop_hash ;
}
=head1 SEE ALSO
More or less in the same ballpark, alternatives to this one
=over 4
=item *
L<Algorithm::Evolutionary::Op::GeneralGeneration>
=back
=head1 Copyright
This file is released under the GPL. See the LICENSE file included in this distribution,
or go to http://www.fsf.org/licenses/gpl.txt
=cut
"The truth is out there";
( run in 0.618 second using v1.01-cache-2.11-cpan-5735350b133 )