本发明属于计算机技术领域,具体涉及一种求解大规模多段图最短路径的分布式方法。
背景技术:
最短路径问题是图论中的一个经典问题,旨在寻找图中一对顶点之间的最短路径。多段图是一类特殊的加权有向图,图中的顶点分为至少两个不相交的集合(称为阶段),其中第一个和最后一个阶段有且仅有1个顶点,分别称为源点和汇点,图中边只能从前一阶段的顶点指向后一阶段的顶点。很多工程应用中的实际问题都可以建模为多段图,所以其应用十分广泛。
随着多段图规模的不断增大,单机算法既无法存储所有的多段图数据,也无法实现最短路径的求解。此时,分布式算法成为必选。
分布式算法是将图数据尽量均衡地分配到计算机集群的计算节点上,然后各个计算节点并行计算本机上结果,再汇总各个部分结果得到最终结果。目前,已经提出了并行dijkstra算法、并行floyd算法、基于ballstring模型的并行算法、δ-stepping并行算法等,这些方法虽然也适用于于多段图,但是没有充分利用多段图的特点,通信量过大,计算效率低。
技术实现要素:
针对现有技术中存在的上述技术问题,本发明提出了一种求解大规模多段图最短路径的分布式方法,设计合理,克服了现有技术的不足,具有良好的效果。
为了实现上述目的,本发明采用如下技术方案:
一种求解大规模多段图最短路径的分布式方法,用|a|表示集合a中元素的个数;用
(1)
(2)vi={vi,j|j=1,2,…,ni},其中ni=|vi|表示第i个阶段的顶点个数;
(3)e={〈vi,j,vi+1,k>|i=1,2,…,m-1;j=1,2,…,ni;k=1,2,…,ni+1}是边集合;
(4)w={wi,j,i+1,k|i=1,2,…,m-1;j=1,2,…,ni;k=1,2,…,ni+1}是权重集合,wi,j,i+1,k是〈vi,j,vi+1,k〉的权重;
(5)v1={v1,1},vm={vm,1},v1,1和vm,1分别称为源点和汇点;
以
具体步骤如下:
步骤1:执行如下步骤,对多段图进行划分:
步骤1.1:取当前计算节点编号p=1,当前边的总数量sum=0,循环变量i=1,第p个计算节点cnp存储的第一个阶段编号sp=i;
步骤1.2:取阶段i至阶段(i+1)的边集合ei={<vi,j,vi+1,k>|j=1,2,…,ni;k=1,2,…,ni+1};
步骤1.3:取sum=sum+|ei|,若
步骤1.4:取i=i+1;若i≤m-1,转步骤1.2,否则转步骤2;
步骤1.5:取sum=0,p=p+1,sp=i,转步骤1.3;
步骤2:第l个计算节点cnl(l=1,2,…,p)执行如下步骤求各部分子图的部分最短路径,即所有计算节点并行执行如下步骤:
步骤2.1:对cnl中存储的每个顶点vi,j(i=sl,sl+1,…,el,j=1,2,…,ni),用
步骤2.2:对cnl中存储的第一个阶段的每个顶点
步骤2.3:取循环变量i=sl;
步骤2.4:置i=i+1,若i≤el,即cnl中存储的最后一个阶段的编号,转下一步,否则转步骤2.11;
步骤2.5:取循环变量j=0;
步骤2.6:置j=j+1,若j≤ni,即不大于vi中最后一个顶点的编号,转下一步,否则转步骤2.4;
步骤2.7:取循环变量k=0;
步骤2.8:置k=k+1,若
步骤2.9:取
步骤2.10:取
步骤2.11:用
步骤2.12:置i=i+1,若
步骤2.13:取循环变量j=0;
步骤2.14:置j=j+1,若
步骤2.15:取循环变量k=i,循环变量h=el,
步骤2.16:若h≠sl,转下一步,否则转步骤2.14;
步骤2.17:取
步骤2.18:cnl中存储的第el阶段的每个顶点
步骤3:执行如下步骤,通过各计算节点通信来求多段图最短路径:
步骤3.1:参与通信的计算节点编号集合r={1,2,…,p};
步骤3.2:若|r|>1,转下一步,否则转步骤3.6;
步骤3.3:每个计算节点
步骤3.4:每个计算节点
步骤3.4.1:取循环变量k=0;
步骤3.4.2:置k=k+1,若
步骤3.4.3:取循环变量j=0;
步骤3.4.4:置j=j+1,若
步骤3.4.5:取循环变量g=0;
步骤3.4.6:置g=g+1,若
步骤3.4.7:取循环变量h=0;
步骤3.4.8:置h=h+1,若
步骤3.4.9:若
步骤3.4.10:置
步骤3.4.11:置g=g+1,若
步骤3.4.12:
步骤3.5:所有计算节点完成步骤3.4后,置
步骤3.6:计算节点cnp的顶点vm,1中所存储的splm,1即为结果,其中splm,1.len是最短路径长度,splm,1.path是最短路径。
本发明所带来的有益技术效果:
(1)相较于单机求解算法,此算法能够使用分布式系统处理更大规模的多段图数据。
(2)相较于已有的分布式求解算法,满足负载均衡的要求并最小化通信开销。
附图说明
图1为本发明方法的流程图。
图2为多段图划分阶段子流程图。
图3为求多段图部分最短路子流程图。
图4为各计算节点通信子流程图。
图5为多段图实例图。
图6为多段图划分结果示意图。
具体实施方式
下面结合附图以及具体实施方式对本发明作进一步详细说明:
本方法涉及到多个符号表示,我们按出现顺序概述了符号所代表的含义,如表1所示:
表1
具体实施步骤将结合图5给出的多段图实例进行详细展开。
首先,根据步骤1对多段图进行划分。根据步骤1.1和1.2,初始化p=1,sum=0,i=1,s1=1,取多段图第1阶段所有边。
根据步骤1.3,第1阶段所有边数量之和|e1|=3,则sum=3。设每个计算节点的最大负载
根据步骤1.4,多段图共9个阶段,则m=9,取i=2,因i≤8,则取第2阶段所有边,即|e2|=7,sum值更新为10,即第1阶段3条边加第二阶段7条边,因10<15,将第2阶段的出边全部分配到计算节点cn1上,更新e1=3。再取i=3,满足i≤8,取第3阶段所有边,即|e3|=7,sum=17,因17>15,则转步骤1.5。
根据步骤1.5,重置sum=0,取p=2,s2=3,转步骤1.3更新sum值为7,因7<15,将第3阶段的所有边分配到计算节点cn2上,取e2=4。转步骤1.4取i=4,满足i≤8,取第4阶段所有边,即|e4|=5,更新sum值为12,因12<15,将第4阶段的所有边分配到计算节点cn2上,更新e2=5。按此一直循环得到第5阶段和第6阶段的12条边全部分配到计算节点cn3上,s3=5,e3=7;第7阶段和第8阶段的8条边全部分配到计算节点cn4上,s4=7,e3=9。最后分配结果如图6所示。
然后,根据步骤2,每个计算节点计算各个子图的部分最短路径。根据步骤2.1到2.8,4个计算节点并行执行,计算节点cn1上置i=2,j=1,k=1,计算节点cn2上置i=4,j=1,k=1,计算节点cn3上置i=6,j=1,k=1,计算节点cn4上置i=8,j=1,k=1。
根据步骤2.9和2.10,各个计算节点上取
cn1计算结果
cn2计算结果
cn3计算结果
cn4计算结果
根据步骤2.11到2.15,4个计算节点并行执行,计算节点cn1上取k=1,h=3,
根据步骤2.16到2.17,因计算节点cn1满足h≠s1,则取
根据步骤2.18求得4个计算节点上最大阶段各个点最短路径信息列表,计算节点cn1上得到:
spl3,1={(8,{v1,1,v2,2,v3,1})}
spl3,2={(9,{v1,1,v2,2,v3,2})}
spl3,3={(7,{v1,1,v2,3,v3,3})}
spl3,4={(7,{v1,1,v2,2,v3,4})}
计算节点cn2上得到:
spl5,1={(9,{v3,1,v4,2,v5,1}),(8,{v3,2,v4,2,v5,1}),(8,{v3,3,v4,2,v5,1})}
spl5,2={(8,{v3,1,v4,1,v5,2}),(5,{v3,2,v4,1,v5,2}),(11,{v3,4,v4,3,v5,2})}
spl5,3={(15,{v3,1,v4,2,v5,3}),(11,{v3,2,v4,3,v5,3}),(14,{v3,3,v4,2,v5,3}),(12,{v3,4,v4,3,v5,3})}
计算节点cn3上得到:
spl7,1={(10,{v5,1,v6,1,v7,1}),(11,{v5,2,v6,1,v7,1}),(6,{v5,3,v6,1,v7,1})}
spl7,2={(9,{v5,1,v6,2,v7,2}),(11,{v5,2,v6,2,v7,2}),(9,{v5,3,v6,1,v7,2})}
spl7,3={(8,{v5,1,v6,2,v7,3}),(10,{v5,2,v6,1,v7,3}),(5,{v5,3,v6,2,v7,3})}
spl7,4={(5,{v5,1,v6,2,v7,4}),(8,{v5,2,v6,2,v7,4}),(10,{v5,3,v6,2,v7,4})}
计算节点cn4上得到:
spl9,1={(12,{v7,1,v8,1,v9,1}),(11,{v7,2,v8,2,v9,1}),(12,{v7,3,v8,1,v9,1}),(12,{v7,4,v8,1,v9,1})}
最后,根据步骤3计算最终结果。根据步骤3.1和3.2,置r={1,2,3,4},因|r|=4,满足|r|>1,则转步骤3.3,计算节点cn1将spl3,1,spl3,2,spl3,3,spl3,4发送给计算节点cn2,同时计算节点cn3将spl7,1,spl7,2,spl7,3,spl7,4发送给计算节点cn4。
根据步骤3.4.1至3.4.8,计算节点cn2和cn4分别置
根据步骤3.4.9到3.4.12,spl3,1.path1的终点v3,1与spl5,1.path1的起点v3,1相同,所以置spl′5,1={(17,{v1,1,v2,2,v3,1,v4,2,v5,1})},步骤3.4.9再循环3次无匹配,转步骤3.4.6后取g=2,因|spl3,1|=1,不满足g≤|spl3,1|,则转步骤3.4.4取j=2,当循环到h=2时,spl3,2.path1的终点v3,2与spl5,1.path2的起点v3,2相同,所以置spl′5,1={{(17,{v1,1,v2,2,v3,1,v4,2,v5,1}),(17,{v1,1,v2,2,v3,2,v4,2,v5,1})};
步骤3.4.4同理再循环2次得到spl′5,1=
{(17,{v1,1,v2,2,v3,1,v4,2,v5,1}),(17,{v1,1,v2,2,v3,2,v4,2,v5,1}),(15,{v1,1,v2,3,v3,3,v4,2,v5,1})},当j=5,n3=4,不满足j≤n4,则转步骤3.4.10至3.4.12,置
同理计算节点cn3与cn4进行通信后得spl9,1=
{(17,{v5,1,v6,2,v7,4,v8,1,v9,1}),(20,{v5,2,v6,2,v7,4,v8,1,v9,1}),(17,{v5,3,v6,2,v7,3,v8,1,v9,1})}。
根据步骤3.5,置r={2,4},转步骤3.2后与第一次通信同理。最后根据步骤3.6得到spl9,1={(32,{v1,1,v2,3,v3,3,v4,2,v5,1,v6,2,v7,4,v8,1,v9,1})},表示最短路径长度为32,最短路径为{v1,1,v2,3,v3,3,v4,2,v5,1,v6,2,v7,4,v8,1,v9,1}。
当然,上述说明并非是对本发明的限制,本发明也并不仅限于上述举例,本技术领域的技术人员在本发明的实质范围内所做出的变化、改型、添加或替换,也应属于本发明的保护范围。