SPF算法

标题:IPA-taskpacket004:SPF算法《分享004》

实验四:SPF算法

实验目标:理解并掌握SPF算法

实验TOP

图1 逻辑拓扑

clip_image002

表1 逻辑拓扑中的拓扑数据库

clip_image004

SPF算法:

构造一棵树[a],使n个节点之间的总长最小(树是一个在每两个节点之间仅有一条路径的图)。

在我们给出的构造过程中,分枝被分成3个集合:

Ⅰ.被明确分配给构造中的树的分枝(它们将在子树中);

Ⅱ.这个分枝的隔壁分枝被添加到集合Ⅰ;

Ⅲ.剩余的分枝(抛弃或不考虑)。

节点被分成2个集合:

A.被集合Ⅰ中的分枝连接的节点;

B.剩余的节点(集合Ⅱ中有且仅有一个分枝将指向这些节点中的每一个节点)。

下面我们开始构造树,首先选择任意一个节点作为集合A中仅有的成员,并将所有拿这个节点做端点的分枝放入集合Ⅱ中。开始集合Ⅰ是空的。然后我们重复执行下面两步。

步骤1:集合Ⅱ中最短的分枝被移出并加入集合Ⅰ。结果,一个节点被从集合B传送到集合A。

步骤2:考虑从这个节点(刚才被传送到集合A中的节点)通向集合B中节点的分枝。如果构建中的分枝长于集合Ⅱ中相应的分枝,那么分枝被丢弃;否则,用它替代集合Ⅱ中相应的分枝,并且丢弃后者。

接着我们回到第1步并重复此过程直到集合Ⅱ和集合B为空。集合Ⅰ中的分枝形成所要求的树。

配合路由器的算法,第—点注意的是,Dijkstra描述了3个分枝集合:Ⅰ、Ⅱ和Ⅲ。在路由器中,使用3个数据库表示3个集合:

· 树数据库——树数据库用来表示集合Ⅰ。通过向数据库中添加分枝实现向最短路径树中添加链路(分枝)。当算法完成时,这个数据库将可以描述最短路径树。

· 候选对象数据库——候选对象数据库对应集合Ⅱ。按照规定的顺序从链路状态数据库向该列表中复制链路,作为向树中添加的候选对象。

· 链路状态数据库——按照前面的描述,这里保存所有链路,这个拓扑数据库对应集合Ⅲ。

Dijkstra还指定了两个节点集合——A和B。这里的节点是路由器。这些路由器被明确地用路由器链路三元组(路由器ID、邻居ID、代价)中的邻居ID表示。集合A由树数据库中链路所连接的路由器组成。集合B是所有其他的路由器。由于全部要点是发现到每台路由器的最短路径,所以当算法结束时集合B应该为空。

下面是一台路由器中采用的Dijkstra算法版本:

步骤1:路由器初始化树数据库,将自己作为树的根。这表明路由器作为它自己的邻居,代价为0。

步骤2:在链路状态数据库中,所有描述通向根路由器邻居链路的三元组被添加到候选对象数据库中。

步骤3:计算从根到每条链路的代价,候选对象数据库中代价最小的链路被移到树数据库中。如果两个或更多的链路离根的最短代价相同,选择其中一条。

步骤4:检查添加到树数据库中的邻居ID。除了邻居ID已在树数据库中的三元组之外,链路状态数据库中描述路由器邻居的三元组被添加到候选对象数据库中。

步骤5:如果候选对象数据库中还有剩余的表项,回到第3步。如果候选数据库为空,那么终止算法。在算法终止时,在树数据库中,每个单一的邻居ID表项将表示1台路由器,到此最短路径树构造完毕。

表2总结了应用Dijkstra算法为图1中的网络构建最短路径树的过程和结果。图2给出了通过该算法为路由器RB构造的最短路径树。

图2 用表2中的算法得到的最短路径树

clip_image006

表2 对表1的数据库应用Dijkstra算法

clip_image008

clip_image010

clip_image012

clip_image014

总结:

· 如果在候选数据库中出现多条NID相同的条目,只保留到根代价最小的条目。

· 在树数据库中,NID必须唯一。如果出现重复,则表明计算有误!