Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (A,0,null) ¡ D C F H E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 33 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G D C F H node ¡c ¡ (A,0,null) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 34 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G D C F H node ¡c ¡ (A,0,null) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 35 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G D C F H node ¡c ¡ (A,0,null) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 36 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G A ¡ D C F H node ¡c ¡ (A,0,null) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 37 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G A ¡ D C F H node ¡c ¡ (A,0,null) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 38 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (B,1,A) ¡ A ¡ (C,1,A) ¡ (D,1,A) ¡ ¡ D C F H node ¡c ¡ (A,0,null) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 39 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (B,1,A) ¡ A ¡ (C,1,A) ¡ (D,1,A) ¡ ¡ D C F H E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 40 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (C,1,A) ¡ A ¡ (D,1,A) ¡ ¡ D C F H node ¡c ¡ (B,1,A) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 41 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (C,1,A) ¡ A ¡ (D,1,A) ¡ ¡ D C F H node ¡c ¡ (B,1,A) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 42 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (C,1,A) ¡ A ¡ (D,1,A) ¡ ¡ D C F H node ¡c ¡ (B,1,A) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 43 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (C,1,A) ¡ A ¡ (D,1,A) ¡ B ¡ ¡ D C F H node ¡c ¡ (B,1,A) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 44 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (C,1,A) ¡ A ¡ (D,1,A) ¡ B ¡ ¡ D C F H node ¡c ¡ (B,1,A) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 45 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (C,1,A) ¡ A ¡ (D,1,A) ¡ B ¡ ¡ D C F H node ¡c ¡ (B,1,A) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) Need ¡to ¡add ¡(C,2,B) ¡and ¡(F,2,B) ¡to ¡open ¡ loop { ¡ if empty(open) then return FAILURE Since ¡BFS ¡expands ¡the ¡shallowest ¡node, ¡ c = removeFront(open) what ¡must ¡we ¡insure ¡about ¡the ¡open ¡list? ¡ if problem.goalTest(c.vertex) then return c ¡ if c.vertex is not in closed { What ¡queuing ¡funcEon ¡should ¡we ¡use? ¡ add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 46 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (C,1,A) ¡ A ¡ (D,1,A) ¡ B ¡ (C,2,B) ¡ (F,2,B) ¡ D C F H ¡ node ¡c ¡ (B,1,A) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) BFS ¡uses ¡a ¡ ¡ if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { FIFO ¡Queue! ¡ add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 47 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (D,1,A) ¡ A ¡ (C,2,B) ¡ B ¡ (F,2,B) ¡ ¡ D C F H node ¡c ¡ (C,1,A) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 48 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (D,1,A) ¡ A ¡ (C,2,B) ¡ B ¡ (F,2,B) ¡ C ¡ ¡ D C F H node ¡c ¡ (C,1,A) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 49 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (D,1,A) ¡ A ¡ (C,2,B) ¡ B ¡ (F,2,B) ¡ C ¡ (F,2,C) ¡ D C F H (E,2,C) ¡ ¡ node ¡c ¡ (C,1,A) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 50 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (C,2,B) ¡ A ¡ (F,2,B) ¡ B ¡ (F,2,C) ¡ C ¡ (E,2,C) ¡ D C F H ¡ node ¡c ¡ (D,1,A) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 51 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (C,2,B) ¡ A ¡ (F,2,B) ¡ B ¡ (F,2,C) ¡ C ¡ (E,2,C) ¡ D ¡ D C F H ¡ node ¡c ¡ (D,1,A) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 52 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (C,2,B) ¡ A ¡ (F,2,B) ¡ B ¡ (F,2,C) ¡ C ¡ (E,2,C) ¡ D ¡ D C F H (E,2,D) ¡ ¡ node ¡c ¡ (D,1,A) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 53 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (F,2,B) ¡ A ¡ (F,2,C) ¡ B ¡ (E,2,C) ¡ C ¡ (E,2,D) ¡ D ¡ D C F H ¡ node ¡c ¡ (C,2,B) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 54 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (F,2,B) ¡ A ¡ (F,2,C) ¡ B ¡ (E,2,C) ¡ C ¡ (E,2,D) ¡ D ¡ D C F H ¡ node ¡c ¡ (C,2,B) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 55 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (F,2,C) ¡ A ¡ (E,2,C) ¡ B ¡ (E,2,D) ¡ C ¡ ¡ D ¡ D C F H node ¡c ¡ (F,2,B) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 56 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (F,2,C) ¡ A ¡ (E,2,C) ¡ B ¡ (E,2,D) ¡ C ¡ ¡ D ¡ D C F H F ¡ node ¡c ¡ (F,2,B) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 57 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (F,2,C) ¡ A ¡ (E,2,C) ¡ B ¡ (E,2,D) ¡ C ¡ (G,3,F) ¡ D ¡ D C F H (H,3,F) ¡ F ¡ ¡ node ¡c ¡ (F,2,B) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 58 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (E,2,C) ¡ A ¡ (E,2,D) ¡ B ¡ (G,3,F) ¡ C ¡ (H,3,F) ¡ D ¡ D C F H ¡ F ¡ node ¡c ¡ (F,2,C) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 59 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (E,2,C) ¡ A ¡ (E,2,D) ¡ B ¡ (G,3,F) ¡ C ¡ (H,3,F) ¡ D ¡ D C F H ¡ F ¡ node ¡c ¡ (F,2,C) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 60 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (E,2,D) ¡ A ¡ (G,3,F) ¡ B ¡ (H,3,F) ¡ C ¡ ¡ D ¡ D C F H F ¡ node ¡c ¡ (E,2,C) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 61 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A A ¡ B G (E,2,D) ¡ B ¡ (G,3,F) ¡ C ¡ (H,3,F) ¡ D ¡ ¡ E ¡ D C F H F ¡ node ¡c ¡ (E,2,C) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 62 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A A ¡ B G (G,3,F) ¡ B ¡ (H,3,F) ¡ C ¡ ¡ D ¡ E ¡ D C F H F ¡ node ¡c ¡ (E,2,D) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 63 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A A ¡ B G (H,3,F) ¡ B ¡ ¡ C ¡ D ¡ E ¡ D C F H F ¡ node ¡c ¡ (G,3,F) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 64 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(BFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A A ¡ B G (H,3,F) ¡ B ¡ ¡ C ¡ D ¡ E ¡ D C F H F ¡ node ¡c ¡ (G,3,F) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 65 }}}
Breadth-‑First ¡Search ¡ 0 start A B G D C F H E J I 66
Breadth-‑First ¡Search ¡ 0 1 start A B G D C F H E J I 67
Breadth-‑First ¡Search ¡ 0 1 2 start A B G D C F H E J I 68
Breadth-‑First ¡Search ¡ 0 1 2 3 start A B G D C F H E J I 69
Breadth-‑First ¡Search ¡ 0 1 2 3 4 start A B G D C F H E J I 70
Depth-‑First ¡Search ¡ Expands ¡the ¡“deepest” ¡vertex ¡
Applica8on: ¡ ¡Route ¡Finding ¡(DFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G D C F H node ¡c ¡ (A,0,null) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 72 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(DFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (B,1,A) ¡ A ¡ (C,1,A) ¡ (D,1,A) ¡ ¡ D C F H node ¡c ¡ (A,0,null) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 73 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(DFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (C,1,A) ¡ A ¡ (D,1,A) ¡ ¡ D C F H node ¡c ¡ (B,1,A) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 74 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(DFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (C,1,A) ¡ A ¡ (D,1,A) ¡ B ¡ ¡ D C F H node ¡c ¡ (B,1,A) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 75 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(DFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (C,1,A) ¡ A ¡ (D,1,A) ¡ B ¡ ¡ D C F H node ¡c ¡ (B,1,A) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) Need ¡to ¡add ¡(C,2,B) ¡and ¡(F,2,B) ¡to ¡open ¡ loop { ¡ if empty(open) then return FAILURE Since ¡DFS ¡expands ¡the ¡deepest ¡node, ¡what ¡ c = removeFront(open) must ¡we ¡insure ¡about ¡the ¡open ¡list? ¡ if problem.goalTest(c.vertex) then return c ¡ if c.vertex is not in closed { What ¡queuing ¡funcEon ¡should ¡we ¡use? ¡ add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 76 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(DFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (F,2,B) ¡ A ¡ (C,2,B) ¡ B ¡ (C,1,A) ¡ (D,1,A) ¡ D C F H ¡ node ¡c ¡ (B,1,A) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) DFS ¡uses ¡a ¡ ¡ if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { LIFO ¡Stack! ¡ add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 77 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(DFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (C,2,B) ¡ A ¡ (C,1,A) ¡ B ¡ (D,1,A) ¡ ¡ D C F H node ¡c ¡ (F,2,B) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 78 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(DFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (C,2,B) ¡ A ¡ (C,1,A) ¡ B ¡ (D,1,A) ¡ F ¡ ¡ D C F H node ¡c ¡ (F,2,B) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 79 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(DFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (H,3,F) ¡ A ¡ (G,3,F) ¡ B ¡ (C,2,B) ¡ F ¡ (C,1,A) ¡ D C F H (D,1,A) ¡ ¡ node ¡c ¡ (F,2,B) ¡ ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 80 }}}
Applica8on: ¡ ¡Route ¡Finding ¡(DFS) ¡ open ¡list ¡ closed ¡list ¡ start goal A B G (H,3,F) ¡ A ¡ (G,3,F) ¡ B ¡ (C,2,B) ¡ F ¡ (C,1,A) ¡ D C F H (D,1,A) ¡ ¡ E J I graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) then return c if c.vertex is not in closed { add c.vertex to closed for each w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); 81 }}}
What ¡we’ve ¡found ¡so ¡far... ¡ Breadth-‑First ¡Search ¡ ¡ (FIFO ¡Queue) ¡ § Solves ¡ unweighted ¡shortest ¡path ¡problem : ¡ ¡ ¡ Finds ¡the ¡shortest ¡path ¡between ¡verEces ¡if ¡edges ¡ are ¡unweighted ¡(or ¡equal ¡cost) ¡ ¡ Depth-‑First ¡Search ¡ (LIFO ¡Stack) ¡ § Finds ¡nearby ¡goals ¡quickly ¡if ¡lucky ¡ § If ¡unlucky, ¡finds ¡nearby ¡goals ¡very ¡slowly ¡ 82
Applica8on: ¡ ¡8-‑Puzzle ¡ Given ¡an ¡iniEal ¡configuraEon ¡of ¡8 ¡numbered ¡ Eles ¡on ¡a ¡3 ¡x ¡3 ¡board, ¡move ¡the ¡Eles ¡as ¡to ¡ produce ¡a ¡desired ¡goal ¡configuraEon ¡ ¡ ¡ 83 Slide adapted from materials by Stuart Russell
Applica8on: ¡ ¡8-‑Puzzle ¡ • What are the vertices? 3 x 3 array configuration of the tiles on the board. • What are the edges? • Starting vertex? • of the board. • Goal vertex / vertices? A particular configuration of the board. 84 Slide adapted from materials by Stuart Russell
Applica8on: ¡ ¡8-‑Puzzle ¡ • What ¡are ¡the ¡ver8ces? ¡ ¡Each ¡vertex ¡corresponds ¡ to ¡a ¡parEcular ¡Ele ¡configuraEon ¡ • What ¡are ¡the ¡edges? ¡ ¡Consider ¡four ¡operators: ¡ ¡ Move ¡Blank ¡Square ¡Lei, ¡Right, ¡Up ¡or ¡Down ¡ ¡ – This ¡is ¡a ¡more ¡efficient ¡encoding ¡than ¡ considering ¡each ¡of ¡4 ¡moves ¡for ¡each ¡Ele ¡ ¡ The ¡edges ¡signify ¡applying ¡an ¡operator ¡to ¡a ¡board ¡ configuraEon ¡ • Ini8al ¡state? ¡ ¡A ¡parEcular ¡board ¡configuraEon ¡ • Goal ¡vertex? ¡ ¡A ¡parEcular ¡board ¡configuraEon ¡ 85 Slide adapted from materials by Stuart Russell
Outline ¡ • IntroducEon ¡ • Graph ¡Basics ¡ • Graph ¡Search ¡Problem ¡ – Breadth-‑First ¡Search ¡ – Depth-‑First ¡Search ¡ • Complexity ¡Analysis ¡ 86
Outline ¡ • IntroducEon ¡ • Graph ¡Basics ¡ • Graph ¡Search ¡Problem ¡ – Breadth-‑First ¡Search ¡ – Depth-‑First ¡Search ¡ • Complexity ¡Analysis ¡ 87
What ¡is ¡the ¡Time ¡Complexity ¡of ¡BFS ¡& ¡DFS? ¡ n In ¡the ¡worst ¡case, ¡the ¡goal ¡vertex ¡won’t ¡be ¡found ¡ graphSearch( problem , queuingFn ) { open = {}, closed = {} queuingFn(open, new Node(problem.startvertex)) loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) return c if c.vertex is not in closed { add c.vertex to closed for each Vertex w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); } } } 88
What ¡is ¡the ¡Time ¡Complexity ¡of ¡BFS ¡& ¡DFS? ¡ n In ¡the ¡worst ¡case, ¡the ¡goal ¡vertex ¡won’t ¡be ¡found ¡ graphSearch( problem , queuingFn ) { open = {}, closed = {} Each ¡vertex ¡is ¡in ¡ queuingFn(open, new Node(problem.startvertex)) the ¡queue ¡at ¡most ¡ loop { once, ¡so ¡the ¡outer ¡ if empty(open) then return FAILURE loop ¡runs ¡at ¡most ¡ c = removeFront(open) | V | ¡iteraEons ¡ if problem.goalTest(c.vertex) return c if c.vertex is not in closed { ¡ add c.vertex to closed for each Vertex w adjacent to c.vertex if w is not in closed queuingFn(open, new Node(w,c)); } } } 89
What ¡is ¡the ¡Time ¡Complexity ¡of ¡BFS ¡& ¡DFS? ¡ n In ¡the ¡worst ¡case, ¡the ¡goal ¡vertex ¡won’t ¡be ¡found ¡ graphSearch( problem , queuingFn ) { open = {}, closed = {} Each ¡vertex ¡is ¡in ¡ queuingFn(open, new Node(problem.startvertex)) the ¡queue ¡at ¡most ¡ loop { once, ¡so ¡the ¡outer ¡ if empty(open) then return FAILURE loop ¡runs ¡at ¡most ¡ c = removeFront(open) | V | ¡iteraEons ¡ if problem.goalTest(c.vertex) return c if c.vertex is not in closed { ¡ add c.vertex to closed Performance ¡will ¡ for each Vertex w adjacent to c.vertex if w is not in closed depend ¡on ¡the ¡Eme ¡ queuingFn(open, new Node(w,c)); } for ¡getAdjacent() ¡ } } ¡ 90
Graph ¡Representa8on: ¡ ¡Adjacency ¡Matrix ¡ 1 1 2 2 5 5 3 4 3 4 1 2 3 4 5 1 2 3 4 5 1 0 1 0 0 1 1 0 1 0 0 0 2 1 0 1 1 0 2 0 0 0 1 0 3 0 1 0 1 0 3 0 1 0 0 0 4 0 1 1 0 1 4 0 0 1 0 1 5 1 0 0 1 0 5 1 0 0 1 0 91
Graph ¡Representa8on: ¡ ¡Adjacency ¡Matrix ¡ 1 1 2 2 5 5 3 4 3 4 1 2 3 4 5 1 2 3 4 5 What ¡is ¡the ¡ 1 0 1 0 0 1 1 0 1 0 0 0 performance ¡of ¡ 2 1 0 1 1 0 2 0 0 0 1 0 getAdjacent(u)? ¡ 3 0 1 0 1 0 3 0 1 0 0 0 4 0 1 1 0 1 4 0 0 1 0 1 5 1 0 0 1 0 5 1 0 0 1 0 92
Graph ¡Representa8on: ¡ ¡Adjacency ¡List ¡ 1 2 5 3 4 What ¡is ¡the ¡ 2 1 performance ¡of ¡ 4 2 getAdjacent(u)? ¡ 3 2 4 3 5 5 1 4 93
What ¡is ¡the ¡Time ¡Complexity ¡of ¡BFS ¡& ¡DFS? ¡ n Using ¡an ¡adjacency ¡matrix: ¡ graphSearch( problem , queuingFn ) { open = {}, closed = {} | V | ¡iteraEons ¡ queuingFn(open, new Node(problem.startvertex)) ¡ loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) return c if c.vertex is not in closed { add c.vertex to closed O(| V |) ¡ for each Vertex w adjacent to c.vertex if w is not in closed ¡ queuingFn(open, new Node(w,c)); } } } 94
What ¡is ¡the ¡Time ¡Complexity ¡of ¡BFS ¡& ¡DFS? ¡ n Using ¡an ¡adjacency ¡matrix: ¡ ¡ O(| V | 2 ) graphSearch( problem , queuingFn ) { open = {}, closed = {} | V | ¡iteraEons ¡ queuingFn(open, new Node(problem.startvertex)) ¡ loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) return c if c.vertex is not in closed { add c.vertex to closed O(| V |) ¡ for each Vertex w adjacent to c.vertex if w is not in closed ¡ queuingFn(open, new Node(w,c)); } } } 95
What ¡is ¡the ¡Time ¡Complexity ¡of ¡BFS ¡& ¡DFS? ¡ n Using ¡an ¡adjacency ¡list: ¡ graphSearch( problem , queuingFn ) { open = {}, closed = {} | V | ¡iteraEons ¡ queuingFn(open, new Node(problem.startvertex)) ¡ loop { if empty(open) then return FAILURE c = removeFront(open) if problem.goalTest(c.vertex) return c if c.vertex is not in closed { add c.vertex to closed O(out-‑degree(c.vertex)) ¡ for each Vertex w adjacent to c.vertex if w is not in closed ¡ queuingFn(open, new Node(w,c)); } } } 96
What ¡is ¡the ¡Time ¡Complexity ¡of ¡BFS ¡& ¡DFS? ¡ n For ¡an ¡adjacency ¡list, ¡looping ¡over ¡all ¡adjacent ¡verEces ¡ of ¡ u ¡will ¡be ¡O(out-‑degree( u )) ¡ n Therefore, ¡the ¡traversal ¡performance ¡is ¡ ¡ ¡ 0 1 | V | X A = O ( | E | ) out-degree( v i ) O @ i =1 since ¡the ¡inner ¡loop ¡is ¡repeated ¡O( ¡| V | ¡) ¡Emes ¡ n However, ¡in ¡a ¡disconnected ¡graph, ¡we ¡must ¡sEll ¡look ¡at ¡ every ¡vertex, ¡so ¡the ¡performance ¡is ¡ ¡O( ¡| V | ¡+ ¡| E | ¡) ¡ How do these terms compare? 97
Sparse ¡vs ¡Dense ¡Graphs ¡ § A ¡ sparse ¡graph ¡is ¡one ¡with ¡ “ few ” ¡edges. ¡ That ¡is ¡ ¡ | E | = O ( | V | ) § A ¡ dense ¡graph ¡is ¡one ¡with ¡ “ many ” ¡edges. ¡ That ¡is ¡ � | V | 2 � | E | = O 1 1 2 2 5 5 3 4 3 4 98
What ¡is ¡the ¡Time ¡Complexity ¡of ¡BFS ¡& ¡DFS? ¡ n For ¡an ¡adjacency ¡list, ¡getAdjacent( u ) ¡will ¡be ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ O(out-‑degree( u )) ¡ n Therefore, ¡the ¡traversal ¡performance ¡is ¡ ¡ ¡ 0 1 | V | X A = O ( | E | ) out-degree( v i ) O @ i =1 since ¡getAdjacent ¡is ¡done ¡O( ¡| V | ¡) ¡Emes ¡ n However, ¡in ¡a ¡disconnected ¡graph, ¡we ¡must ¡sEll ¡look ¡at ¡ every ¡vertex, ¡so ¡the ¡performance ¡is ¡ ¡O( ¡| V | ¡+ ¡| E | ¡) ¡ Ranges ¡from ¡O( ¡| V | ¡) ¡to ¡O( ¡| V | 2 ), ¡ depending ¡on ¡density ¡ 99
What ¡is ¡the ¡Space ¡Complexity ¡of ¡BFS ¡& ¡DFS? ¡ § Really ¡depends ¡on ¡the ¡graph ¡representaEon ¡ Adjacency Matrix Adjacency List 1 2 3 4 5 2 1 1 0 1 0 0 0 4 2 2 0 0 0 1 0 3 2 3 0 1 0 0 0 4 3 5 4 0 0 1 0 1 5 1 4 5 1 0 0 1 0 100
What ¡is ¡the ¡Space ¡Complexity ¡of ¡BFS ¡& ¡DFS? ¡ § Really ¡depends ¡on ¡the ¡graph ¡representaEon ¡ Adjacency Matrix Adjacency List 1 2 3 4 5 2 1 1 0 1 0 0 0 4 2 2 0 0 0 1 0 3 2 3 0 1 0 0 0 4 3 5 4 0 0 1 0 1 5 1 4 5 1 0 0 1 0 Space ¡Complexity ¡ Space ¡Complexity ¡ O( | V | 2 ) O( | V | + | E | ) 101
Does ¡BFS ¡find ¡Shortest ¡Paths ¡in ¡ Weighted ¡Graphs? ¡ 3 v1 v2 v7 1 3 1 2 7 5 3 v4 v3 v6 v8 1 6 4 4 2 v5 v10 v9 1 102
Recommend
More recommend