Dijkstra.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. """
  2. Dijkstra 2D
  3. @author: huiming zhou
  4. """
  5. import os
  6. import sys
  7. import math
  8. import heapq
  9. sys.path.append(os.path.dirname(os.path.abspath(__file__)) +
  10. "/../../Search_based_Planning/")
  11. from Search_2D import plotting, env
  12. from Search_2D.Astar import AStar
  13. class Dijkstra(AStar):
  14. """Dijkstra set the cost as the priority
  15. """
  16. def searching(self):
  17. """
  18. Breadth-first Searching.
  19. :return: path, visited order
  20. """
  21. self.PARENT[self.s_start] = self.s_start
  22. self.g[self.s_start] = 0
  23. self.g[self.s_goal] = math.inf
  24. heapq.heappush(self.OPEN,
  25. (0, self.s_start))
  26. while self.OPEN:
  27. _, s = heapq.heappop(self.OPEN)
  28. self.CLOSED.append(s)
  29. if s == self.s_goal:
  30. break
  31. for s_n in self.get_neighbor(s):
  32. new_cost = self.g[s] + self.cost(s, s_n)
  33. if s_n not in self.g:
  34. self.g[s_n] = math.inf
  35. if new_cost < self.g[s_n]: # conditions for updating Cost
  36. self.g[s_n] = new_cost
  37. self.PARENT[s_n] = s
  38. # best first set the heuristics as the priority
  39. heapq.heappush(self.OPEN, (new_cost, s_n))
  40. return self.extract_path(self.PARENT), self.CLOSED
  41. def main():
  42. s_start = (5, 5)
  43. s_goal = (45, 25)
  44. dijkstra = Dijkstra(s_start, s_goal, 'None')
  45. plot = plotting.Plotting(s_start, s_goal)
  46. path, visited = dijkstra.searching()
  47. plot.animation(path, visited, "Dijkstra's") # animation generate
  48. if __name__ == '__main__':
  49. main()