首页 理论教育广度优先搜索在形式化构件装配中的应用

广度优先搜索在形式化构件装配中的应用

【摘要】:在图领域,广度优先搜索常被用于求解图的最短路径问题中。松弛操作的伪代码如下:2.Floyd算法Floyd算法是一个经典的全源最短路径算法,适用于不包括负环的图,可以应用于计算所有城市之间的交通道路距离问题。Floyd算法利用了上述两个假设之间的关系,该关系依赖于节点k是否是路径p上的一个中间节点。k=0则表示这两个节点是直接相连的,没有中间节点。

在图领域,广度优先搜索常被用于求解图的最短路径问题中。最短路径问题是图论问题的核心问题之一,许多更深层次的算法问题都是以最短路径问题为基础的。同时,最短路径问题在实际中也有很多的应用,有些问题虽然从表面上看与最短路径问题没有什么联系,但是深入分析就会发现它们也可以用最短路径的思想来解决。

最短路径算法可以分为两类。单源最短路径是其中常用的一类,它可以计算出某一个特定节点到图中剩余节点的长度。还有一类常用的算法是全源最短路径算法,它与前者的区别是可以计算出图中两两节点之间的长度,在实际中也有很多的应用。

1.Dijkstra算法

有很多算法都可以计算一个图的单源最短路径,但各自的适用范围是不一样的。其中,Dijkstra算法适用的是权值都是非负的有向图。Dijkstra算法的思想是:首先定义一个节点的集合S,这个集合所包含的是最短路径已经计算完成的节点。然后从图中剩余的点中再寻找符合条件的节点并加入S中。最后一步对与新加入S节点的相连节点进行松弛操作。

Dijkstra算法的过程描述如下:

(1)对图进行初始化

(2)选择最短路径dist(s,w),并将w加入S中;

(3)在第二步中得到w,对于u∈V-S,对所有从节点u发出的边(u,v)进行松弛操作;重复进行第二步和第三步的操作,直到计算出所有节点到源节点的长度。

其伪代码描述如下:(www.chuimin.cn)

在上述伪代码描述中,运用下面的INITIALIZE-SINGLE-SOURCE(G,s)算法对最短路径估计和前驱节点进行初始化:

其中,松弛操作relax(u,v,w)的过程为:将从节点s到节点u之间的最短路径距离加上节点u与v之间的边权重,并与当前的s到v的最短路径估计进行比较,如果前者更小,则对v.d和v.π进行更新。松弛操作的伪代码如下:

2.Floyd算法

Floyd算法是一个经典的全源最短路径算法,适用于不包括负环的图,可以应用于计算所有城市之间的交通道路距离问题。Floyd算法依赖于下面的观察,假定图G的所有节点为V={1,2,…,n},考虑其中的一个子集{1,2,…,k},这里k是某个小于n的整数。假设任意两个节点对之间经过的中间节点都来自这个集合,并且设p为其中权重最小的路径。Floyd算法利用了上述两个假设之间的关系,该关系依赖于节点k是否是路径p上的一个中间节点。

因此,我们首先可以定义dij(k)为任意两个节点之间一条最短路径的权重,这两个节点之间的中间节点都来自之前定义的子集。k=0则表示这两个节点是直接相连的,没有中间节点。这样的路径最多只有一条边,因此,dij(0)=ωij。根据上面的讨论,递归定义dij(k)如下:

因为对于任何路径来说,所有的中间节点都属于集合{1,2,…,n},矩阵D(n)=(dij(n))给出的就是最后的答案。

其伪代码描述如下: