最優路徑之 Dijkstra

2021-10-01 19:52:32 字數 2896 閱讀 4765

求在乙個加權有向無環圖中,從起點到終點的最短路徑

圖中有四個節點,分別為[start, a, b, end], 各個節點間的路徑長度如下

start-->a 6 start-->b 2

a-->end 1

b-->a 3 b-->end 5

終點--> 無

答案

最短路徑為: start-->b-->a-->end 6

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# graph 儲存各個節點間的距離

graph =

graph[

"start"]=

graph[

"start"][

"a"]=6

graph[

"start"][

"b"]=2

graph[

"a"]

=graph[

"a"]

["end"]=

1graph[

"b"]

=graph[

"b"]

["a"]=

3graph[

"b"]

["end"]=

5graph[

"end"]=

print

(graph.keys())

# costs 儲存每個節點到終點的距離

infinity =

float

("inf"

)costs =

costs[

"a"]=6

costs[

"b"]=2

costs[

"end"

]= infinity

# parents 儲存父節點

parents =

parents[

"a"]

="start"

parents[

"b"]

="start"

parents[

"end"]=

none

# 儲存處理過的節點

processed =

# 尋找未處理過的最低開銷節點

deffind_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

# 依次處理每個節點, 設定到其相鄰節點的最小開銷

defhandler_all_node

(graph, costs, parents, processed)

: node = find_lowest_cost_node(costs)

while node is

notnone

: 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)

# 列印結果

defprint_result

(costs, parents)

: path =

node =

"end"

while node !=

"start"

: node = parents[node]

"start"

) path.reverse(

) result =

""for node in path:

result+=node

if node !=

"end"

: result+=

"-->"

print

(result +

" "+

str(costs[

"end"])

)# 演算法處理

handler_all_node(graph, costs, parents, processed)

print_result(costs, parents)

狄克斯特拉演算法主要包含4個步驟

1. 找出最便宜的節點,即可在最短時間內前往的節點;

2. 對於該節點的鄰居,檢查是否有前往它的鄰居們的更短路徑,如果有,就更新其開銷;

3. 重複步驟2,直到圖中的每個節點都這麼處理過了;

4. 計算最終路徑;

Dijkstra最優路徑的演算法

dijkstra最優路徑的演算法 最短路徑演算法 在日常生活中,我們如果需要常常往返a地區和b地區之間,我們最希望知道的可能是從a地區到b地區間的眾多路徑中,那一條路徑的路途最短。最短路徑問題是圖論研究中的乙個經典演算法問題,旨在尋找圖 由結點和路徑組成的 中兩結點之間的最短路徑。演算法具體的形式包...

Dijkstra演算法 尋找最優路徑

一般情況下,dijkstra演算法是解決單源最短路徑問題的,也就是在已知終點時,求出圖中的每個點到終點的最短距離,但是一般只記錄距離值,不會記錄具體的路徑,即怎麼走能從起點通過最短路徑來到達終點 思路就是引入乙個path表,其中path x 表示,如果從x節點要到達終點的最短路徑,在x節點下一步應該...

A (最優路徑)

尋路 尋找最短路徑並避開障礙物 首先將地圖虛擬化,將地圖劃分為乙個乙個的小方塊,這樣可以用二維陣列來表示地圖。如下所示,綠色塊 a 是起點,紅色塊 b 是終點,中間藍色塊是障礙物,白色塊是空地。先羅列出所有的步驟,等會按照例子一步一步分析 1 尋路步驟 步驟1.從起點a開始,把a作為乙個等待檢查的方...