Floyd弗洛伊德演算法最優值準確性證明
阿新 • • 發佈:2022-04-19
弗洛伊德演算法 若起始點i,終點j 中間節點k,m len(i,j)=min{len(i,j);len(i,k)+len(k,j)} 若中間節點出現路徑依賴,以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輪次所有節點值為最優值