圖論最短路徑問題與matlab實現

卢宇博發表於2024-07-01

上一次我們討論瞭如何進行圖論視覺化,這一次我們透過matlab來找出圖論中距離最小路徑

目錄
  • 一、迪傑斯特拉演算法(Dijkstra)
  • 二、shortestpath函式用法
    • 1.基本語法
    • 2.引數設計
    • 3.應用例項
      • (1)輸入圖論資訊
      • (2)輸入引數進行求解
      • (3)最短路徑視覺化
  • 三、distances函式————求出任意兩點的最短路徑矩陣
  • 四、nearest函式————找出給定範圍內的所有點

一、迪傑斯特拉演算法(Dijkstra)

迪傑斯特拉演算法是由荷蘭電腦科學家在1956年發現的演算法,此演算法使用類似廣度優先搜尋的方法解決了帶權圖的單源最短路徑問題。它是一個貪心演算法。
核心思想:羅列出一個表,其行標題代表著(1)是否經歷過(2)距離初始點的距離(3)父節點;列標題則為每個節點的標號
透過不斷更新距離和父節點,用貪心演算法的思想找到路徑最短點
除了迪傑斯特拉演算法外,比較著名的找最短路徑的方法還有Floyd(弗洛伊德)演算法,Bellman‐Ford(貝爾曼‐福特)演算法。。
其中,貝爾曼‐福特演算法不再將節點區分為是否已訪問的狀態,因為貝爾曼‐福特模型是利用迴圈來進行更新權重的,且每迴圈一次,貝爾曼福特演算法都會更新所有的節點的資訊。因此,後者解決了迪傑斯特拉演算法無法處理但不能處理負權重的問題。
但是他們都解決不了負權迴路的圖

二、shortestpath函式用法

matlab中提供了上面三種演算法的函式包,現在我們來介紹一下這個函式的語法

1.基本語法

2.引數設計

3.應用例項

(1)輸入圖論資訊

資訊的輸入在上一講已經詳細敘述過,基本思想是將資訊用graph函式儲存的一個G中。這時G作為一個資料結構,可以用Plot畫圖,shortestpath尋優

(2)輸入引數進行求解

此處,我們需要尋找節點9到節點4的最短路徑
[P,d] = shortestpath(G, 9, 4)
得到的P是一個向量,表示節點9到節點4所經歷的所有節點
得到的d是一個數,表示從9到4的所經歷的距離

(3)最短路徑視覺化


首先將圖賦給一個變數,此時的myplot即為一個包含著圖論資訊的一個資料結構,之後可以透過對這個資料結構進行處理
之後用Highlight函式對這個變數進行高亮處理(給邊加上r紅色),P為得到的路徑點。而後面的引數則表示對圖的邊進行紅色高亮處理。效果如圖所示

三、distances函式————求出任意兩點的最短路徑矩陣

對於已經儲存的圖論資訊的變數G來說,matlab中的distance函式可以輸出其任意兩點的最短路徑矩陣
用法:D = distances(G)
效果:

另外,我們可以直接透過D(i,j),找到節點i到節點j的距離,他返回值不像矩陣一樣返回的是第i行第j列的元素

四、nearest函式————找出給定範圍內的所有點

nearest函式可以返回圖形 G 中與節點 s 的距離在 d 之內的所有節點
[nodeIDs,dist] = nearest(G, 2, 10)
nodeIDs返回的是與節點2距離小於等於10的所有節點,是一個節點向量
而dist是一個向量,對應著節點2與每一個nodeIDs節點的距離

相關文章