對於狄克斯特拉演算法理解和實現

2021-08-16 21:58:16 字數 1857 閱讀 8017

狄克斯特拉演算法是用於在加權圖中查詢到最短路徑的演算法,所以你就需要找到從出發點到終止點的路徑,比較出最短的一條,這是我們不妨利用逆向思維的方法,要想找到最短的終止節點,那麼你就必須要是在它的上乙個最短的節點(稱為父節點),用相同的思想找到每個節點的父節點直到出發節點,所以我們要明確一下幾點

1.怎麼用**講圖實現出來

2.怎麼記錄每個節點的開銷(也就是節點到開始點的距離)

3.怎麼表示父節點是什麼

以下我將從這三方面出發,利用**實現狄克斯特拉演算法

# 用雜湊表實現圖的關係

graph = {}

graph['start'] = {}

graph['start']['a']=6

graph['start']['b']=2

graph['a']={}

graph['a']['fin']=1

graph['b']={}

graph['b']['a']=3

graph['b']['fin']=5

graph['fin'] = {}

# 開銷

costs={}

costs['a']=6

costs['b']=2

costs['fin']=float('inf')

# 父節點

parents={}

parents['a']='start'

parents['b']='start'

parents['fin']=none

# 處理訪問過的節點

processed=

# 在未處理的點中找到開銷最小的值

def find_lowest_cost_node(costs):

lowest_cost=float('inf')

lowest_cost_node = none

for node in costs:

cost = costs[node]

if cost < lowest_cost and node not in processed:

lowest_cost = cost

lowest_cost_node = node

return lowest_cost_node

# 找到最短路徑

def find_shortset_path():

node='fin'

shortest_path=['end']

while node != 'start':

node = parents[node]

shortest_path.reverse()

return shortest_path

if __name__ == '__main__':

node = find_lowest_cost_node(costs)

while node is not none:

cost = costs[node]

neighbors = graph[node]

for n in neighbors.keys():

new_cost = cost + neighbors[n]

if costs[n] > new_cost:

costs[n] = new_cost

parents[n] = node

node = find_lowest_cost_node(costs)

shortset_path = find_shortset_path()

print(shortset_path)

狄克斯特拉演算法

廣度優先演算法,它找出的是段數最少的路徑 無向圖 如果我們要找出最快的路徑 加權圖 可以使用狄克斯特拉演算法。狄克斯特拉演算法包含四個步驟 1.找出 最便宜 的節點,即可在最短時間內到達的節點 2.更新該節點的鄰居的開銷 3.重複這個過程,直到對圖中的每個節點都這樣做了 4.計算最終路徑 以下圖為例...

狄克斯特拉演算法

是由荷蘭計算機科學家狄克斯特拉於1959 年提出的。是從乙個頂點到其餘各頂點的最短路徑演算法,解決的是有向無環圖中最短路徑問題,且不能有負權邊。狄克斯特拉演算法主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。示例 找出從起點到終點的最短路徑 當前起點到各點的花費,選擇最小且沒有被檢...

python實現狄克斯特拉演算法

一 簡介 是從乙個頂點到其餘各頂點的最短路徑演算法,解決的是有向圖中最短路徑問題。迪傑斯特拉演算法主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止 二 步驟 1 找出 最便宜 的節點,即可在最短時間內到達的節點。2 更新該節點的鄰居的開銷,其含義將稍後介紹。3 重複這個過程,直到對圖...