并行dijkstra最短路径算法.docVIP

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
并行dijkstra最短路径算法

并行dijkstra最短路径算法 一,并行算法设计与分析 1.1 并行化思路 串行的dijkstra算法有两层N次循环,第一层循环必须得按次序执行,不可并行。那么只有将第二层循环并行。 第二层循环有两个N次的循环,第一次循环是求dist数组的最小值。复杂度为O(N) 第二次循环是更新dist数组的值,复杂度也是O(N)。 所以串行的总复杂度为O(N*N) 那么必须将这两次循环都并行才可以降低复杂度。 1.2 求最小值的并行方法 假设有p个处理器,N个顶点。给每个处理器分配N/p个顶点,求出局部的最小值,复杂度为O N/p 。然后后一半的处理器将自己的最小值发送给第前p/2个处理器。前一半处理器接收到传来的值后,与局部的最小值比较,作为新值。继续循环,直到剩下一个处理器为止。 注意:若p为偶数,则进行一次合并后,还剩p/2个处理器。 若p为奇数,则进行一次合并后,还剩p/2+1个处理器 复杂度为O N/p+logp 1.3 更新dist数组的并行方法 给每个处理器分配N/p个节点。设选取的dist最小的顶点为u。 for j 0;j mynum;j++ if dist[u]+w[u][j] dist[j] then dist[j] dist[u]+w[u][j]; 采用行块带状划分,这是为了可以连续的传送邻接矩阵。所以不采用行循环带状划分。 复杂度为O N/p 1.4 算法总复杂度 并行的dijkstra算法复杂度为O N* N/p+logp+N/p O N*N/p+Nlogp 二,行块带状划分方法 改进之前的代码采用此方法 比如5个处理器P0,P1,P2,P3,P4。 12个顶点 划分方法如下图所示 P1 0 1 2 P2 3 4 5 P3 6 7 8 P4 9 10 11 P1负责计算dist[0~2] P2负责计算dist[3~5] P3负责计算dist[6~8] P4负责计算dist[9~11] P1需要矩阵W[0~2][0~11] P2需要矩阵W[3~5][0~11] P3需要矩阵W[6~8][0~11] P4需要矩阵W[9~11][0~11] 三,算法改进 3.1 无需单独分出一个处理器读数据 实际上当0号处理器读完邻接矩阵,并且初始化好其它处理器后,也可以参与并行dijkstra算法求解。而不必将其闲置下来。 3.2 负载均衡 3.2.1 原先的分配方法 比如nodenum 100,groupsize 4,则编号依次为0,1,2,3。0号进程不分配顶点 则按原先的方法ep 34;分配的顶点数依次为34,34,32, 显然保证负载最均衡的分配应该为34,33,33 3.2.2 改进的分配方法 ep nodenum/group_size; mod nodenum%group_size; if my_rank mod mynum ep+1; else mynum ep; 这样可以保证任意两个处理器之间的任务数最多差1 计算全局节点编号的方法如下:比如i号进程中的局部编号j的节点,全局编号 id为: If i mod id ep+1 *i+j; else id ep+1 *mod+ep* i-mod +j; 3.3 适用范围局限性 3.3.1 行块带状划分仅适用于对称矩阵的情况 num + W j,index dist[j]实际上应该为num + W index,j dist[j]。 若为对称邻接矩阵W index,j W j,index 。 3.3.2 改进方法:列块带状划分 若要对非对称邻接矩阵也适用,最好采用列块带状划分。 如图所示: P1 0 1 2 P2 3 4 5 P3 6 7 8 P4 9 10 11 P1负责计算dist[0~2] P2负责计算dist[3~5] P3负责计算dist[6~8] P4负责计算dist[9~11] P1需要矩阵W [0~11] [0~2] P2需要矩阵W [0~11] [3~5] P3需要矩阵W [0~11] [6~8] P4需要矩阵W [0~11] [9~11] 这样发送的时候需要逐行发送,每行又分成p段发送。 3.4在求局部最小值时,可用堆的思想 可以将该部分复杂度将低为O log(N/p) 还未编码。 四,改进测试 原先的对称邻接矩阵的数据测试全部通过。 附加测试数据:test文件如下 3 0 1 4 3 0 2 1 5 0 正确的结果应该为: Dist[0][0] 0; dist[0][1] 1; dist[0][2] 3; 但改进之前的代码求出的值却是错误的。

文档评论(0)

cuotian + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档