1. 程式人生 > >最短路徑迪傑斯特拉演算法Python實現

最短路徑迪傑斯特拉演算法Python實現

回顧下最短路徑的地傑斯特拉演算法

迪傑斯特拉演算法是求從某一個起點到其餘所有結點的最短路徑,是一對多的對映關係,是一種貪婪演算法

示例:這裡寫圖片描述

演算法實現流程思路: 迪傑斯特拉演算法每次只找離起點最近的一個結點,並將之併入已經訪問過結點的集合(以防重複訪問,陷入死迴圈),然後將剛找到的最短路徑的結點作為中間結點來更新相鄰結點的路徑長度,這樣迴圈找到圖中一個個結點的最短路徑。

# dists定義了圖,記錄著從從起點出發到其他頂點的距離
dist={1:{2:1,3:12},
      2:{3:9,4:3},
      3:{5:5},
      4:{3:4,5:13,6:15},
      5:{6:4},
      6:{6:0}}
cost={1:0,2:1,3:12,4:999,5:999,6:999}  # 由起點(結點1)到其餘頂點的最短距離,999代表無法到達
parents={1:None,2:1,3:2,4:2,5:3,6:5}   # parent代表到達這個結點的最短路徑的前一個結點
visited=[1]   # 起始結點預設已經訪問過
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
# 找到還沒有訪問的結點中路徑最短的一個結點
def findShorestNode(cost):
    minDist=999
    node=None
    for i in dist.keys():
        if (cost[i]<minDist)&(i not in visited):
            minDist=cost[i]
            node=i
    return node
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
# 更新最短路徑
node=findShorestNode(cost)
while node:
    for i in dist[node]:  # 所有node結點的鄰居結點
        newcost=cost[node]+dist[node][i]
        if newcost<cost[i]:
            parents[i]=node
            cost[i]=newcost
    visited.append(node)
    node=findShorestNode(cost)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
# 打印出從1到6的最短路徑
parent=parents[6]
while parent:
    print(parent)
    parent=parents[parent]
  • 1
  • 2
  • 3
  • 4
  • 5

結果:這裡寫圖片描述

--------------------- 本文來自 漸行漸遠silence 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/silence2015/article/details/74783771?utm_source=copy