版本:spark 1.6
该版本自带的最短路径算法shortestPaths没办法自定义权重(默认每条边的权重都一样),不符合现实生活,比如在地图中计算两个位置的最短路线,要考虑线路的长度,线路的拥堵情况等多方面,所以写了个加权最短路径算法加入距离属性
算法说明:
加权最短路径算法计算所有的顶点到特定点的距离:
1.初始化开始顶点的距离为0,所有其他节点距离设置为无穷大
2. 将当前顶点设为初始顶点
3. 所有与当前顶点相邻的顶点,将距离设置为当前顶点的距离加上将当前顶点连接到该其他顶点的边的长度之和的较小值。
4.将当前顶点标记为已访问
5.迭代停止条件, 如果没有未访问的顶点
6.迭代第三步
代码:
def dijkstra[VD](g:Graph[VD,Double],origin:VertexId)={
var g2=g.mapVertices((vid,vd)=> (false,if(vid == origin) 0 else Double.MaxValue)) //修改点的属性,如果是特殊顶点属性为0,其他为无穷,false标志着是否被访问过
//每次循环都会访问一个点并标记为true,共循环vertices.count-1次(特定节点除外)
for(i <- 1L to g.vertices.count-1){
val currentVertexId=
g2.vertices.filter(!_._2._1)
.fold((0L,(false,Double.MaxValue)))((a,b)=>
if(a._2._2 < b._2._2)