Graphx 最短路徑原始碼解析

2021-09-11 00:11:51 字數 4197 閱讀 7289

下面主要是對spark圖計算框架graphx中的單源點最短路徑的原始碼進行解析。

test("shortpaths")         // 構造有向圖        val edges = sc.parallelize(edgeseq).

map         val graph = graph.fromedgetuples(edges, 1)        // 要求最短路徑的點集合        val landmarks = seq(1, 4).

map(_.tolong)        // 計算最短路徑        val results = shortestpaths.run(graph, landmarks).vertices.collect.

map         // 與真實結果對比        assert(results.toset === shortestpaths)    }

package org.apache.spark.graphx.lib    import org.apache.spark.graphx._    import scala.reflect.classtag    object

shortestpaths         // 比較源頂點屬性和傳送資訊過來頂點的屬性取最小值。

private

def addmaps(spmap1: spmap, spmap2: spmap): spmap =        // 先將兩個集合spmap1和spma2的頂點整合要一起,這裡用了乙個++來處理

// 再形成乙個新的k->v的map

// 其中v是兩個訊息中值最小的乙個        (spmap1.keyset ++ spmap2.keyset).map .tomap        // 計算給定了起始和終點序列的最短路徑

// ed是邊的屬性值,計算過程中不會被使用

// graph是要計算最短路徑的圖

// landmarks是要求最短路徑頂點id的集合,最短路徑會計算每乙個landmark

// 返回的是乙個圖,每個頂點的屬性就是landmark點間的最短路徑

def run[vd, ed: classtag](graph: graph[vd, ed], landmarks: seq[vertexid]): graph[spmap, ed] =         // 定義乙個initmessage它的值為map()

// 作用是在pregel第一次執行的時候,所有圖中的頂點都會接收到initmessage。

val initialmessage = makemap()        // 使用者定義的頂點程式執行在每乙個頂點中,負責接收進來的資訊,和計算新的頂點值。

// 在第一次迭代的時候,所有的頂點程式將會被預設的defaultmessage呼叫,在次輪迭代中,頂點程式只有接收到message才會被呼叫。

def vertexprogram(id: vertexid, attr: spmap, msg: spmap): spmap =         // 該函式應用於鄰居頂點在當前迭代中接收message

// 一旦收到通知,相對於傳送該訊息的點,就是目的節點,相對於收到訊息的點就是源節點

// 這個地方從源節點考慮

def sendmessage(edge: edgetriplet[spmap, _]): iterator[(vertexid, spmap)] =         // 呼叫pregel函式

// 第乙個引數列表包含配置引數初始訊息、最大迭代數、傳送訊息的邊的方向(預設是沿邊方向出)

// 第二個引數列表包含使用者 自定義的函式用來接收訊息(vprog)、計算訊息(sendmsg)、合併訊息(mergemsg)        pregel(spgraph, initialmessage)(vertexprogram, sendmessage, addmaps)        }    }

graphx最短路徑求解中使用了pregel模型,這是乙個非常高效的圖計算模型。但目前最短路徑有如下限制:

只能用於非帶權圖(權值相等);

利用的演算法是迪傑斯特拉求解最短路徑。

相關討論:[1]、[2]、[3]、[4]

【完】再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!

下面主要是對spark圖計算框架graphx中的單源點最短路徑的原始碼進行解析。

test("shortpaths")         // 構造有向圖        val edges = sc.parallelize(edgeseq).

map         val graph = graph.fromedgetuples(edges, 1)        // 要求最短路徑的點集合        val landmarks = seq(1, 4).

map(_.tolong)        // 計算最短路徑        val results = shortestpaths.run(graph, landmarks).vertices.collect.

map         // 與真實結果對比        assert(results.toset === shortestpaths)    }

package org.apache.spark.graphx.lib    import org.apache.spark.graphx._    import scala.reflect.classtag    object

shortestpaths         // 比較源頂點屬性和傳送資訊過來頂點的屬性取最小值。

private

def addmaps(spmap1: spmap, spmap2: spmap): spmap =        // 先將兩個集合spmap1和spma2的頂點整合要一起,這裡用了乙個++來處理

// 再形成乙個新的k->v的map

// 其中v是兩個訊息中值最小的乙個        (spmap1.keyset ++ spmap2.keyset).map .tomap        // 計算給定了起始和終點序列的最短路徑

// ed是邊的屬性值,計算過程中不會被使用

// graph是要計算最短路徑的圖

// landmarks是要求最短路徑頂點id的集合,最短路徑會計算每乙個landmark

// 返回的是乙個圖,每個頂點的屬性就是landmark點間的最短路徑

def run[vd, ed: classtag](graph: graph[vd, ed], landmarks: seq[vertexid]): graph[spmap, ed] =         // 定義乙個initmessage它的值為map()

// 作用是在pregel第一次執行的時候,所有圖中的頂點都會接收到initmessage。

val initialmessage = makemap()        // 使用者定義的頂點程式執行在每乙個頂點中,負責接收進來的資訊,和計算新的頂點值。

// 在第一次迭代的時候,所有的頂點程式將會被預設的defaultmessage呼叫,在次輪迭代中,頂點程式只有接收到message才會被呼叫。

def vertexprogram(id: vertexid, attr: spmap, msg: spmap): spmap =         // 該函式應用於鄰居頂點在當前迭代中接收message

// 一旦收到通知,相對於傳送該訊息的點,就是目的節點,相對於收到訊息的點就是源節點

// 這個地方從源節點考慮

def sendmessage(edge: edgetriplet[spmap, _]): iterator[(vertexid, spmap)] =         // 呼叫pregel函式

// 第乙個引數列表包含配置引數初始訊息、最大迭代數、傳送訊息的邊的方向(預設是沿邊方向出)

// 第二個引數列表包含使用者 自定義的函式用來接收訊息(vprog)、計算訊息(sendmsg)、合併訊息(mergemsg)        pregel(spgraph, initialmessage)(vertexprogram, sendmessage, addmaps)        }    }

graphx最短路徑求解中使用了pregel模型,這是乙個非常高效的圖計算模型。但目前最短路徑有如下限制:

只能用於非帶權圖(權值相等);

利用的演算法是迪傑斯特拉求解最短路徑。

相關討論:[1]、[2]、[3]、[4]

【完】

最短路徑演算法原始碼 VB

本人載 開發gis,遊自編的最短路徑查詢程式,速度特快,3萬節點,35000條路全部遍歷,只需1秒。現將最短路徑的思路告訴大家,希望大家在優化,並用不同語言編制,我正在學delphi,準備用delphi做成庫,本例以由拓撲關係的arc info 檔案為資料來源。其中a1,b1,c1是以fnode排序...

最短路徑演算法原始碼 VB

public function shortpath startno as integer,endno as integer as single 以開始點,結束點為引數。dim result as single dim result1 as integer 定義結果點 dim s1 as single...

關鍵路徑與最短路徑解析

1.最短路徑 如果從某頂點出發,這個頂點稱為源點,經圖的邊到達另一頂點,這個頂點稱為終點,所經過的路徑不止一條,找出一條路徑使的沿此路徑上各邊的權值之和為最小。從源點到終點走得最短的路線權值之和 預設為1 2.關鍵路徑 採用邊表示活動 activity on edge 網路,簡稱aoe網路。每個頂點...