python實現廣度有限搜尋

2021-10-04 07:15:23 字數 1752 閱讀 2276

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...