———use
strict;
use
warnings;
=head1 NAME
Algorithm::Evolutionary::Fitness::MMDP - Massively Multimodal Deceptive Problem
=head1 SYNOPSIS
use Algorithm::Evolutionary::Fitness::MMDP;
my @chromosome = "010101101010111111000000"
my $fitness_func = Algorithm::Evolutionary::Fitness::MMDP::apply;
my $fitness = $fitness_func( $chromosome );
my $fitness_object = Algorithm::Evolutionary::Fitness::MMDP->new()
$fitness = $fitness_object->apply( $chromosome)
=head1 DESCRIPTION
Massively Multimodal Deceptive Problem, tough for evolutionary algorithms.
=head1 METHODS
=cut
our
$VERSION
=
'3.0'
;
our
@unitation
=
qw( 1 0 0.360384 0.640576 0.360384 0 1)
;
sub
_really_apply {
my
$self
=
shift
;
return
$self
->mmdp(
@_
);
}
=head2 mmdp( $string )
Computes the MMDP value for a binary string, storing it in a cache.
=cut
sub
mmdp {
my
$self
=
shift
;
my
$string
=
shift
;
my
$cache
=
$self
->{
'_cache'
};
if
(
$cache
->{
$string
} ) {
return
$cache
->{
$string
};
}
my
$fitness
= 0;
for
(
my
$i
= 0;
$i
<
length
(
$string
);
$i
+= BLOCK_SIZE ) {
my
$block
=
substr
(
$string
,
$i
, BLOCK_SIZE );
my
$ones
=
grep
( /1/,
split
(//,
$block
));
$fitness
+=
$unitation
[
$ones
];
}
$cache
->{
$string
} =
$fitness
;
return
$fitness
;
}
=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???"
;