求在乙個加權有向無環圖中,從起點到終點的最短路徑
圖中有四個節點,分別為[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作為乙個等待檢查的方...