from collections import deque
from collections import namedtuple
def bfs(start_node, end_node, graph): # 開始節點 目標節點 圖字典
node = namedtuple('node', 'name, from_node') # 使用namedtuple定義節點,用於儲存前置節點
search_queue = deque() # 使用雙端佇列,這裡當作佇列使用,根據先進先出獲取下乙個遍歷的節點
name_search = deque() # 儲存佇列中已有的節點名稱
visited = {} # 儲存已經訪問過的節點
path = # 使用者回溯路徑
path_len = 0 # 路徑長度
print('開始搜尋...')
while search_queue: # 只要搜尋佇列中有資料就一直遍歷下去
print('待遍歷節點: ', name_search)
current_node = search_queue.popleft() # 從佇列前邊獲取節點,即先進先出,這是bfs的核心
name_search.popleft() # 將名稱也相應彈出
if current_node.name not in visited: # 當前節點是否被訪問過
print('當前節點: ', current_node.name, end=' | ')
if current_node.name == end_node: # 退出條件,找到了目標節點,接下來執行路徑回溯和長度計算
pre_node = current_node # 路徑回溯的關鍵在於每個節點中儲存的前置節點
while true: # 開啟迴圈直到找到開始節點
if pre_node.name == start_node: # 退出條件:前置節點為開始節點
break
else:
pre_node = visited[pre_node.from_node] # 取出前置節點的前置節點,依次類推
path_len = len(path) - 1 # 獲得完整路徑後,長度即為節點個數-1
break
else:
for node_name in graph[current_node.name]: # 遍歷相鄰節點,判斷相鄰節點是否已經在搜尋佇列
if node_name not in name_search: # 如果相鄰節點不在搜尋佇列則進行新增
print('搜尋完畢,最短路徑為:', path[::-1], "長度為:", path_len) # 列印搜尋結果
if __name__ == "__main__":
graph = dict() # 使用字典表示有向圖
graph[1] = [3, 2]
graph[2] = [5]
graph[3] = [4, 7]
graph[4] = [6]
graph[5] = [6]
graph[6] = [8]
graph[7] = [8]
graph[8] =
bfs(1, 8, graph) # 執行搜尋
python實現廣度有限搜尋
from collections import deque from collections import namedtuple def bfs start node,end node,graph node namedtuple node name,from node search stack de...
廣度優先搜尋(BFS) Python實現
演算法的工作原理 建立乙個佇列,用於儲存要檢查的人 從佇列中彈出乙個人 檢查這個人是否被檢查過 檢查這個人是否為芒果經銷商 是 大功告成 否 將這個人的所有鄰居都加入到佇列中 回到第二步 如果隊列為空,就說明沒有找到芒果經銷商 encoding utf 8 from collections impo...
python實現廣度優先搜尋,查詢芒果經銷商
from collections import deque graph 建立乙個字典,儲存人際關係圖 graph you alice bob claire graph bob anuj peggy graph alice peggy graph claire thom jonny graph anu...