From 6f2757571c26401623e7e61a580a61b3049f5ddb Mon Sep 17 00:00:00 2001 From: Sotaya Date: Wed, 30 Jan 2013 06:33:56 -0800 Subject: [PATCH] Create graph_search.py Graph Search pattern in python --- graph_search.py | 75 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 graph_search.py diff --git a/graph_search.py b/graph_search.py new file mode 100644 index 00000000..18cb2a8e --- /dev/null +++ b/graph_search.py @@ -0,0 +1,75 @@ +class GraphSearch: + """Graph search emulation in python, from source http://www.python.org/doc/essays/graphs/""" + + def __init__(self, graph): + self.graph = graph + + def find_path(self, start, end, path=[]): + self.start = start + self.end = end + self.path = path + + self.path+=[self.start] + if self.start == self.end: + return self.path + if not self.graph.has_key(self.start): + return None + for node in self.graph[self.start]: + if node not in self.path: + newpath = self.find_path(node, self.end, self.path) + if newpath: + return newpath + return None + + def find_all_path(self, start, end, path=[]): + self.start = start + self.end = end + self.path = path + self.path+=[self.start] + if self.start == self.end: + return [self.path] + if not self.graph.has_key(self.start): + return [] + paths=[] + for node in self.graph[self.start]: + if node not in self.path: + newpaths = self.find_all_path(node, self.end, self.path) + for newpath in newpaths: + paths.append(newpath) + return paths + + def find_shortest_path(self, start, end, path=[]): + self.start = start + self.end = end + self.path = path + + self.path+=[self.start] + if self.start == self.end: + return self.path + if not self.graph.has_key(self.start): + return None + shortest = None + for node in self.graph[self.start]: + if node not in self.path: + newpath = self.find_shortest_path(node, self.end, self.path) + if newpath: + if not shortest or len(newpath) < len(shortest): + shortest = newpath + return shortest + +#example of graph usage +graph = {'A':['B', 'C'], + 'B': ['C', 'D'], + 'C': ['D'], + 'D': ['C'], + 'E': ['F'], + 'F': ['C'] + } + +#inistialization of new graph search object +graph1 = GraphSearch(graph) + + +print graph1.find_path('A', 'D') +print graph1.find_all_path('A', 'D') +print graph1.find_shortest_path('A', 'D')