路径规划——广度优先搜索与深度优先搜索
https://www.hello-algo.com/chapter_graph/graph_traversal/
1.广度优先搜索 Breath-First-Search
在图论中也称为广度优先遍历,类似于树的层序遍历。
算法原理
从起始节点出发,首先访问它的邻近节点,然后依次访问这些邻近节点的邻近节点,直到所有节点都被访问到。广度优先搜索是从一个起始节点开始逐层地访问所有节点的。
广度优先搜索是一种图遍历算法,每向前走一步可能访问一批顶点,不像深度优先搜索那样有回退的情况,因此它不是一个递归的算法。为了实现逐层的访问,算法必须借助一个辅助队列,以记忆正在访问的顶点的下一层顶点。
现有如下节点图Graph,要求从A点开始搜索,搜索全部节点,将节点搜索序列作为结果输出。
将上图整理得下图
那么整个广度优先搜索的过程如下图:
算法实现
from collections import deque
def bfs(graph, start):
# 初始化队列,并将起始节点加入队列
queue = deque([start])
# 初始化访问顺序列表
visited = [start]
while queue:
# 取出队列中的当前节点
current = queue.popleft()
# 遍历当前节点的所有邻居节点
for neighbor in graph[current]:
if neighbor not in visited: # 如果邻居节点尚未被访问
# 将邻居节点加入队列
queue.append(neighbor)
# 记录访问顺序
visited.append(neighbor)
return visited
# 示例图的定义
graph = {
'A': ['B', 'C'],
'B': ['A', 'D', 'E'],
'C': ['A', 'F'],
'D': ['B'],
'E': ['B', 'F'],
'F': ['C', 'E']
}
# 使用BFS算法
start_node = 'A'
visited = bfs(graph, start_node)
print(f"Visit order: {
visited}")
寻找在上图中A->E的最短路径:
from collections import deque
def bfs(graph, start, goal):
# 初始化队列,并将起始节点加入队列
queue = deque([start]