码迷,mamicode.com
首页 > 其他好文 > 详细

JUNG 计算图属性,相关度

时间:2018-06-07 11:32:25      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:media   ras   pre   static   ice   lan   介绍   ecc   ref   

本文介绍利用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 计算图属性,相关度

标签:media   ras   pre   static   ice   lan   介绍   ecc   ref   

原文地址:https://www.cnblogs.com/standingby/p/9148165.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!