—————use
warnings;
=encoding utf8
=head1 NAME
Algorithm::Evolutionary::Fitness::Any - Façade for any function so that it can be used as fitness
=head1 SYNOPSIS
use Algorithm::Evolutionary::Utils qw( string_decode )
sub squares {
my $chrom = shift;
my @values = string_decode( $chrom, 10, -1, 1 );
return $values[0] * $values[1];
}
my $any_eval = new Algorithm::Evolutionary::Fitness::Any \&squares;
=head1 DESCRIPTION
Turns any subroutine or closure into a fitness function. Useful mainly
if you want results cached; it's not really needed otherwise.
=head1 METHODS
=cut
use
Carp;
our
$VERSION
=
'3.2'
;
=head2 new( $function )
Assigns default variables
=cut
sub
new {
my
$class
=
shift
;
my
$self
= {
_function
=>
shift
|| croak
"No functiona rray"
};
bless
$self
,
$class
;
$self
->initialize();
return
$self
;
}
=head2 apply( $individual )
Applies the instantiated problem to a chromosome. It is actually a
wrapper around C<_apply>.
=cut
sub
apply {
my
$self
=
shift
;
my
$individual
=
shift
|| croak
"Nobody here!!!"
;
$self
->{
'_counter'
}++;
return
$self
->_apply(
$individual
);
}
=head2 _apply( $individual )
This is the one that really does the stuff. It applies the defined
function to each individual. Itis cached for efficiency.
=cut
sub
_apply {
my
$self
=
shift
;
my
$individual
=
shift
|| croak
"Nobody here!"
;
my
$chrom
=
$individual
->Chrom();
my
$cache
=
$self
->{
'_cache'
};
if
(
$cache
->{
$chrom
} ) {
return
$cache
->{
$chrom
};
}
my
$result
=
$self
->{
'_function'
}->(
$chrom
);
if
( (
scalar
$chrom
) eq
$chrom
) {
$cache
->{
$chrom
} =
$result
;
}
return
$result
;
}
=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
"What???"
;