NAME

AI::Pathfinding::OptimizeMultiple - optimize path finding searches for a large set of initial conditions (for better average performance).

SYNOPSIS

use AI::Pathfinding::OptimizeMultiple

my @scans =
(
    {
        name => "first_search"
    },
    {
        name => "second_search",
    },
    {
        name => "third_search",
    },
);

my $obj = AI::Pathfinding::OptimizeMultiple->new(
    {
        scans => \@scans,
        num_boards => 32_000,
        optimize_for => 'speed',
        scans_iters_pdls =>
        {
            first_search => $first_search_pdl,
            second_search => $second_search_pdl,
        },
        quotas => [400, 300, 200],
        selected_scans =>
        [
            AI::Pathfinding::OptimizeMultiple::Scan->new(
                id => 'first_search',
                cmd_line => "--preset first_search",
            ),
            AI::Pathfinding::OptimizeMultiple::Scan->new(
                id => 'second_search',
                cmd_line => "--preset second_search",
            ),
            AI::Pathfinding::OptimizeMultiple::Scan->new(
                id => 'third_search',
                cmd_line => "--preset third_search",
            ),
        ],
    }
);

$obj->calc_meta_scan();

foreach my $scan_alloc (@{$self->chosen_scans()})
{
    printf "Run %s for %d iterations.\n",
        $scans[$scan_alloc->scan_idx], $scan_alloc->iters;
}

DESCRIPTION

This CPAN distribution implements the algorithm described here:

Given statistics on the performance of several game AI searches (or scans) across a representative number of initial cases, find a scan that solves most deals with close-to-optimal performance, by using switch tasking.

SUBROUTINES/METHODS

my $chosen_scans_array_ref = $self->chosen_scans()

Returns the scans that have been chosen to perform the iteration. Each one is a AI::Pathfinding::OptimizeMultiple::ScanRun object.

$calc_meta_scan->calc_meta_scan()

Calculates the meta-scan after initialisation. See here for the details of the algorithm:

http://www.shlomifish.org/lecture/Freecell-Solver/The-Next-Pres/slides/multi-tasking/best-meta-scan/

$self->calc_flares_meta_scan()

This function calculates the flares meta-scan: i.e: assuming that all atomic scans are run one after the other and the shortest solutions of all successful scans are being picked.

$calc_meta_scan->calc_board_iters($board_idx)

Calculates the iterations of the board $board_idx in all the scans.

Returns a hash_ref containing the key 'per_scan_iters' for the iterations per scan, and 'board_iters' for the total board iterations when ran in the scans.

my $status = $calc_meta_scan->get_final_status()

Returns the status as string:

  • "solved_all"

  • "iterating"

  • "out_of_quotas"

my $sim_results_obj = $calc_meta_scan->simulate_board($board_idx)

Simulates the board No $board_idx through the scan. Returns a AI::Pathfinding::OptimizeMultiple::SimulationResults object.

my $n = $calc_meta_scan->get_total_iters()

Returns the total iterations count so far.

BUILD()

Moo leftover. INTERNAL USE.

SEE ALSO

AUTHOR

Shlomi Fish, http://www.shlomifish.org/ .

ACKNOWLEDGEMENTS

popl from Freenode's #perl for trying to dig some references to an existing algorithm in the scientific literature.