Dr. Mark Humphrys

School of Computing. Dublin City University.

Home      Blog      Teaching      Research      Contact

My big idea: Ancient Brain


CA114      CA170

CA668      CA669      Projects

State space Search

3.1.3 - State space representation of problem

Representing Xs and Os as state-space problem.
Image courtesy of Ralph Morelli.
See Luger Fig II.5

State space representation of problem:
  1. All the states the system can be in are represented as nodes of a graph.
  2. An action that can change the system from one state to another (e.g. a move in a game) is represented by a link from one node to another.
  3. Links may be unidirectional (e.g. Xs and Os, chess, can't go back) or bi-directional (e.g. geographic move).
  4. Search for a solution.
  5. A solution might be:
    1. Any path from start state to goal state.
    2. The best (e.g. lowest cost) path from start state to goal state (e.g. Travelling salesman problem).
  6. It may be possible to reach the same state through many different paths (obviously true in Xs and Os).
  7. There may be loops in the graph (can go round in circle). No loops in Xs and Os.

Xs and Os

Travelling salesman problem

Travelling salesman problem

Travelling salesman problem.
Start at A, visit all cities, return to A. Links show cost of each trip (distance, money). Find trip with minimum cost.
Solution is a path. e.g. [A,D,C,B,E,A]
Image courtesy of Ralph Morelli.
See Luger Fig 3.9

Q. What is the shortest path?

Representing Travelling salesman problem as state-space problem.
Image courtesy of Ralph Morelli.
See Luger Fig 3.10.
Start at A, 4 choices for first step, 3 choices for next, 2 choices, 1 choice.
4! paths = 24 paths

Q. What assumption did we make?

Q. When do we stop the search?

Restrict search / Problem-specific heuristics

Reduce statespace

Branch and bound
- Keep track of best path so far. This is a bound on future candidates.
As soon as best possible extension to a partially-constructed path (the branch) exceeds bound, that partial path and all its extensions are removed.
Reduces space but still exponential (const)n number of paths.

Heuristic search

With large state spaces (e.g. 50 cities) need to use heuristic.
e.g. Nearest neighbour: "Go to the nearest unvisited city."
Finds solution quick! (Only tries one path!)

Luger changes his numbers to show example of "Nearest neighbour" heuristic failing on Travelling salesman problem:

Image courtesy of Ralph Morelli.
See Luger Fig 3.11

3.2 - Searching a statespace graph

3.2.2 - Backtracking (exhaustive search)

Backtracking - exhaustive search, try each path in order, until find goal.

The following shows the "Depth-first search" version of exhaustive search.

Start at A. Search state space systematically until find goal.
When multiple children, go down 1st child. If fails, back to parent, down 2nd child, and so on.
Note there are multiple paths to F. If F has already been found to be a dead-end when we went there from B, the algorithm should not go there a second time (from C).
Image courtesy of Ralph Morelli.
See Luger Fig 3.14


Definitions used in algorithm below:
  1. SL - state list - states in current path - path keeps changing - states added/removed as we go - until get path that ends in goal.
  2. NSL - new state list - nodes whose existence we have become aware of, but have not visited yet.
  3. DE - dead ends - nodes proven not to lead to goal.
  4. CS - current state.

function newchildren ( state )
  returns not all the children of state,
  but the new ones to look at
  i.e. those not on DE, SL or NSL

SL := [Start]			// CS is part of the chain
NSL := [Start]
DE := []
CS := Start  

while NSL not empty do
  if CS = goal  
    return SL
  else if newchildren(CS) not empty 
    place newchildren(CS) on NSL
    CS := first element of NSL	// move down to new state
    add CS to SL			// CS is part of the chain

  else 			// newchildren(CS) empty, so backtrack 
    while (SL not empty) and (CS == first element of SL) 
              add CS to DE 
              remove first element of SL                
              remove first element of NSL
              CS := first element of NSL
    add CS to SL


First we work down the tree:
    AFTER     CS    SL            NSL               DE
     0        A     [A]           [A]               []
     1        B     [B A]         [B C D A]         []
     2        E     [E B A]       [E F B C D A]     []
     3        H     [H E B A]     [H I E F B C D A] []
Now the first backtrack:
H has no new children. H will have been last link on SL, and last state added to NSL, if we use LIFO (stack) structure.
So while [H E B A] not empty and H is first element,
back up to parent, SL = [E B A], NSL = [I E F B C D A]
then go down: SL = [I E B A]
     4        I     [I E B A]     [I E F B C D A]   [H]
Now I is dead and so is parent E
I goes to DE, SL = [E B A], NSL = [E F B C D A], CS = E
CS is still first element of SL, so loop again
E goes to DE, SL = [B A], NSL = [F B C D A], CS = F, loop exits

     5        F     [F B A]       [F B C D A]       [E I H]
     6        J     [J F B A]     [J F B C D A]     [E I H]
     7        C     [C A]         [C D A]           [B F J E I H]
Here we only add G to NSL, since F is already in DE:

     8        G     [G C A]       [G C D A]         [B F J E I H]


  1. DE stops it examining states that are known completely already.
  2. Only goes to new states (not in SL path), so can't loop.

3.2.3 - Depth-first search, Breadth-first search

Image courtesy of Ralph Morelli.

Depth-first search (e.g. Backtrack above) examines the nodes in the order:

  A, B, E, K, S, L, T, F, M, C, G, N, H, O, P, U, D, I, Q, J, R

Breadth-first search does each level first before moving lower, examines the nodes in the order:

  A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U

Breadth-first search

  1. OPEN - states known to exist but not yet examined
  2. CLOSED - states examined


  function newchildren ( state )
   return children of state that are not already on OPEN or CLOSED   

  OPEN := [Start] 
  CLOSED := []

  while OPEN not empty
      remove LHS state from OPEN, call it X
      if X is goal
          return success 
          put X on CLOSED
          put newchildren(X) on RHS of OPEN    

    AFTER     OPEN                CLOSED
     0        [A]                 [] 
     1        [B C D]             [A]        
     2        [C D E F]           [B A] 
     3        [D E F G H]         [C B A]
     4        [E F G H I J]       [D C B A]
     5        [F G H I J K L]     [E D C B A]
     6        [G H I J K L M]     [F E D C B A]     
     7        [H I J K L M N]     [G F E D C B A]

Breadth-first v. Depth-first

3.2.4 - Iterative deepening depth-first search

Iterative deepening depth-first search
   Depth-first with bound of 1 level.
   If goal not found, depth-first with bound of 2.
   If goal not found, depth-first with bound of 3.
Guaranteed to find shortest path.

Image above.

Uninformed search

These are all Uninformed search algorithms.
Generic algorithms for any search problem.
No problem-specific information.
No problem-specific heuristic to guide/restrict search.

ancientbrain.com      w2mind.org      humphrysfamilytree.com

On the Internet since 1987.

Wikipedia: Sometimes I link to Wikipedia. I have written something In defence of Wikipedia. It is often a useful starting point but you cannot trust it. Linking to it is like linking to a Google search. A starting point, not a destination. I automatically highlight in red all links to Wikipedia and Google search and other possibly-unreliable user-generated content.