| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- """
- Breadth-first Searching_2D (BFS)
- @author: huiming zhou
- """
- import os
- import sys
- from collections import deque
- sys.path.append(os.path.dirname(os.path.abspath(__file__)) +
- "/../../Search_based_Planning/")
- from Search_2D import plotting, env
- from Search_2D.Astar import AStar
- import math
- import heapq
- class BFS(AStar):
- """BFS add the new visited node in the end of the openset
- """
- def searching(self):
- """
- Breadth-first Searching.
- :return: path, visited order
- """
- self.PARENT[self.s_start] = self.s_start
- self.g[self.s_start] = 0
- self.g[self.s_goal] = math.inf
- heapq.heappush(self.OPEN,
- (0, self.s_start))
- while self.OPEN:
- _, s = heapq.heappop(self.OPEN)
- self.CLOSED.append(s)
- if s == self.s_goal:
- break
- for s_n in self.get_neighbor(s):
- new_cost = self.g[s] + self.cost(s, s_n)
- if s_n not in self.g:
- self.g[s_n] = math.inf
- if new_cost < self.g[s_n]: # conditions for updating Cost
- self.g[s_n] = new_cost
- self.PARENT[s_n] = s
- # bfs, add new node to the end of the openset
- prior = self.OPEN[-1][0]+1 if len(self.OPEN)>0 else 0
- heapq.heappush(self.OPEN, (prior, s_n))
- return self.extract_path(self.PARENT), self.CLOSED
- def main():
- s_start = (5, 5)
- s_goal = (45, 25)
- bfs = BFS(s_start, s_goal, 'None')
- plot = plotting.Plotting(s_start, s_goal)
- path, visited = bfs.searching()
- plot.animation(path, visited, "Breadth-first Searching (BFS)")
- if __name__ == '__main__':
- main()
|