1. 程式人生 > >簡單易懂的距離向量演算法DV闡述(附虛擬碼)

簡單易懂的距離向量演算法DV闡述(附虛擬碼)

演算法說明

距離向量演算法是一種迭代的、非同步的、分散式的、能夠自我終止的演算法。

在計算機網路中,該演算法主要用在路由選擇上。本文的討論範圍就限於計網中的路由選擇演算法。以下展開演算法解釋。

  • 非同步:該演算法不要求所有結點之間相互保持一致地進行操作和計算。
  • 分散式:每個結點都只維護一張區域性的路由表,=每個路由結點需要從一個或者多個直接相鄰的鄰接結點接收某些鏈路資訊,執行計算,然後將計算結果分發給鄰接結點
  • 迭代:結點之間交換資訊的過程需要持續到鄰居之間無更多資訊要交換為止。
  • 自我終止:從開始交換到終止交換稱為收斂。沒有收到計算終止的訊號就可以自行終止。

假設網路拓撲圖中是一個無向有權的連通圖。兩個路由結點之間的最低費用路徑的費用之間存在一種重要的關係。該關係可以由以下Bellman-Ford方程表出:

d_x(y) = min_v [c(x, v) + d_v(y)]

其中d_x(y)代表著從開始結點x到目的y的最低費用路徑的費用。 c(x,v) 表示從結點x到鄰接結點v的費用,d_v(y)表示從鄰接結點v到目的結點y的最小費用路徑的費用。 min_v 表示在所有鄰接結點v的方程計算中取一個最小值。

也就是說:我到目的地的最小距離,等於 我到鄰居距離與鄰居到目的地最小距離之和(存在一個或多個鄰居) 的最小值。

從該方法就可以看出該演算法是迭代計算的,需要依賴於結點之間的訊息交換,具有一定的收斂時間。

如下圖,如果已知各鏈路距離,A到鄰居結點E, D, C的距離為de,dd,dc,  要計算A到B的最小距離,先求出鄰居結點E、D、C到B的最小距離Me,Md, Mc。那麼A到B的最小距離可以通過列舉  de + Me, dd + Md,dc + Mc,其中的最小值就是A到B的最小距離。

進一步說明:如果每個結點x以D_x(y)開始,對網路N中所有結點,估計從它自己到結點y的最低路徑費用。

設計一個結點x的距離向量,為:D_x= [D_x(y): y \in N ]。該向量是從x到N中所有其他結點y的費用估計的向量。使用DV演算法,對每個結點維護以下路由選擇資訊:

  • 1. 對每個鄰居結點v,從x到相鄰鄰居v的費用為c(x,v)。
  • 2. 結點x的距離向量Dx,包含了x到N中所有目的地y的費用估計值。
  • 3. 每個鄰居的距離向量Dv。

接下來每個結點不時地向它的每個鄰居傳送它自身地距離向量副本。

當結點x從其他每一個鄰居v接收到一個新距離向量的時候,它將儲存v的距離向量,然後使用Bellman-Ford方程來更新自身的距離向量。

如果存在更新,更新完畢後,接下來將對每個鄰居傳送它的距離向量副本。

最後收斂到最小路徑。

 

虛擬碼

說人話就是:

對每個結點x進行如下操作:
    初始化:
        遍歷所有網路中的所有目的地y:
            估計 x 的距離向量。如果是非鄰接結點,那麼距離為∞。
        遍歷每個鄰接結點 w:
            鄰接結點 w 的距離向量。初始估計,不準確的。
        遍歷每個鄰接結點 w:    
            傳送本結點 x 的距離向量到每個鄰接結點 w。

    
    迴圈:
        等待(知道存在鏈路狀態變化或者收到其他結點的距離向量之後終止等待)
        
        遍歷網路N中的每個結點 y:
            依照bellman-ford方程更新本地 x 距離向量

        如果 x 的距離向量存在變化
            傳送 x 的距離向量給每一個鄰居結點。

實際C++實現演算法還沒寫好。。。等等。