Scala 使用pregel graphx触发一对一最短路径
我尝试使用源代码查找从单个源到n个顶点的最短路径Scala 使用pregel graphx触发一对一最短路径,scala,apache-spark,shortest-path,spark-graphx,Scala,Apache Spark,Shortest Path,Spark Graphx,我尝试使用源代码查找从单个源到n个顶点的最短路径 val图形:图形[长,双]= GraphGenerators.logNormalGraph(sc,numVertices=100).MapEdge(e=>e.attr.toDouble) val sourceId:VertexId=42 val initialGraph=graph.mapVertices((id,)=> if(id==sourceId)0.0 else Double.PositiveInfinity) val sssp=初始图形
val图形:图形[长,双]=
GraphGenerators.logNormalGraph(sc,numVertices=100).MapEdge(e=>e.attr.toDouble)
val sourceId:VertexId=42
val initialGraph=graph.mapVertices((id,)=>
if(id==sourceId)0.0 else Double.PositiveInfinity)
val sssp=初始图形。怀孕(双正确认)(
(id,dist,newDist)=>math.min(dist,newDist),
三重态=>{
if(triplet.srcatr+triplet.attr数学最小值(a,b)
)
println(sssp.vertices.collect.mkString(“\n”))
它为我提供了从42到N个垂直方向的输出最短路径。
但是,如何找到单个源到单个目标之间的最短路径?
i、 e.source=42,dest=135然后我想找到它们之间的最短路径
谢谢如果不浏览整个图形,就无法找到两个顶点之间的最短距离。因为,即使你在目的地收到你的信息后停止探索,也不能保证这是最短的距离。
所以,这个算法在复杂性方面是很好的。您应该只从获得的不同目的地选取sssp值。在我看来,无法保证其他顶点的按摩处理顺序。是这样吗?
val graph: Graph[Long, Double] =
GraphGenerators.logNormalGraph(sc, numVertices = 100).mapEdges(e => e.attr.toDouble)
val sourceId: VertexId = 42
val initialGraph = graph.mapVertices((id, _) =>
if (id == sourceId) 0.0 else Double.PositiveInfinity)
val sssp = initialGraph.pregel(Double.PositiveInfinity)(
(id, dist, newDist) => math.min(dist, newDist),
triplet => {
if (triplet.srcAttr + triplet.attr < triplet.dstAttr) {
Iterator((triplet.dstId, triplet.srcAttr + triplet.attr))
} else {
Iterator.empty
}
},
(a, b) => math.min(a, b)
)
println(sssp.vertices.collect.mkString("\n"))