graph_search.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. class GraphSearch:
  4. """Graph search emulation in python, from source
  5. http://www.python.org/doc/essays/graphs/"""
  6. def __init__(self, graph):
  7. self.graph = graph
  8. def find_path(self, start, end, path=None):
  9. self.start = start
  10. self.end = end
  11. self.path = path if path else []
  12. self.path += [self.start]
  13. if self.start == self.end:
  14. return self.path
  15. if self.start not in self.graph:
  16. return None
  17. for node in self.graph[self.start]:
  18. if node not in self.path:
  19. newpath = self.find_path(node, self.end, self.path)
  20. if newpath:
  21. return newpath
  22. return None
  23. def find_all_path(self, start, end, path=None):
  24. self.start = start
  25. self.end = end
  26. _path = path if path else []
  27. _path += [self.start]
  28. if self.start == self.end:
  29. return [_path]
  30. if self.start not in self.graph:
  31. return []
  32. paths = []
  33. for node in self.graph[self.start]:
  34. if node not in _path:
  35. newpaths = self.find_all_path(node, self.end, _path[:])
  36. for newpath in newpaths:
  37. paths.append(newpath)
  38. return paths
  39. def find_shortest_path(self, start, end, path=None):
  40. self.start = start
  41. self.end = end
  42. _path = path if path else []
  43. _path += [self.start]
  44. if self.start == self.end:
  45. return _path
  46. if self.start not in self.graph:
  47. return None
  48. shortest = None
  49. for node in self.graph[self.start]:
  50. if node not in _path:
  51. newpath = self.find_shortest_path(node, self.end, _path[:])
  52. if newpath:
  53. if not shortest or len(newpath) < len(shortest):
  54. shortest = newpath
  55. return shortest
  56. # example of graph usage
  57. graph = {'A': ['B', 'C'],
  58. 'B': ['C', 'D'],
  59. 'C': ['D'],
  60. 'D': ['C'],
  61. 'E': ['F'],
  62. 'F': ['C']
  63. }
  64. # initialization of new graph search object
  65. graph1 = GraphSearch(graph)
  66. print(graph1.find_path('A', 'D'))
  67. print(graph1.find_all_path('A', 'D'))
  68. print(graph1.find_shortest_path('A', 'D'))
  69. ### OUTPUT ###
  70. # ['A', 'B', 'C', 'D']
  71. # [['A', 'B', 'C', 'D'], ['A', 'B', 'D'], ['A', 'C', 'D']]
  72. # ['A', 'B', 'D']