单源节点最短路径蛮力法和Dijkstra算法性能对比

一、单源节点问题的对比

        在本文中,考虑单源点最短路径问题,对于一个加权连通图的一个称为起点的给定定点,求出它到所有其他定点之间的一系列最短路径。需要说明的是,这里所关心的不是从一个起点出发访问所有其他定点的单条最短路径,这种问题的难度更大。单起点最短路径问题要求的是一组路径,每条路径都从起点出发通向图中的一个不同顶点,其中某些路径可能具有公共边。在求带权连通图中最短路径问题有两个著名的算法,Dijkstra算法和Floyd算法,其中Dijkstra算法是解决单源节点间最短路径问题,本文中采用的就是这种算法,而Floyd算法是求解图中每对节点间的最短路径问题。本文中考虑的两种算法如下:

1)基于全排列的蛮力搜索算法,对连通图中除首节点和尾节点外,其他节点进行全排列,对其中每一个排列构成的路径首先进行合法性检测,然后通过笔记记录,找到最短路径。

2)Dijkstra算法,该算法的基本思想是按照路径长度的增长来通过迭代,依次求得v0节点到其他节点的路径长度,当经过n次迭代后,即可求出v0到其他n-1个节点之间的最短路径长度。首先将节点分为两个集合S1和S2,其中S1初始只包含v0节点,S2初始为其他节点,然后算法按照以下规则来迭代:

①从集合S2中选择一个节点vi使其到v0节点之间的距离最短,并把vi加入到S1集合中;

②用vi作为中间节点来过渡,判断是否能通过vi节点作为中间节点,使得从v0到S2集合中其他的节点路径更短,如果通过vi作为中间节点的过渡得到的距离更短,即更新v0到S2中节点之间的距离权值;

③重复①~②的迭代过程,知道S2集合中不再有节点为止。

二、该问题的理论分析

       首先我们分析基于全排列的蛮力搜索算法,通过对所有的节点进行全排列,然后判断每一种路径组合是否合法,从合法的路径中选择一条最短的路径。其时间复杂度为O(n!)。

在采用迪杰斯特拉算法时候,其时间复杂度为O(n*n),采用临界矩阵存储时,其空间复杂度为O(n*n)。

三、实验仿真结果

       在单源节点间最短路径问题的实验设计中,采用的样本规模由节点的数量表示,因为在本文中选取的两种算法,基于全排列蛮力求解的算法和迪杰斯特拉算法的时间复杂度均直接与图的节点个数有关。在图3.1中,是一个程序运行的实时输出图,在图中输出的数据中,每一行的三个数据,第一个是图中节点的个数,第二个数据是迪杰斯特拉算法所耗费的时间,第三个数据是基于全排列的蛮力算法的时间开销。可以看到当节点个数是12的时候,基于全排列的蛮力算法的时间开销已经很大了,达到了3972ms。由于蛮力算法的时间复杂度太高,因此专门针对迪杰斯特拉算法进行了时间开销的测试,图3.2中就是专门测试迪杰斯特拉算法随样本规模的增大时间开销的变化。

《单源节点最短路径蛮力法和Dijkstra算法性能对比》《单源节点最短路径蛮力法和Dijkstra算法性能对比》

        在对数据实验的记录中,依然采用了将实验中运行得到的数据,记录在了txt文本中,以供后面导入到Matlab中更直观的作图,可视化的对比算法的性能。图3.3是对两种算法的测试数据记录的文本文件,可以看到当图中的节点数量达到15个时,基于全排列的蛮力算法基本失效,其运行时间达到了7044687ms,而此时迪杰斯特拉算法的时间开销还特别小。图3.4则是专门对迪杰斯特拉算法进行的实验测试,可以看出,迪杰斯特拉算法的性能还是比较优秀的,时间开销维持在毫秒级别。

《单源节点最短路径蛮力法和Dijkstra算法性能对比》
《单源节点最短路径蛮力法和Dijkstra算法性能对比》

        下面进行的是将实验中记录下的数据从txt文本中导入到Matlab中所得到的可视化性能曲线图。在图3.5中,显示的是两种算法,时间开销的对比图,可以看到,当样本数量达到了13开始,基于全排列的蛮力算法时间复杂度急剧上升,很快将不具有可用性,而迪杰斯特拉算法的时间复杂度一直都在在0附近。为了更直观的得到迪杰斯特拉算法的时间复杂度的变化,单一的针对迪杰斯特拉算法进行了实验测试。逐渐增大样本数据的规模,测试其性能,从图3.6中我们可以看出,迪杰斯特拉算法的时间开销整体趋势是呈二次函数的曲线上升,这也符合迪杰斯特拉算法的时间复杂度为O(n*n)。

《单源节点最短路径蛮力法和Dijkstra算法性能对比》
《单源节点最短路径蛮力法和Dijkstra算法性能对比》

    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/wang_dong001/article/details/51759131
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞