JUNG 计算图属性,中心度,偏心率,直径,半径

2024-01-07 15:10

本文主要是介绍JUNG 计算图属性,中心度,偏心率,直径,半径,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文介绍利用Java的第三方API JUNG 计算图中:

closeness centrality;// 图中某节点的 接近中心性/亲密中心性

betweenness centrality;// 图中某节点的 中介中心性/介数中心性

distance;  // 图中两节点的最短距离

eccentricity;  // 图中某节点的 偏心率/离心率

radius;   //  半径

diameter.  // 直径

 


 

JUNG 下载地址

 

https://sourceforge.net/projects/jung/files/

 

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

在图论中,顶点v偏心率(eccentricity),用来表示连接图G中的顶点v到图G中其它顶点之间的最大距离。

 

 /*** 偏心率.* * @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;}

 

 

 

 

转载于:https://www.cnblogs.com/standingby/p/9148165.html

这篇关于JUNG 计算图属性,中心度,偏心率,直径,半径的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/580325

相关文章

解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题

《解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题》在Spring开发中,@Autowired注解常用于实现依赖注入,它可以应用于类的属性、构造器或setter方法上,然... 目录1. 为什么 @Autowired 在属性上被警告?1.1 隐式依赖注入1.2 IDE 的警告:

HTML5中下拉框<select>标签的属性和样式详解

《HTML5中下拉框<select>标签的属性和样式详解》在HTML5中,下拉框(select标签)作为表单的重要组成部分,为用户提供了一个从预定义选项中选择值的方式,本文将深入探讨select标签的... 在html5中,下拉框(<select>标签)作为表单的重要组成部分,为用户提供了一个从预定义选项中

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程

《在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程》本文介绍了在Java中使用ModelMapper库简化Shapefile属性转JavaBean的过程,对比... 目录前言一、原始的处理办法1、使用Set方法来转换2、使用构造方法转换二、基于ModelMapper

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

跨国公司撤出在华研发中心的启示:中国IT产业的挑战与机遇

近日,IBM中国宣布撤出在华的两大研发中心,这一决定在IT行业引发了广泛的讨论和关注。跨国公司在华研发中心的撤出,不仅对众多IT从业者的职业发展带来了直接的冲击,也引发了人们对全球化背景下中国IT产业竞争力和未来发展方向的深思。面对这一突如其来的变化,我们应如何看待跨国公司的决策?中国IT人才又该如何应对?中国IT产业将何去何从?本文将围绕这些问题展开探讨。 跨国公司撤出的背景与