单源最短路径问题并行算法分析

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单源最短路径问题并行算法分析实验报告

一、实验名称

单源最短路径问题并行算法分析。

二、实验目的

分析单源最短路径Dijkstra并行算法和MPI源程序,并分析比较Dijkstra并行算法和Moore并行算法的性能。

三、实验内容

1、分析单源最短路径Dijkstra并行算法和MPI源程序。

2、分析单源最短路径问题的Moore并行算法,比较两种并行算法的性能。

四、实验步骤

1、问题描述

单源最短路径问题即指:已知一个n结点有向图G=(V,E)和边的权函数c(e),求由G中某指定结点v0到其他各个结点的最短路径。这里还假定所有的权值都是正的。

2、比较串行Dijkstra算法和Moore算法

2.1、Dijkstra算法基本思想

假定有一个待搜索顶点表VL,初始化时做:dist(s)←0;dist(i)←∞(i≠s);VL←V。算法执行时,每次从VL(≠Φ)中选取这样一个顶点u,它的dist(u)值最小。将选出的u作为搜索顶点,若∈E,而且dist(u)+w(u,v)

输出:dist(1:n),其中,dist(i)表示顶点s到顶点i的最短路径(1≤i≤n)。

begin

/*初始化*/

(1)dist(s)←0;

(2)for i←1 to n do

if i≠s then dist(i)←∞endif

endfor;

(3)VL←V;

(4)for i←1 to n do /*找最短距离*/

(5)find a vertex u∈VL,such that dist(u) is minimal;

(6)for each(∈E) ∧(v∈VL) do

if dist(u)+w(u,v)

dist(v)←dist(u)+w(u,v)

endif

endfor;

(7)VL←VL-{u}

endfor

end.

2.2、Moore算法的基本思想

设源点为s∈V,从s到其它各顶点的最短路径长度用一个一

维数组dist存储。首先置dist(s)=0,dist(v)←∞,v≠s,v∈V。Moore算法同Dijkstra算法不同之处是:将Dijkstra算法中的待搜索顶点表替换成待搜索队列。算法开始执行时,队列仅含源点s。以后每次只要待搜索队列非空,则将队头的顶点从队列中移出作为本次搜索的顶点,然后检查u的所有射出边∈E。若dist(u)+w(u,v)

输入:有向图G(V,E)的加权邻接矩阵W={w ij},i,j∈V;

输出:从源s到所有其它顶点i(i≠s)的最短路径dist(i),i∈V。

begin

(1)for i←1 to n do /*初始化*/

call INITIALIZE(i)

endfor;

(2) insert s into the queue; /*插入s到队列中*/

(3) while the queue is not empty do

call SEARCH

endwhile

end.

Procedure SEARCH;

begin

(3.1) dequeue vertex u; /*从队列中删去顶点u*/

(3.2) for each edge (u,v)∈E do

(ⅰ) new_dist←dist(u)+w(u,v);

(ⅱ) if new_dist

then dist(v)←new_dist

endif;

(ⅲ) if v is not in the queue then

enqueue vertex v

endif

endfor

end.

Procedure INITIALIZE

begin

(1.1)dist(s)←0

(1.2)dist(v)←∞(v≠s,v∈V)

(1.3)queue←0

end

2.3、两种算法的性能比较

Dijkstra算法是由E.W.Dijkstra于1959年提出的一个适用于所有弧度权均为非负的最短路径算法,也是目前公认的高效经典算法之一。其时间复杂度为O (n2),其中n为结点个数。

Moore算法分别由Bellman,Ford和Moore在五、六十年代提出。其时间复杂度是O (nm),期中m是边/弧数。目前这样的时间复杂度在所有带有负权弧顶最短路径算法中是最好的。但其实际运算效果却往往不及Dijkstra算法。

3、串行算法并行化

3.1、Dijkstra并行算法

1)每个处理器分配n=N/p各节点进行初始化(N为节点数,p为处理器个数)。

2)首先每个处理器分配n个节点分别求局部最小值,然后再p个处理器和作求全局最小值,最后再将这一最小值广播出去。P 个处理器合作方法:当p为偶数时,后p/2 个处理器将自己的局部最小值分别发送到对应的前p/2个处理器中,由前p/2个处理器比较出2个局部最小值中相对较小者并保留。当p为奇数时,设p=2h+1,则后h个处理器的值分别发送到前h个处理器中,比较并保留最小值。一次这样的循环过程后,p个最小值减少了一半,两次后,变为1/4,如此一层一层的比较,logp次循环后,就可以得出唯一的全局最小值,然后将其广播出去。

3)每个处理器分配n个顶点,然后独立进行更新dist的操作。其中广播实现步骤如下:

输入:数据u(存放在单元B(1)中);

相关文档
最新文档