sub evaluate { my $cand = shift; my $bags = shift; printf "\n%20s %15s %15s %s\n", "Monk", "Better:higher", "Better:lower", "Result"; print "------------------------------------------------------------\n\n"; for my $bag (@$bags) { print "bag: "; print join ", ", map { +"$_ => ".$bag->{$_} } sort keys %$bag ; print "\n\n"; for my $monk ( sort keys %$cand ) { my $result = $cand->{$monk}->($bag); my $disp = dispersion( @$result ); my $score = measure( @$result ); printf "%20s %15.2f %15.2f %s\n", $monk, $disp, $score, join "", @$result; } print "\n"; } } my $bags = [ { A => 4, B => 2, C => 3, D => 1, }, { A => 4, B => 2, C => 3, D => 1, F => 2, G => 4, H=> 2, I=>30 }, { A => 10, B=> 10, C => 10, }, ]; my $candidates = { # sub expects hash ref and returns array ref kennethk => \&gen, BrowserUK => \&genUK, kcott => \&kcott, hdb => \&mix, }; evaluate( $candidates, $bags );