next up previous
Next: About this document ... Up: Using Plansim to solve Previous: Evaluating a state

Creating an instance and solving it

The solve_template.cpp file under the examples/templates directory serves as basis for the examples/hanoi/hanoi_test.cpp file. This file creates a Tower of Hanoi instance and solves it through breadth first search.

First we replace all occurrences of $domain$ by 'hanoi'. Then we define a helper function that creates Tower of Hanoi instances, receiving as arguments the total number of towers and disks:

// Function to create instances
plansim::problem_instance::shared_ptr 
create_instance( unsigned int towers, unsigned int disks )
{
  // Creates a simulator
  simulator::shared_ptr s( new simulator( towers, disks ) );

  // Creates the evaluation and goal list
  std::list<plansim::goal::const_ptr> goal_list;
  plansim::evaluation::const_ptr e( new disks_in_place() );
  plansim::goal::const_ptr g1( new all_disks_in_rightmost_tower( s, e ) );
  goal_list.push_back( g1 );
  
  // Creates the search nodes manager
  plansim::search_nodes_manager::shared_ptr
    snm( new plansim::search_nodes_manager( 1024 ) );
  
  // Creates the instance 
  plansim::problem_instance::shared_ptr
    pi( new plansim::problem_instance( s, goal_list, snm ) );

  return pi;
}

We also must include the headers for the search strategies, goals and evaluations that will be used, in our case:

// Include here all the search algorithms that will be used
#include <plansim/breadth_first_search.hpp>

// Include the domain specific goals, for instance:
#include "all_disks_in_rightmost_tower.hpp"
// Include the domain specific evaluations, for instance:
#include "disks_in_place.hpp"

The bfs_test function is called by the Boost' unit test framework to solve the puzzle with 3 towers and 2 disks, 3 tower and 4 disks and 3 towers and 6 disks:

void bfs_test( void )
{
  try {

    plansim::problem_instance::shared_ptr
    pi( create_instance( 3, 2 ) );

    plansim::breadth_first_search bfs;
    plansim::plan p;
    plansim::search_algorithm::solve_return_code rc;
    rc = bfs.solve( pi, p, 10., numeric_limits<unsigned int>::max() );
    BOOST_CHECK_EQUAL( rc, 0 );
    BOOST_CHECK_EQUAL( p.get_cost(), 3 );
    std::cerr << p << std::endl;

    pi = create_instance( 3, 4 );
    rc = bfs.solve( pi, p, 16., numeric_limits<unsigned int>::max() );
    BOOST_CHECK_EQUAL( rc, 0 );
    BOOST_CHECK_EQUAL( p.get_cost(), 15 );
    std::cerr << p << std::endl;

    pi = create_instance( 3, 6 );
    rc = bfs.solve( pi, p, numeric_limits<unsigned int>::max(), 
		    numeric_limits<unsigned int>::max() );
    BOOST_CHECK_EQUAL( rc, 0 );
    BOOST_CHECK_EQUAL( p.get_cost(), 63 );
    std::cerr << p << std::endl;

  }
  catch(...) {
    BOOST_ERROR( "Unexpected exception" );
    throw;
  }
}

The resulting plans are:

1: [ Move disk 1 from tower 0 to tower 1 ], C: 1
2: [ Move disk 0 from tower 0 to tower 2 ], C: 2
3: [ Move disk 1 from tower 1 to tower 2 ], C: 3

1: [ Move disk 3 from tower 0 to tower 1 ], C: 1
2: [ Move disk 2 from tower 0 to tower 2 ], C: 2
3: [ Move disk 3 from tower 1 to tower 2 ], C: 3
4: [ Move disk 1 from tower 0 to tower 1 ], C: 4
5: [ Move disk 3 from tower 2 to tower 0 ], C: 5
6: [ Move disk 2 from tower 2 to tower 1 ], C: 6
7: [ Move disk 3 from tower 0 to tower 1 ], C: 7
8: [ Move disk 0 from tower 0 to tower 2 ], C: 8
9: [ Move disk 3 from tower 1 to tower 2 ], C: 9
10: [ Move disk 2 from tower 1 to tower 0 ], C: 10
11: [ Move disk 3 from tower 2 to tower 0 ], C: 11
12: [ Move disk 1 from tower 1 to tower 2 ], C: 12
13: [ Move disk 3 from tower 0 to tower 1 ], C: 13
14: [ Move disk 2 from tower 0 to tower 2 ], C: 14
15: [ Move disk 3 from tower 1 to tower 2 ], C: 15

1: [ Move disk 5 from tower 0 to tower 1 ], C: 1
2: [ Move disk 4 from tower 0 to tower 2 ], C: 2
3: [ Move disk 5 from tower 1 to tower 2 ], C: 3
4: [ Move disk 3 from tower 0 to tower 1 ], C: 4
5: [ Move disk 5 from tower 2 to tower 0 ], C: 5
6: [ Move disk 4 from tower 2 to tower 1 ], C: 6
7: [ Move disk 5 from tower 0 to tower 1 ], C: 7
8: [ Move disk 2 from tower 0 to tower 2 ], C: 8
9: [ Move disk 5 from tower 1 to tower 2 ], C: 9
10: [ Move disk 4 from tower 1 to tower 0 ], C: 10
11: [ Move disk 5 from tower 2 to tower 0 ], C: 11
12: [ Move disk 3 from tower 1 to tower 2 ], C: 12
13: [ Move disk 5 from tower 0 to tower 1 ], C: 13
14: [ Move disk 4 from tower 0 to tower 2 ], C: 14
15: [ Move disk 5 from tower 1 to tower 2 ], C: 15
16: [ Move disk 1 from tower 0 to tower 1 ], C: 16
17: [ Move disk 5 from tower 2 to tower 0 ], C: 17
18: [ Move disk 4 from tower 2 to tower 1 ], C: 18
19: [ Move disk 5 from tower 0 to tower 1 ], C: 19
20: [ Move disk 3 from tower 2 to tower 0 ], C: 20
21: [ Move disk 5 from tower 1 to tower 2 ], C: 21
22: [ Move disk 4 from tower 1 to tower 0 ], C: 22
23: [ Move disk 5 from tower 2 to tower 0 ], C: 23
24: [ Move disk 2 from tower 2 to tower 1 ], C: 24
25: [ Move disk 5 from tower 0 to tower 1 ], C: 25
26: [ Move disk 4 from tower 0 to tower 2 ], C: 26
27: [ Move disk 5 from tower 1 to tower 2 ], C: 27
28: [ Move disk 3 from tower 0 to tower 1 ], C: 28
29: [ Move disk 5 from tower 2 to tower 0 ], C: 29
30: [ Move disk 4 from tower 2 to tower 1 ], C: 30
31: [ Move disk 5 from tower 0 to tower 1 ], C: 31
32: [ Move disk 0 from tower 0 to tower 2 ], C: 32
33: [ Move disk 5 from tower 1 to tower 2 ], C: 33
34: [ Move disk 4 from tower 1 to tower 0 ], C: 34
35: [ Move disk 5 from tower 2 to tower 0 ], C: 35
36: [ Move disk 3 from tower 1 to tower 2 ], C: 36
37: [ Move disk 5 from tower 0 to tower 1 ], C: 37
38: [ Move disk 4 from tower 0 to tower 2 ], C: 38
39: [ Move disk 5 from tower 1 to tower 2 ], C: 39
40: [ Move disk 2 from tower 1 to tower 0 ], C: 40
41: [ Move disk 5 from tower 2 to tower 0 ], C: 41
42: [ Move disk 4 from tower 2 to tower 1 ], C: 42
43: [ Move disk 5 from tower 0 to tower 1 ], C: 43
44: [ Move disk 3 from tower 2 to tower 0 ], C: 44
45: [ Move disk 5 from tower 1 to tower 2 ], C: 45
46: [ Move disk 4 from tower 1 to tower 0 ], C: 46
47: [ Move disk 5 from tower 2 to tower 0 ], C: 47
48: [ Move disk 1 from tower 1 to tower 2 ], C: 48
49: [ Move disk 5 from tower 0 to tower 1 ], C: 49
50: [ Move disk 4 from tower 0 to tower 2 ], C: 50
51: [ Move disk 5 from tower 1 to tower 2 ], C: 51
52: [ Move disk 3 from tower 0 to tower 1 ], C: 52
53: [ Move disk 5 from tower 2 to tower 0 ], C: 53
54: [ Move disk 4 from tower 2 to tower 1 ], C: 54
55: [ Move disk 5 from tower 0 to tower 1 ], C: 55
56: [ Move disk 2 from tower 0 to tower 2 ], C: 56
57: [ Move disk 5 from tower 1 to tower 2 ], C: 57
58: [ Move disk 4 from tower 1 to tower 0 ], C: 58
59: [ Move disk 5 from tower 2 to tower 0 ], C: 59
60: [ Move disk 3 from tower 1 to tower 2 ], C: 60
61: [ Move disk 5 from tower 0 to tower 1 ], C: 61
62: [ Move disk 4 from tower 0 to tower 2 ], C: 62
63: [ Move disk 5 from tower 1 to tower 2 ], C: 63



2005-04-08