SPF vs Bellman-Ford 图解

SPF算法

百度百科:SPF算法也被称为Dijkstra算法,这是因为最短路径优先算法SPF是由荷兰计算机科学家狄克斯特拉于1959年提出的。
SPF算法将每一个路由器作为根(ROOT)来计算其到每一个目的地路由器的距离,每一个路由器根据一个统一的数据库会计算出路由域的拓扑结构图,该结构图类似于一棵树,在SPF算法中,被称为最短路径树。SPF算法是OSPF、IS-IS路由协议计算最短路径的基础。
在OSPF路由协议中,最短路径树的树干长度,即OSPF路由器至每一个目的地路由器的距离,称为OSPF的Cost,其算法为:Cost = 100Mbps/链路带宽。

参考文章

SPF(Dijkstra)算法完美教程
ospf学习-----SPF最短路径算法

SPF案例

如图,V0~V8是9台路由器节点,节点之间的值是cost开销值的大小,我们以V0节点作为根,计算到其他节点的最短路径,也就是在V0看来去往其他节点最近的路径。
在这里插入图片描述
我们创建两个集合,分别是:
S集合:每求得一条最短路径 , 就将其节点加入到集合S中,直到全部顶点都加入到S时,算法就结束,初始时S中只有一个源点V0,且自己到自己的cost为0
U集合:其余未确定最短路径的顶点集合,初始时U中有除V0以外的所有节点,且从V0到其他所有节点的cost为无穷
在这里插入图片描述

第一次,我们先从V0开始发散,V0与V1、V2直连的cost值分别是1和5,与其他节点不直连所以cost设为无穷大,因为V0->V1的cost值在U集合中最小,所以将V1标红并加入到S集合当中
在这里插入图片描述

第二次,我们从V1开始发散,V1与V2、V3、V4直连的cost值分别是3、5、7,与其他节点不直连所以cost同样设为无穷大,因为V0->V1->V2的cost值4最小(且小于第一次发散的V0->V2的cost值5),所以将V2标红并加入到S集合当中
在这里插入图片描述

第三次,我们从V2开始发散,V2与V4、V5直连的cost值分别是1和7,与其他节点不直连所以cost同样设为无穷大,因为V0->V1->V2->V4的cost值5最小(且小于第二次发散的V0->V1->V4的cost值6),所以将V4标红并加入到S集合当中
在这里插入图片描述

第四次,我们从V4开始发散,V4与V3、V5、V6、V7直连的cost值分别是2、3、6、9,与其他节点不直连所以cost同样设为无穷大,因为V0->V1->V2->V4->V3的cost值7最小(且小于第二次发散的V0->V1->V3的cost值8),所以将V3标红并加入到S集合当中
在这里插入图片描述

第五次,我们从V3开始发散,V3与V6直连的cost值是3,与其他节点不直连所以cost同样设为无穷大,这里要注意一下,V0->V1->V2->V4->V5的cost值为8最小,所以这一步不移动V6,将V5标红并加入到S集合当中
在这里插入图片描述
第六次,我们从V5开始发散,因为V0->V1->V2->V4->V5->V7的cost值为13所以更新前往V7的cost值为13,但是U集合里前往V6的cost值10为最小,所以将V6标红并加入到S集合当中
在这里插入图片描述

第七次,我们从V6开始发散,V6与V7、V8直连的cost值分别是2、7,与其他节点不直连所以cost同样设为无穷大,因为V0->V1->V2->V4->V3->V6->V7的cost值12最小(且小于第六次发散的V0->V1->V2->V4->V5->V7的cost值13),所以将V7加入到S集合当中
在这里插入图片描述

第八次,我们从V7开始发散,因为V0->V1->V2->V4->V3->V6->V7->V8的cost值16最小(且小于第六次发散的V0->V1->V2->V4->V3->V6->V8的cost值17),所以将V8加入到S集合当中
在这里插入图片描述

最终形成的SPF路径

最终的SPF路径以及由V0节点到其他各个节点的cost值分别如下
在这里插入图片描述

Bellman-Ford算法

百度百科:贝尔曼-福特算法(Bellman-Ford)是由理查德·贝尔曼(Richard Bellman) 和 莱斯特·福特 创立的,求解单源最短路径问题的一种算法。它的原理是对图进行V-1次松弛操作,得到所有可能的最短路径。其优于迪科斯彻(Dijkstra)算法的方面是边的权值可以为负数、实现简单,缺点是时间复杂度过高,高达O(VE),V和E分别是节点和边的数量。但算法可以进行若干种优化,提高了效率。

参考文章

Bellman-Ford算法
最短路径——Bellman-Ford算法
【墙裂推荐】Bellman Ford 单源最短路径算法 视频【中字】

负权回路

介绍案例之前,我们需要知道Bellman-Ford算法有两个特点,一个是它的每条路径都有方向,另一个就是有负权回路(negative cycle),所以没有负权回路的话介意不要用这个算法。另外,Bellman-Ford算法虽然能够检测出负权回路,但是处在负权回路内以及周边被影响的那些节点,都不能计算出最短路径,因为cost越算值越小。

如下图,负权回路就是从0节点到2节点每转一圈cost值还减少了,那转个无数圈就变成负无穷了,这样最短路径就是无解的。
在这里插入图片描述

Bellman-Ford案例

因为没有找到合适的图,采用了参考文章当中B站上的一个图,图示有10个节点,所以我们我们需要进行9次的松弛操作,我在这里管它叫迭代

第一次迭代

初始状态的话,节点0自己到自己cost为0,到其他节点均为无穷
在这里插入图片描述

从节点0到节点1的cost为5,所以节点0到节点1的cost更新为5
在这里插入图片描述

从节点1到节点2的cost为20,所以节点0到节点2的cost更新为5+20=25
在这里插入图片描述

将所有的边都跟上面操作一样更新一遍,一旦出现更小的cost值的话就将之前的给替换掉
所有边都更新一遍cost的操作叫作迭代(Iteration),以下的图才是第一次迭代完的cost图,我们还需要迭代8次
在这里插入图片描述

第二次迭代

下图是第二次迭代的结果,我们跳过剩下的迭代直接进入最后一次迭代的图
在这里插入图片描述

第九次迭代

下图是第九次迭代的结果,因为图中有负权回路,所以我们再重复一次V-1=9次的迭代,直到把这个负权回路的影响传播到整张图上的所有节点
在这里插入图片描述

负权回路的第一次迭代

因为这一次迭代前往节点3的cost较之前更小,所以将节点3的cost值更新为负无穷
在这里插入图片描述

接着节点4也被影响到了,到节点4的cost值变小,所以将4节点的cost值也更新为负无穷
在这里插入图片描述

同样的,节点2和9也不能幸免,cost值都更新为负无穷
在这里插入图片描述

负权回路的第九次迭代

像上面的迭代,我们总共要执行9次,最后得出的图如下所示,节点2、3、4、9因为负权回路直接或间接的影响,求最短路径无解,其他节点的最短路径cost都已经计算出来并且不会改变了
在这里插入图片描述

Dijkstra vs Bellman-Ford对比视频

求解最短路径问题的一快与一慢(Dijkstra vs Bellman-Ford)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Bellman-Ford 算法是一种用于解决带有负权边的单源最短路径问题的算法。它可以应用于各种场景,包括网络路由、电力系统、地理信息系统等等。以下是一些 Bellman-Ford 算法的应用示例: 1. 网络路由:在计算机网络中,Bellman-Ford 算法可以用于计算最短路径,从而决定数据包在网络中的传输路线。它通过收集和更新每个节点的距离向量(distance vector),最终找到从源节点到所有其他节点的最短路径。 2. 电力系统:在电力系统中,Bellman-Ford 算法可以用于计算最短传输线路,以便在电力传输过程中减少能量损耗和成本。通过将电力网络建模为带权有向图,可以使用 Bellman-Ford 算法找到从电源到各个负载节点的最短路径。 3. 地理信息系统:在地理信息系统中,Bellman-Ford 算法可以用于计算两个地点之间的最短路径。通过将地图视为带权图,可以使用 Bellman-Ford 算法找到从起点到终点的最短路径,以便规划导航或路线。 4. 数据包传输:在数据包传输中,Bellman-Ford 算法可以用于选择最佳传输路径。通过考虑每个节点的跳数和延迟,Bellman-Ford 算法可以确定最优路径,以便在网络中传输数据包。 需要注意的是,Bellman-Ford 算法对负权环路不稳定,可能会导致无限循环。因此,在应用 Bellman-Ford 算法时,需要进行环路检测和处理,以确保算法能够正确地终止并给出正确的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姜亚轲

你花钱的样子真帅

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值