一、双向广度优先搜索算法介绍
双向广度优先搜索算法是一种用于解决图或树中两个节点之间最短路径问题的算法。它通过同时从起点和终点开始搜索,每次扩展当前层的节点,直到两个搜索方向相遇或找到了最短路径。
算法步骤如下:
1. 初始化两个队列,分别存放起点和终点。
2. 初始化两个集合,分别用于记录起点和终点已经访问过的节点。
3. 从起点和终点分别开始进行广度优先搜索,每次扩展当前层的节点。
4. 在每一轮搜索中,检查当前层的节点是否已经在另一方向的集合中出现过,如果是,则找到了最短路径。
5. 如果当前层的节点没有在另一方向的集合中出现过,则将其加入到对应的队列和集合中,并继续下一轮搜索。
6. 重复步骤3-5,直到两个搜索方向相遇或者队列为空。
双向广度优先搜索算法相比于传统的广度优先搜索算法,可以减少搜索的空间和时间复杂度,因为它同时从起点和终点进行搜索,缩小了搜索范围。
参考文献:
[1]聂宏展,林启春,林小青.基于双向广度优先法的输电断面搜索方法[J].东北电力大学学报, 2017, 37(3):6.DOI:10.ssss/j.issn.1005-2992.2017.3.002.
二、部分代码
import math
import matplotlib.pyplot as plt
class BidirectionalBreadthFirstSearchPlanner:
def __init__(self, ox, oy, resolution, rr):
"""
Initialize grid map for bfs planning
ox: x position list of Obstacles [m]
oy: y position list of Obstacles [m]
resolution: grid resolution [m]
rr: robot radius[m]
"""
self.min_x, self.min_y = None, None
self.max_x, self.max_y = None, None
self.x_width, self.y_width, self.obstacle_map = None, None, None
self.resolution = resolution
self.rr = rr
self.calc_obstacle_map(ox, oy)
self.motion = self.get_motion_model()
class Node:
def __init__(self, x, y, cost, parent_index, parent):
self.x = x # index of grid
self.y = y # index of grid
self.cost = cost
self.parent_index = parent_index
self.parent = parent
def __str__(self):
return str(self.x) + "," + str(self.y) + "," + str(
self.cost) + "," + str(self.parent_index)
三、部分结果
四、完整Python代码
见下方名片