Graphs. Directed graphs. Readings: Section 28

Similar documents
Graphs. Readings: Section 28. CS 135 Fall : Graphs 1

Trees. Readings: HtDP, sections 14, 15, 16.

Module 9: Binary trees

Module 8: Binary trees

Trees. Binary arithmetic expressions. Visualizing binary arithmetic expressions. ((2 6) + (5 2))/(5 3) can be defined in terms of two smaller

CS 135 Winter 2018 Tutorial 7: Accumulative Recursion and Binary Trees. CS 135 Winter 2018 Tutorial 7: Accumulative Recursion and Binary Trees 1

Trees. Example: Binary expression trees. Example: Evolution trees. Readings: HtDP, sections 14, 15, 16.

Module 5: Lists. Readings: HtDP, Sections 9, 10.

Module 10: General trees

CS115 - Module 10 - General Trees

Types of recursion. Readings: none. In this module: a glimpse of non-structural recursion. CS 135 Winter : Types of recursion 1

Working with recursion

CS 135 Winter 2018 Tutorial 8: Mutual recursion, nested lists, and local. CS 135 Winter 2018 Tutorial 8: Mutual recursion, nested lists, and local 1

Lists. Readings: HtDP, sections 9 and 10. Avoid 10.3 (uses draw.ss). CS 135 Winter : Lists 1

Types of recursion. Structural vs. general recursion. Pure structural recursion. Readings: none. In this module: learn to use accumulative recursion

How to Design Programs

Working with recursion. From definition to template. Readings: HtDP, sections 11, 12, 13 (Intermezzo 2).

CS 135 Fall 2018 Final Exam Review. CS 135 Fall 2018 Final Exam Review 1

Module 9: Trees. If you have not already, make sure you. Read How to Design Programs Sections 14, 15, CS 115 Module 9: Trees

Functional abstraction. What is abstraction? Eating apples. Readings: HtDP, sections Language level: Intermediate Student With Lambda

Functional abstraction

Practice Problems for the Final

Generative and accumulative recursion. What is generative recursion? Example revisited: GCD. Readings: Sections 25, 26, 27, 30, 31

Graphs. A graph is a data structure consisting of nodes (or vertices) and edges. An edge is a connection between two nodes

Graphs & Digraphs Tuesday, November 06, 2007

Module 8: Local and functional abstraction

Assignment: 7. Due: Language level: Allowed recursion:

CS115 - Module 8 - Binary trees

Local definitions and lexical scope

Local definitions and lexical scope. Local definitions. Motivating local definitions. s(s a)(s b)(s c), where s = (a + b + c)/2.

6.001 Notes: Section 31.1

CS 231: Algorithmic Problem Solving

CS 4100 // artificial intelligence

Module 3: New types of data

Lecture 31: Graph Search & Game 10:00 AM, Nov 16, 2018

Constraint Satisfaction Problems

Lecture 24 Search in Graphs

6.001 Notes: Section 4.1

ECE 250 Algorithms and Data Structures

Scheme: Data. CS F331 Programming Languages CSCE A331 Programming Language Concepts Lecture Slides Monday, April 3, Glenn G.

Coping with the Limitations of Algorithm Power Exact Solution Strategies Backtracking Backtracking : A Scenario

Artificial Intelligence

Case Study: Undefined Variables

CS 188: Artificial Intelligence Fall 2011

Lists of Lists. CS 5010 Program Design Paradigms Bootcamp Lesson 6.5

CS 188: Artificial Intelligence. What is Search For? Constraint Satisfaction Problems. Constraint Satisfaction Problems

Chapter 20: Binary Trees

CS115 INTRODUCTION TO COMPUTER SCIENCE 1. Additional Notes Module 5

Module 05: Types of recursion

Lecture 24 Notes Search in Graphs

Lecture 14: March 9, 2015

The Design Recipe Fall 2017

Principles of Programming Languages Topic: Functional Programming Professor L. Thorne McCarty Spring 2003

The Design Recipe Fall 2018

More About Recursive Data Types

Module 4: Compound data: structures


CS 1101 Exam 3 A-Term 2013

CS115 - Module 3 - Booleans, Conditionals, and Symbols

Search and Optimization

Announcements. Homework 1: Search. Project 1: Search. Midterm date and time has been set:

Graph definitions. There are two kinds of graphs: directed graphs (sometimes called digraphs) and undirected graphs. An undirected graph

CS115 - Module 4 - Compound data: structures

CS 61A, Fall, 2002, Midterm #2, L. Rowe. 1. (10 points, 1 point each part) Consider the following five box-and-arrow diagrams.

CS 343: Artificial Intelligence

Constraint Satisfaction Problems

CS 314 Principles of Programming Languages

Documentation for LISP in BASIC

Trees. CS 5010 Program Design Paradigms Bootcamp Lesson 5.1

ormap, andmap, and filter

CS2 Algorithms and Data Structures Note 10. Depth-First Search and Topological Sorting

Recursion. move(64, 1, 2, 3);

CS116 - Module 5 - Accumulative Recursion

Announcements. Homework 4. Project 3. Due tonight at 11:59pm. Due 3/8 at 4:00pm

Lists of Lists. CS 5010 Program Design Paradigms Bootcamp Lesson 5.3

HEURISTIC SEARCH. 4.3 Using Heuristics in Games 4.4 Complexity Issues 4.5 Epilogue and References 4.6 Exercises

CS 5010 Program Design Paradigms Lesson 6.1

6.001 Notes: Section 8.1

What is Search For? CS 188: Artificial Intelligence. Constraint Satisfaction Problems

(Refer Slide Time: 02.06)

CSU211 Exam 2 Fall 2007

Graphs. Part I: Basic algorithms. Laura Toma Algorithms (csci2200), Bowdoin College

Lecture 18. Questions? Monday, February 20 CS 430 Artificial Intelligence - Lecture 18 1

Announcements. CS 188: Artificial Intelligence Fall 2010

Uninformed Search. Problem-solving agents. Tree search algorithms. Single-State Problems

(add1 3) 4 (check-expect (add1 3) 4)

Module 4: Compound data: structures

Announcements. The current topic: Scheme. Review: BST functions. Review: Representing trees in Scheme. Reminder: Lab 2 is due on Monday at 10:30 am.

Graph Algorithms Using Depth First Search

CS 314 Principles of Programming Languages. Lecture 16

CS 3410 Ch 7 Recursion

Lars Schmidt-Thieme, Information Systems and Machine Learning Lab (ISMLL), University of Hildesheim, Germany, Course on Artificial Intelligence,

Recursion. Recursion is: Recursion splits a problem:

CSE 473: Artificial Intelligence

Introduction HEURISTIC SEARCH. Introduction. Heuristics. Two main concerns of AI researchers. Two problems with the search process

User-defined Functions. Conditional Expressions in Scheme

Constraint Satisfaction Problems

Solving Problems: Blind Search

Comp 411 Principles of Programming Languages Lecture 7 Meta-interpreters. Corky Cartwright January 26, 2018

(Refer Slide Time: 06:01)

Transcription:

Graphs Readings: Section 28 CS 135 Winter 2018 12: Graphs 1 Directed graphs A directed graph consists of a collection of vertices (also called nodes) together with a collection of edges. An edge is an ordered pair of vertices, which we can represent by an arrow from one vertex to another. CS 135 Winter 2018 12: Graphs 2 A C D F K H B E J CS 135 Winter 2018 12: Graphs 3

We have seen such graphs before. Evolution trees and expression trees were both directed graphs of a special type. An edge represented a parent-child relationship. Graphs are a general data structure that can model many situations. Computations on graphs form an important part of the computer science toolkit. CS 135 Winter 2018 12: Graphs 4 Graph terminology Given an edge (v, w), we say that w is an out-neighbour of v, and v is an in-neighbour of w. A sequence of vertices v 1, v 2,..., v k is a path or route of length k 1 if (v 1, v 2 ), (v 2, v 3 ),..., (v k 1, v k ) are all edges. If v 1 = v k, this is called a cycle. Directed graphs without cycles are called DAGs (directed acyclic graphs). CS 135 Winter 2018 12: Graphs 5 Representing graphs We can represent a node by a symbol (its name), and associate with each node a list of its out-neighbours. This is called the adjacency list representation. More specifically, a graph is a list of pairs, each pair consisting of a symbol (the node s name) and a list of symbols (the names of the node s out-neighbours). This is very similar to a parent node with a list of children. CS 135 Winter 2018 12: Graphs 6

Our example as data ((A (C D E)) (B (E J)) (C ()) A C D F (D (F J)) (E (K)) K H (F (K H)) (H ()) (J (H)) B E J (K ())) CS 135 Winter 2018 12: Graphs 7 Data definitions To make our contracts more descriptive, we will define a Node and a Graph as follows: ;; A Node is a Sym ;; A Graph is a (listof (list Node (listof Node))) CS 135 Winter 2018 12: Graphs 8 The template for graphs ;; graph-template: Graph Any (define (graph-template G) (cond [(empty? G)... ] [(cons? G) (... (first (first G))... ; first node in graph list (listof-node-template (second (first G)))... ; list of adjacent nodes (graph-template (rest G))... )])) CS 135 Winter 2018 12: Graphs 9

Finding routes A path in a graph can be represented by the list of nodes on the path. We wish to design a function find-route that consumes a graph plus origin and destination nodes, and produces a path from the origin to the destination, or false if no such path exists. First we create an auxiliary function neighbours that consumes a node and a graph and produces the list of out-neighbours of the node. CS 135 Winter 2018 12: Graphs 10 Neighbours in our example (neighbours A G) (list C D E) (neighbours H G) empty A C D F K H B E J CS 135 Winter 2018 12: Graphs 11 ;; (neighbours v G) produces list of neighbours of v in G ;; neighbours: Node Graph (listof Node) ;; requires: v is a node in G (define (neighbours v G) (cond [(symbol=? v (first (first G))) (second (first G))] [else (neighbours v (rest G))])) CS 135 Winter 2018 12: Graphs 12

Cases for find-route Structural recursion does not work for find-route; we must use generative recursion. If the origin equals the destination, the path consists of just this node. Otherwise, if there is a path, the second node on that path must be an out-neighbour of the origin node. Each out-neighbour defines a subproblem (finding a route from it to the destination). CS 135 Winter 2018 12: Graphs 13 In our example, any route from A to H must pass through C, D, or E. If we knew a route from C to H, or from D to H, or from E to H, we could create one from A to H. A C D F K H B E J CS 135 Winter 2018 12: Graphs 14 Backtracking algorithms Backtracking algorithms try to find a route from an origin to a destination. If the initial attempt does not work, such an algorithm backtracks and tries another choice. Eventually, either a route is found, or all possibilities are exhausted, meaning there is no route. CS 135 Winter 2018 12: Graphs 15

In our example, we can see the backtracking since the search for a route from A to H can be seen as moving forward in the graph looking for H. If this search fails (for example, at C), then the algorithm backs up to the previous vertex (A) and tries the next neighbour (D). If we find a path from D to H, we can just add A to the beginning of this path. CS 135 Winter 2018 12: Graphs 16 We need to apply find-route on each of the out-neighbours of a given node. All those out-neighbours are collected into a list associated with that node. This suggests writing find-route/list which does this for the entire list of out-neighbours. The function find-route/list will apply find-route to each of the nodes on that list until it finds a route to the destination. CS 135 Winter 2018 12: Graphs 17 This is the same recursive pattern that we saw in the processing of expression trees (and descendant family trees, in HtDP). For expression trees, we had two mutually recursive functions, eval and apply. Here, we have two mutually recursive functions, find-route and find-route/list. CS 135 Winter 2018 12: Graphs 18

;; (find-route orig dest G) finds route from orig to dest in G if it exists ;; find-route: Node Node Graph (anyof (listof Node) false) (define (find-route orig dest G) (cond [(symbol=? orig dest) (list orig)] [else (local [(define nbrs (neighbours orig G)) (define route (find-route/list nbrs dest G))] (cond [(false? route) route] [else (cons orig route)]))])) CS 135 Winter 2018 12: Graphs 19 ;; (find-route/list los dest G) produces route from ;; an element of los to dest in G, if one exists ;; find-route/list: (listof Node) Node Graph (anyof (listof Node) false) (define (find-route/list los dest G) (cond [(empty? los) false] [else (local [(define route (find-route (first los) dest G))] (cond [(false? route) (find-route/list (rest los) dest G)] [else route]))])) CS 135 Winter 2018 12: Graphs 20 If we wish to trace find-route, trying to do a linear trace would be very long, both in terms of steps and the size of each step. Our traces also are listed as a linear sequence of steps, but but the computation in find-route is better visualized as a tree. We will use an alternate visualization of the potential computation (which could be shortened if a route is found). The next slide contains the trace tree. We have omitted the arguments dest and G which never change. CS 135 Winter 2018 12: Graphs 21

(find-route 'A) (find-route/list '(C D E)) (find-route 'C) (find-route/list empty) (find-route 'D) (find-route/list '(F J)) (find-route 'E) (find-route/list '(K)) (find-route 'F) (find-route/list '(K H)) (find-route 'J) (find-route/list '(H)) (find-route 'K) (find-route/list empty) (find-route 'K) (find-route/list empty) (find-route 'H) (find-route/list empty) (find-route 'H) (find-route/list empty) CS 135 Winter 2018 12: Graphs 22 Backtracking in implicit graphs The only places where real computation is done on the graph is in comparing the origin to the destination and in the neighbours function. Backtracking can be used without having the entire graph available. Example: nodes represent configurations of a board game (e.g. peg solitaire), edges represent legal moves. The graph is acyclic if no configuration can occur twice in a game. CS 135 Winter 2018 12: Graphs 23 In another example, nodes could represent partial solutions of some problem (e.g. a sudoku puzzle, or the puzzle of putting eight mutually nonattacking queens on a chessboard). Edges represent ways in which one additional element can be added to a solution. The graph is naturally acyclic, since a new element is added with every edge. CS 135 Winter 2018 12: Graphs 24

The find-route functions for implicit backtracking look very similar to those we have developed. The neighbours function must now generate the set of neighbours of a node based on some description of that node (e.g. the placement of pieces in a game). This allows backtracking in situations where it would be inefficient to generate and store the entire graph as data. CS 135 Winter 2018 12: Graphs 25 Backtracking forms the basis of many artificial intelligence programs, though they generally add heuristics to determine which neighbour to explore first, or which ones to skip because they appear unpromising. CS 135 Winter 2018 12: Graphs 26 Termination of find-route (no cycles) In a directed acyclic graph, any route with a given origin will recurse on its (finite number) of neighbours by way of find-route/list. The origin will never appear in this call or any subsequent calls to find-route: if it did, we would have a cycle in our DAG. Thus, the origin will never be explored in any later call, and thus the subproblem is smaller. Eventually, we will reach a subproblem of size 0 (when all reachable nodes are treated as the origin). Thus find-route always terminates for directed acyclic graphs. CS 135 Winter 2018 12: Graphs 27

Non-termination of find-route (cycles) It is possible that find-route may not terminate if there is a cycle in the graph. Consider the graph ((A (B)) (B (C)) (C (A)) (D ())). What if we try to find a route from A to D? A B D C CS 135 Winter 2018 12: Graphs 28 (find-route 'A) (find-route/list '(B)) (find-route 'B) (find-route/list '(C)) (find-route 'C) (find-route/list '(A)) (find-route 'A) (find-route/list '(B))... CS 135 Winter 2018 12: Graphs 29 Improving find-route We can use accumulative recursion to solve the problem of find-route possibly not terminating if there are cycles in the graph. To make backtracking work in the presence of cycles, we need a way of remembering what nodes have been visited (along a given path). Our accumulator will be a list of visited nodes. We must avoid visiting a node twice. The simplest way to do this is to add a check in find-route/list. CS 135 Winter 2018 12: Graphs 30

;; find-route/list: ;; (listof Node) Node Graph (listof Node) (anyof (listof Node) false) (define (find-route/list los dest G visited) (cond [(empty? los) false] [(member? (first los) visited) (find-route/list (rest los) dest G visited)] [else (local [(define route (find-route/acc (first los) dest G visited))] (cond [(false? route) (find-route/list (rest los) dest G visited)] [else route]))])) CS 135 Winter 2018 12: Graphs 31 The code for find-route/list does not add anything to the accumulator (though it uses the accumulator). Adding to the accumulator is done in find-route/acc which applies find-route/list to the list of neighbours of some origin node. That origin node must be added to the accumulator passed as an argument to find-route/list. CS 135 Winter 2018 12: Graphs 32 ;; find-route/acc: ;; Node Node Graph (listof Node) (anyof (listof Node) false) (define (find-route/acc orig dest G visited) (cond [(symbol=? orig dest) (list orig)] [else (local [(define nbrs (neighbours orig G)) (define route (find-route/list nbrs dest G (cons orig visited)))] (cond [(false? route) route] [else (cons orig route)]))])) CS 135 Winter 2018 12: Graphs 33

Revisiting our example A C D F K H B E J CS 135 Winter 2018 12: Graphs 34 (find-route/acc 'A empty) (find-route/list '(C D E) '(A)) (find-route/acc 'C '(A)) (find-route/list empty '(C A)) (find-route/acc 'D '(A)) (find-route/list '(F J) '(D A)) (find-route/acc 'E '(A)) (find-route/list '(K) '(E A)) (find-route/acc 'J '(D A)) (find-route/acc 'F '(D A)) (find-route/list '(H) '(J D A)) (find-route/list '(K H) '(F D A)) (find-route/acc 'K '(E A)) (find-route/list empty '(K E A)) (find-route/acc 'K '(F D A)) (find-route/list empty '(K F D A)) (find-route/acc 'H '(F D A)) (find-route/list empty '(H F D A)) (find-route/acc 'H '(J D A)) (find-route/list empty '(H J D A)) Note that the value of the accumulator in find-route/list is always the reverse of the path from A to the current origin (first argument). CS 135 Winter 2018 12: Graphs 35 This example has no cycles, so the trace only convinces us that we haven t broken the function on acyclic graphs, and shows us how the accumulator is working. But it also works on graphs with cycles. The accumulator ensures that the depth of recursion is no greater than the number of nodes in the graph, so find-route terminates. CS 135 Winter 2018 12: Graphs 36

A B D C (find-route/acc 'A empty) (find-route-list '(B) '(A)) (find-route/acc 'B '(A)) (find-route-list '(C) '(B A)) (find-route/acc 'C '(B A)) (find-route-list '(A) '(C B A)) no further recursive calls CS 135 Winter 2018 12: Graphs 37 In practice, we would write a wrapper function for users which would avoid their having to specify the initial value of the accumulator, as we have with the other examples in this module. Backtracking now works on graphs with cycles, but it can be inefficient, even if the graph has no cycles. If there is no path from the origin to the destination, then find-route will explore every path from the origin, and there could be an exponential number of them. CS 135 Winter 2018 12: Graphs 38 A B1 C D1 E... Y Z B2 D2 If there are d diamonds, then there are 3d + 2 nodes in the graph, but 2 d paths from A to Y, all of which will be explored. CS 135 Winter 2018 12: Graphs 39

Making find-route/acc efficient Applying find-route/acc to origin A results in find-route/list being applied to (B1 B2), and then find-route/acc being applied to origin B1. There is no route from B1 to Z, so this will produce false, but in the process, it will visit all the other nodes of the graph except B2 and Z. find-route/list will then apply find-route/acc to B2, which will visit all the same nodes. CS 135 Winter 2018 12: Graphs 40 When find-route/list is applied to the list of nodes los, it first applies find-route/acc to (first los) and then, if that fails, it applies itself to (rest los). To avoid revisiting nodes, the failed computation should pass the list of nodes it has seen on to the next computation. It will do this by returning the list of visited nodes instead of false as the sentinel value. However, we must be able to distinguish this list from a successfully found route (also a list of nodes). CS 135 Winter 2018 12: Graphs 41 Remembering what the list of nodes represents We will make a new type that will store both the list of nodes (either those nodes which have been visited, or the nodes along the successful path) as well as a boolean value indicating what the list of nodes represents. (define-struct route (valid-path? nodes)) ;; a Route is a (make-route Bool (listof Node)) CS 135 Winter 2018 12: Graphs 42

;; find-route/list:... (anyof (listof Node) Route) (define (find-route/list los dest G visited) (cond [(empty? los) (make-route false visited)] [(member? (first los) visited) (find-route/list (rest los) dest G visited)] [else (local [(define route (find-route/acc (first los) dest G visited))] (cond [((not (route-valid-path? route)) (find-route/list (rest los) dest G (route-nodes route))] [else route]))])) CS 135 Winter 2018 12: Graphs 43 ;; find-route/acc: Node Node Graph (listof Node) ;; (anyof (listof Node) Route) (define (find-route/acc orig dest G visited) (cond [(symbol=? orig dest) (make-route true (list orig))] [else (local [(define nbrs (neighbours orig G)) (define route (find-route/list nbrs dest G (cons orig visited)))] (cond [((not (route-valid-path? route)) route] [else (make-route true (cons orig route))]))])) CS 135 Winter 2018 12: Graphs 44 ;; find-route: Node Node Graph (anyof (listof Node) false) (define (find-route orig dest G) (local [(define route (find-route/acc orig dest G empty))] (cond [(route-valid-path? route) (route-nodes route)] [else false]))) CS 135 Winter 2018 12: Graphs 45

With these changes, find-route runs much faster on the diamond graph. How efficient is our final version of find-route? CS 135 Winter 2018 12: Graphs 46 Each node is added to the visited accumulator at most once, and once it has been added, it is not visited again. Thus find-route/acc is applied at most n times, where n is the number of nodes in the graph. One application of find-route/acc (not counting recursions) takes time roughly proportional to n (mostly in neighbours). The total work done by find-route/acc is roughly proportional to n 2. CS 135 Winter 2018 12: Graphs 47 One application of find-route/list takes time roughly proportional to n (mostly in member?). find-route/list is applied at most once for every node in a neighbour list, that is, at most m times, where m is the number of edges in the graph. The total cost is roughly proportional to n(n + m). CS 135 Winter 2018 12: Graphs 48

We will see how to make find-route even more efficient in later courses, and see how to formalize our analyses. Knowledge of efficient algorithms, and the data structures that they utilize, is an essential part of being able to deal with large amounts of real-world data. These topics are studied in CS 240 and CS 341 (for majors) and CS 234 (for non-majors). CS 135 Winter 2018 12: Graphs 49 Goals of this module You should understand directed graphs and their representation in Racket. You should be able to write functions which consume graphs and compute desired values. You should understand and be able to implement backtracking on explicit and implicit graphs. You should understand the performance differences in the various versions of find-route and be able to write more efficient functions using appropriate recursive techniques. CS 135 Winter 2018 12: Graphs 50