简单易懂的距离向量算法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++实现算法还没写好。。。等等。

猜你喜欢

转载自blog.csdn.net/CVSvsvsvsvs/article/details/84325358
今日推荐