利用MPI求解全源最短路径的并行算法实现

本文详细介绍了如何利用MPI实现全源最短路径的并行Floyd算法,包括串行Floyd算法的描述和分析,以及并行算法的实现和复杂度分析。在并行算法中,通过二维任务划分方法,利用多个处理机并行计算,减少了计算时间,提高了效率。然而,实验结果显示,在较小规模问题上,通信开销可能导致并行性能下降,但在大规模问题中并行算法的优势更为明显。
摘要由CSDN通过智能技术生成

利用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];

                            }

}

输出:变换后的矩阵ArrayPath

邻接矩阵是一个n ×n的矩阵Array,在具体的实现中用非常大的值(如所能表示的最大整数) 来表示不存在的边。为了表示求得的任意两个顶点最短路径具体经过途径中各个顶点的顺序,构造路径矩阵Path,来实现对最短路径途径中各个顶点的追踪和记录。顶点路径矩阵path [n][n]的初始化为path[i][j] = j(0i, jn - 1)。对于大规模的图求解所有点对之间最短路径,Floyd算法的串行算法这样的时间复杂度要花费较大的运算时间。

三、      并行Floyd算法描述

在并行算法的设计中,问题的分解通常可以有两种形式:一种是域分解,即将问题分解为若干个较小的问题区域,然后分别对其求解;另一种是功能分解,即将问题按功能分解为若干个子问题,而后对各个子问题并行求解。对于所有点对之间最短路径问题,在采用了Floyd

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值