Floyd弗洛伊德演算法最優值準確性證明

2022-10-10 02:24:08 字數 1519 閱讀 2639

弗洛伊德演算法

若起始點i,終點j 中間節點k,m

len(i,j)=min

若中間節點出現路徑依賴,以k為前置節點更新資料時如何保證已更新節點資料的有效性,亂序更新是否會導致部分節點最優值更新遺漏??

以下可能出現依賴節點更新亂序的場景(依賴節點正序更新(每次子路徑都是最優值,最終一定是最優值,)沒有問題,不做討論)

場景一:

依賴節點正序更新,每次子路徑都是最優值(即:中間節點路徑最優值後續都不會再更新),最長路徑一定是最優值,

(單行更新時:區域性最優到整體最優的適用場景,所有子節點區域性最優最終保證整體最優),此場景沒問題;此處不做討論,

主要討論下面兩種場景:區域性不最優如何保證最終最優

場景二:

若存在路徑:i->...->m->...->k->...->j 執行步驟1:當前路徑 通過k為中間節點將j變更為新值, 其m值為舊值 (m下標索引》j下標索引)

: i->k->m 中間的某一點路徑 執行步驟2 :通過k為中間節點將m值更為新值 (通過k更新k權值為0構無效環,直接忽略)會不會導致j先於m執行時j的最短權值出錯???

=>若k可以修改m值,則m必定不是j中某一段的最短路徑,因為步驟1中,

因為路徑會變成為 i->...->k->m->k->...->j 中間會形成乙個有效環(相當於繞了一圈又回到k) 不會比(i->...->k->...->j)(不繞圈)小 故步驟1的更新依然有效

故;此場景能保證k之前更新過節點的資料準確性

場景三:

若存在路徑:i->...->m->j 當前路徑(不包含k), 執行步驟1 通過k為中間點無法更新j

: i->...->k->m 中間的某一點路徑 執行步驟2:通過k為中間點將m值更新為新有效值 此時:會不會導致j當前輪最優值出錯?若k可以修改m值,

此時變成 i->k->m->j 此時如何保證j變成準確值 ?

此時變成兩種情況

1.k優先m加入中間節點:k到j節點不可達;此時k更新 ...->k->...->m;再次執行m為中間節點時將會保證j準確值 此場景沒問題

2.m優先k加入中間節點:當執行m時,m更新j,即:i->...->m->j (k目前還不在中間節點中)

,若等到k為中間節點時,此時狀態: (m先於k) i->...->k->m->j;

m變了,會不會影響j當前儲存的最優值?會不會更新j(原值已失效)?

=> 若存在此情況 說明k是m的前置節點,m是j的前置節點,故說明 k通過m可以到達j; 又因為m先於k加入中間節點,故m節點作為中間節點便是k->j當前最優路徑(因為新加入的k不可能修改k->j的路徑,因為k會形成環路),

則: i->...->k->m->j 路徑中,i->....->k 為當前k輪最優路徑 k->...->m->j 為上一輪的最優路徑

故此時 更新i->...->k->...->j 一定會通過k更新為截至當前輪的最優值,且m值的變化不會影響j節點

綜上:通過最外層k值迴圈能保證截至k輪次所有節點值為最優值

弗洛伊德(Floyd)演算法

弗洛伊德 floyd 演算法過程 用d v w 記錄每一對頂點的最短距離。依次掃瞄每乙個點,並以其為基點再遍歷所有每一對頂點d的值,看看是否可用過該基點讓這對頂點間的距離更小。演算法理解 最短距離有三種情況 兩點的直達距離最短。如下圖 兩點間只通過乙個中間點而距離最短。圖 兩點間用通過兩各以上的頂點...

弗洛伊德 Floyd 演算法

和dijkstra演算法一樣,弗洛伊德 floyd 演算法也是一種用於尋找給定的加權圖中頂點間最短路徑的演算法。該演算法名稱以創始人之一 1978年圖靈獎獲得者 史丹福大學電腦科學系教授羅伯特 弗洛伊德命名 弗洛伊德演算法 floyd 計算圖中各個頂點之間的最短路徑 迪傑斯特拉演算法用於計算圖中某乙...

弗洛伊德 Floyd 演算法

佛羅依德 floyd 演算法的基本思想 設圖g用鄰接矩陣法表示,求圖g中任意一對頂點vi與vj間的的最短路徑。1 將vi到vj的最短的路徑長度初始化為g.arcs i j adj,進行如下n次比較和修正 0 在vi與vj間加入頂點v0,比較 vi,v0,vj 和 vi,vj 的路徑的長度,取其中較短...