利用MPI求解全源最短路径的并行算法实现
一、 问题描述
随着计算机的出现和发展,对图论的研究不断深入。最短路径问题作为图论中的一个经典问题,被应用于众多领域。在网络通信领域,信息路径选择问题也与最短路径问题密切相关。解决最短路径问题的算法在诸多工程领域都有较强的实用价值。一般来说最短路径问题分为单源最短路径问题和全源最短路径, 公认的比较好的算法Dijkstra算法比较适合于单源最短路径,而Floyd算法适合用于求解全源最短路径。
本文所关注的所有点对之间最短路径问题也就是全源最短路径问题,就是要求解一个有向带权图中所有顶点之间的最短路径,因此选用Floyd算法作为算法基础。对《一种实用的所有点对之间最短路径并行算法》认真分析研读后,将所述并行算法予以实现。
二、 串行Floyd算法描述及分析
Floyd算法,又称传递闭包方法,其实质就是邻接矩阵自乘n次,算法的时间复杂度为。下面就是扩充了路径矩阵的Floyd串行算法的描述:
Floyd串行算法
输入:顶点数目n; 图的邻接矩阵Array; 初始化后的路径矩阵Path
计算:
/*Serialed Floyd Algorithm*/
void Floyd_Proc(unsigned int **Array, unsigned int **Path){
int i,j,k;
for ( k = 0; k < Nodes; k ++)
for ( i = 0; i < Nodes; i ++)
for ( j = 0; j < Nodes; j ++)
if ( Array[i][j] > ( Array[i][k] + Array[k][j]) )
{
Array[i][j] = Array[i][k] + Array[k][j];
Path [i][j] = Path[i][k];
}
}
输出:变换后的矩阵Array和Path
邻接矩阵是一个n ×n的矩阵Array,在具体的实现中用非常大的值(如所能表示的最大整数) 来表示不存在的边。为了表示求得的任意两个顶点最短路径具体经过途径中各个顶点的顺序,构造路径矩阵Path,来实现对最短路径途径中各个顶点的追踪和记录。顶点路径矩阵path [n][n]的初始化为path[i][j] = j(0≤i, j≤n - 1)。对于大规模的图求解所有点对之间最短路径,Floyd算法的串行算法这样的时间复杂度要花费较大的运算时间。
三、 并行Floyd算法描述
在并行算法的设计中,问题的分解通常可以有两种形式:一种是域分解,即将问题分解为若干个较小的问题区域,然后分别对其求解;另一种是功能分解,即将问题按功能分解为若干个子问题,而后对各个子问题并行求解。对于所有点对之间最短路径问题,在采用了Floyd