JUNG 計算圖屬性,相關度
阿新 • • 發佈:2018-06-07
遍歷 title 轉化 -s sta 第三方 進行 ddl ali
本文介紹利用Java的第三方API JUNG 計算圖中:
closeness centrality;// 圖中某節點的 接近中心性/親密中心性
betweenness centrality;// 圖中某節點的 中介中心性/介數中心性
distance; // 圖中兩節點的最短距離
eccentricity; // 圖中某節點的 偏心率/離心率
radius; // 半徑
diameter. // 直徑
JUNG api參考文檔:
http://jung.sourceforge.net/doc/api/overview-summary.html
預處理
JUNG 中的計算方法基於JUNG內置圖類,本文基於自定義圖計算圖屬性,故需要先將自定義圖轉存為JUNG圖對象。
JUNG 提供 泛型接口,進行轉化或創建時利用自定義邊類型與節點類型即可。
以以下代碼為例:
/** * 將graph.Graph 轉為 JUNG.graph.Graph 過濾掉超邊. * * @param g - 基於 graph.Graph * @return edu.uci.ics.jung.graph.Graph */ public static edu.uci.ics.jung.graph.Graph<Vertex, Edge> graphTransform(Graph<Vertex, Edge> g) { edu.uci.ics.jung.graph.Graph<Vertex, Edge> graph = new SparseGraph<>(); // 稀疏圖 for (Vertex vertex : g.vertices()) { graph.addVertex(vertex); } for (Edge edge : g.edges()) { if (edge.sourceVertices().size() == 0) { // 超邊 continue; }if (edge.sourceVertices().size() == 1) { // 有向邊 graph.addEdge(edge, getVertex(edge.sourceVertices()), getVertex(edge.targetVertices()), EdgeType.DIRECTED); } else { // 無向邊 Vertex existV = getVertex(edge.vertices()); graph.addEdge(edge, existV, getVertexExcept(edge.vertices(), existV), EdgeType.UNDIRECTED); } } return graph; }
如此,獲得一個jung 圖對象。
Closeness Centrality
/** * 計算圖g中節點v的 closeness centrality. * * @param g - to be calculate. * @param v - central vertex. * @return closeness centrality. */ public static double closenessCentrality(Graph<Vertex, Edge> g, Vertex v) { edu.uci.ics.jung.graph.Graph<Vertex, Edge> graph = helper.Transformer.graphTransform(g); // 新建計算對象,傳入圖與待計算節點。 ClosenessCentrality<Vertex, Edge> closenessCentrality = new ClosenessCentrality<>(graph, t); // 獲得 closeness centrality. double degree = closenessCentrality.getVertexScore(v); return degree; }
Betweenness Centrality
/** * 計算圖g中節點v的 betweenness centrality. * * @param g - to be calculate. * @param v - central vertex. * * @return betweeness centrality. */ public static double betweennessCentrality(Graph<Vertex, Edge> g, Vertex v) { edu.uci.ics.jung.graph.Graph<Vertex, Edge> graph = helper.Transformer.graphTransform(g); // 新建計算對象,傳入圖與待計算節點。 BetweennessCentrality<Vertex, Edge> betweennessCentrality = new BetweennessCentrality<>(graph, t); // 獲得 betweenness centrality. double degree = betweennessCentrality.getVertexScore(v); return degree; }
Distance (Dijkstra算法)
/** * 節點start和end之間的最短距離(需要區分有向圖和無向圖). * * @param g - to be calculated in. * @param start - from. * @param end - to. * @return distance. */ public static double distance(Graph<Vertex, Edge> g, Vertex start, Vertex end) { edu.uci.ics.jung.graph.Graph<Vertex, Edge> graph = helper.Transformer.graphTransform(g); DijkstraShortestPath<Vertex, Edge> dijkstraShortestPath = new DijkstraShortestPath<>(graph, t); // 計算由start到end的最短路徑,返回值為路徑上的邊組 List<Edge> path = dijkstraShortestPath.getPath(start, end); // 統計總權值 double distance = 0; for (Edge edge : path) { distance += edge.getWeight(); } return distance; }
Eccentricity
在圖論中,頂點的偏心率(eccentricity),用來表示連接圖中的頂點到圖中其它頂點之間的最大距離。
/** * 偏心率. * * @param g - to be calculated. * @param v - central vertex. * @return eccentricity of the specific vertex. */ public static double eccentricity(Graph<Vertex, Edge> g, Vertex v) { double eccentricity = 0; for (Vertex end : g.vertices()) { // 跳過 v 自身 if (v.equals(end)) { continue; } // 計算 distance 並記錄最遠距離 double distance = distance(g, v, end); if (distance > eccentricity) { eccentricity = distance; } } return eccentricity; }
Radius
在圖論中,半徑(radius)表示圖的所有點的偏心率的最小值。
/** * 半徑,即偏心率的最小值. * * @param g - to be calculated. * @return */ public static double radius(Graph<Vertex, Edge> g) { double radius = 2 ^ 10; // 初始極大值 // 遍歷節點計算偏心率,記錄偏心率最小值 for (Vertex vertex : g.vertices()) { double distance = eccentricity(g, vertex); if (radius > distance && distance > 0) { radius = distance; } } return radius; }
Diameter
在圖論中,圖的直徑(diameter),表示取遍圖的所有頂點,得到的偏心率的最大值。
/** * 直徑,即偏心率的最大值. * * @param g - to be calculated. * @return */ public static double diameter(Graph<Vertex, Edge> g) { double diameter = 0; // 遍歷節點計算偏心率,記錄偏心率最大值 for (Vertex vertex : g.vertices()) { double distance = eccentricity(g, vertex); if (diameter < distance) { diameter = distance; } } return diameter; }
JUNG 計算圖屬性,相關度