Algorithm-MasterMind
view release on metacpan or search on metacpan
lib/Algorithm/MasterMind/EDA.pm view on Meta::CPAN
my $self = shift;
my $rules = $self->number_of_rules();
my ($match, $best);
my $pop = $self->{'_pop'};
my $eda = $self->{'_eda'};
map( $_->evaluate( $self->{'_fitness'}), @$pop );
my @ranked_pop = sort { $b->{_fitness} <=> $a->{_fitness}; } @$pop;
if ( $ranked_pop[0]->{'_matches'} == $rules ) { #Already found!
return $self->{'_last'} = $ranked_pop[0]->{'_str'};
} else {
my $generations_passed = 0;
my @pop_by_matches;
do {
$eda->apply( $pop );
map( $_->{'_matches'} = $_->{'_matches'}?$_->{'_matches'}:-1, @$pop ); #To avoid warnings
@pop_by_matches = sort { $b->{'_matches'} <=> $a->{'_matches'} } @$pop;
$generations_passed ++;
$best = $pop_by_matches[0];
if ($generations_passed == 15 ) {
$eda->reset( $pop );
$generations_passed = 0;
}
} while ( $best->{'_matches'} < $rules );
return $self->{'_last'} = $best->{'_str'};
}
}
"Many blacks, 0 white"; # Magic true value required at end of module
__END__
=head1 NAME
Algorithm::MasterMind::EDA - Solver using an Estimation of Distribution Algorithm
=head1 SYNOPSIS
use Algorithm::MasterMind::EDA;
my $secret_code = 'EAFC';
my $population_size = 200;
my @alphabet = qw( A B C D E F );
my $solver = new Algorithm::MasterMind::EDA { alphabet => \@alphabet,
length => length( $secret_code ),
pop_size => $population_size};
#The rest, same as the other solvers
=head1 DESCRIPTION
Uses L<Algorithm::Evolutionary> instance of EDAs to solve MM; as there
are two different fitness functions you can use; probably
C<fitness_orig> works better.
=head1 INTERFACE
=head2 initialize
Performs bookkeeping, and assigns flags depending on the
initialization values
=head2 new ( $options )
This function, and all the rest, are directly inherited from base
=head2 issue_first()
Yields the first combination
=head2 issue_next()
Issues the next combination
=head2 feedback()
Obtain the result to the last combination played
=head2 guesses()
Total number of guesses
=head2 evaluated()
Total number of combinations checked to issue result
=head2 number_of_rules ()
Returns the number of rules in the algorithm
=head2 rules()
Returns the rules (combinations, blacks, whites played so far) y a
reference to array
=head2 matches( $string )
Returns a hash with the number of matches, and whether it matches
every rule with the number of blacks and whites it obtains with each
of them
=head2 fitness( $individual )
Computes fitness summing the number of correct black and whites plus
the number of rules the combination meets times the length
=head2 fitness_orig( $individual )
Fitness proposed in the Applied and Soft Computing paper, difference
between the number of blacks/whites obtained by rules against the
secret code and by the combination against the combination in the
rule.
=head1 SEE ALSO
Other solvers: L<Algorithm::MasterMind::Sequential> and
L<Algorithm::MasterMind::Random>. Don't work as well, really.
=head1 AUTHOR
( run in 0.629 second using v1.01-cache-2.11-cpan-5b529ec07f3 )