Algorithm-MasterMind
view release on metacpan or search on metacpan
lib/Algorithm/MasterMind/Test_Solver.pm view on Meta::CPAN
package Algorithm::MasterMind::Test_Solver;
use warnings;
use strict;
use Carp;
use lib qw(../../lib ../../../lib);
our $VERSION = sprintf "%d.%03d", q$Revision: 1.4 $ =~ /(\d+)\.(\d+)/g;
use base 'Exporter';
use Algorithm::MasterMind qw(check_combination);
use Test::More;
our @EXPORT_OK = qw( solve_mastermind );
sub solve_mastermind {
my $solver = shift;
my $secret_code = shift;
my $length = length( $secret_code );
my %played;
my $first_string = $solver->issue_first;
$played{$first_string} = 1;
diag( "This might take a while while it finds the code $secret_code" );
is( length( $first_string), $length, 'Issued first '. $first_string );
$solver->feedback( check_combination( $secret_code, $first_string) );
my $played_string = $solver->issue_next;
my $played = 2;
while ( $played_string ne $secret_code ) {
is( $played{ $played_string}, undef, 'Playing '. $played_string ) ;
$played{$played_string} = 1;
# my (%combinations, %fitness);
# map ( $combinations{$_->{'_str'}}++, @{$solver->{'_pop'}});
# map ( $fitness{$_->{'_str'}} = $_->Fitness(), @{$solver->{'_pop'}});
# for my $c ( sort {$combinations{$a} <=> $combinations{$b} } keys %combinations ) {
# print "$c => $combinations{$c} $fitness{$c}\n" if $combinations{$c}>1 ;
# }
$solver->feedback( check_combination( $secret_code, $played_string) );
$played_string = $solver->issue_next;
$played ++;
}
is( $played_string, $secret_code, "Found code after ".$solver->evaluated()." combinations" );
return [$solver->evaluated(), $played];
}
"some blacks, all white"; # Magic true value required at end of module
__END__
=head1 NAME
Algorithm::MasterMind::Test_Solver - Utility functions for testing solvers
=head1 SYNOPSIS
use Algorithm::MasterMind::Test_Solver;
my $secret_code = 'EAFC';
my $population_size = 256;
my $length = length( $secret_code );
my @alphabet = qw( A B C D E F );
my $solver = new Algorithm::MasterMind::Canonical_GA { alphabet => \@alphabet,
length => length( $secret_code ),
pop_size => $population_size};
( run in 0.516 second using v1.01-cache-2.11-cpan-5735350b133 )