基于JGraphT实现的路径探寻

业务中提出基于内存,探寻的两点间的有向以及无向路径,多点间的最小子图等需求,以下记录使用JGraphT的实现过程。

GraphT是免费的Java类库,提供数学图论对象和算法,本文只涉及路径探寻中的部分内容。

图实例简介

以下资料来源graph-structures

可用图概览

图类 边方向 自环 顶点对间多边 加权
SimpleGraph undirected no no no
Multigraph undirected no yes no
Pseudograph undirected yes yes no
DefaultUndirectedGraph undirected yes no no
SimpleWeightedGraph undirected no no yes
WeightedMultigraph undirected no yes yes
WeightedPseudograph undirected yes yes yes
DefaultUndirectedWeightedGraph undirected yes no yes
SimpleDirectedGraph directed no no no
DirectedMultigraph directed no yes no
DirectedPseudograph directed yes yes no
DefaultDirectedGraph directed yes no no
SimpleDirectedWeightedGraph directed no no yes
DirectedWeightedMultigraph directed no yes yes
DirectedWeightedPseudograph directed yes yes yes
DefaultDirectedWeightedGraph directed yes no yes

结构特性

无向边(undirected edges):一条边只连接一个顶点对,不施加方向。

有向边(directed edges):边具有起点和终点。

自环(self-loops):是否允许顶点的边连接到自身。

同向多边(multiple edges):是否在同一顶点对之间存在多个边(有向图中,同一顶点对之间,方向相反的两条边不计为多边)。

加权(weighted):边是否具有浮点值权重(对于该类图,通常用DefaultWeightedEdge作边类型),

未加权图被视为有统一的边权重1.0,这使它们可以用于算法中,例如查找最短路径。

业务类

抽象顶点类

public class Node{

    //顶点id
private String id; ...
}

抽象边缘类

public class Link{

    //边缘id
private String id; //起始点id
private String source; //终止点id
private String target; ...
}

抽象图数据类

public class GraphDescription{

    //顶点集合
private List<Node> nodes; //边缘集合
private List<Link> links; ...
}

两点有向路径探寻

使用业务中的UID(String)作为顶点类,边构造使用默认边类DefaultEdge。

Graph<String, DefaultEdge> directedGraph = new DirectedMultigraph<>(DefaultEdge.class);

graphDescription.getNodes().forEach(node -> directedGraph.addVertex(node.getId()));

graphDescription.getLinks().forEach(link -> directedGraph.addEdge(link.getSource(), link.getTarget()));

最短路径探寻,先找出有向最短路径长度,最短路径长度小于限制时,按照最短路径跳数找出所有非自环路径

DijkstraShortestPath<String, DefaultEdge> dijkstraAlg = new DijkstraShortestPath<>(directedGraph);

GraphPath<String, DefaultEdge> shorest = dijkstraAlg.getPath(start, end);

if (shorest != null && shorest.getLength() <= hopsLimit) {

 AllDirectedPaths allPaths = new AllDirectedPaths(directedGraph);

 fullRes = allPaths.getAllPaths(start, end, true, shorest.getLength());

}

全路径探寻,按照跳数限制直接探寻结果

AllDirectedPaths allPaths = new AllDirectedPaths(directedGraph);

fullRes = allPaths.getAllPaths(start, end, true, hopsLimit);

两点无向路径探寻

我们构造支持无向及多边的Multigraph

Graph<String, DefaultEdge> multiGraph = new Multigraph<>(DefaultEdge.class);

graphDescription.getNodes().forEach(node -> graph.addVertex(node.getId()));

graphDescription.getLinks().forEach(link -> graph.addEdge(link.getSource(), link.getTarget()));

无向路径探寻类似于有向步骤,确认最短路径跳数探寻,结果数限制k设置为整型最大值

BidirectionalDijkstraShortestPath<String, DefaultEdge> dijkstraAlg = new BidirectionalDijkstraShortestPath<>(multiGraph);

GraphPath<String, DefaultEdge> shorest = dijkstraAlg.getPath(start, end);

if (shorest != null && shorest.getLength() <= hopsLimit) {

    KShortestSimplePaths simplePaths = new KShortestSimplePaths(multiGraph, shorest.getLength());

    fullRes = simplePaths.getPaths(start, end, Integer.MAX_VALUE);
}

全路径探寻,按照跳数限制直接探寻结果

KShortestSimplePaths simplePaths = new KShortestSimplePaths(graph, hopsLimit);

fullRes = simplePaths.getPaths(start, end, Integer.MAX_VALUE);

多点最小子图探寻

基于MultiGraph,多个点形成的集合,与自身作笛卡尔积,两两探寻最短路径后加入fullRes并去重,形成的边集即为最小子图。

基于JGraphT实现的路径探寻的更多相关文章

  1. Mininet实验 基于Mininet实现BGP路径挟持攻击实验

    参考:基于Mininet实现BGP路径挟持攻击实验 实验目的: 掌握如何mininet内模拟AS. 掌握BGP路径挟持的原理和分析过程. 实验原理: 互联网是由相互连接的自治系统AS组成的,通过一个通 ...

  2. 4.6 基于STM32+MC20地图显示路径功能

    需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...

  3. C#路径总结

    [相对路径]   Request.ApplicationPath /src Path.GetDirectoryName(HttpContext.Current.Request.RawUrl ) //s ...

  4. 【转】 ASP.NET网站路径中~(波浪线)解释

    刚开始学习ASP.NET的朋友可能会不理解路径中的-符代表什么,例如ImageUrl=”~/Images/SampleImage.jpg” 现在我们看看-代表什么意思.-是ASP.NET 的Web 应 ...

  5. asp.net后台获取路径的各种方法归纳

    asp.net后台获取路径的各种方法归纳   1.Request.CurrentExecutionFilePath    获取当前请求的虚拟路径,不同于 FilePath,差别在于如果请求已在服务器代 ...

  6. 使用Class.getResource和ClassLoader.getResource方法获取文件路径

    自从转投Java阵营后,一直发下Java程序的路径读取异常麻烦,因此查阅了比较多的版本内容,整合了一份自己的学习笔记.主要使用Class及通过ClassLoader来动态获取文件路径. 查阅链接如下: ...

  7. 关于ASP.Net中路径的问题

    比如你的工程是Webapplication1(url是:http://localhost/webapplication1/webform1.aspx) Request.ApplicationPath ...

  8. Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_1

    以下是一些设计略显繁琐,有必要清除思维. 下一个主要的成就,当我们点击Gobutton后,得到一个随机数骰子,是走了几步,它是基于以下步骤行走路径的数目,然后移动位置的基于角色的路径. 流程如图普遍认 ...

  9. 一种基于路网图层的GPS轨迹优化方案

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 GPS数据正常情况下有20M左右的偏移,在遇到高楼和桥梁等情况 ...

随机推荐

  1. H3C 典型物理层标准和设备

  2. java框架之shiro

    #shiro简介 一.简介 Apache Shiro 是一个强大而灵活的开源安全框架,可以用于应用程序的身份验证,授权,会话管理和加密. Authentication:有时也简称为“登录”,这是一个证 ...

  3. gSOAP calc服务端与客户端示例

    1. Web服务定义描述头文件 typedef double xsd__double; int ns__add(xsd__double a, xsd__double b, xsd__double &a ...

  4. 通俗理解tf.name_scope()、tf.variable_scope()

    前言:最近做一个实验,遇到TensorFlow变量作用域问题,对tf.name_scope().tf.variable_scope()等进行了较为深刻的比较,记录相关笔记:tf.name_scope( ...

  5. C# 强转会不会抛出异常

    最近遇到一个小伙伴问我,从一个很大的数强转,会不会抛出异常.实际上不会出现异常 最简单的代码是使用一个比 maxvalue 大的数,然后用它强转 long tathkDucmmsc = int.Max ...

  6. [转载]Eclipse luna tomcat 控制台 中文乱码

    http://hahalzb.iteye.com/blog/709109 今天做S2SH集成的例子,所有该设置的地方都设置成了UTF-8,包括tomcat的配置文件server.xml.web.xml ...

  7. 四叶草(css)

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <style> . ...

  8. P1097 方程的整数解

    题目描述 给定一个整数N,求方程 \(x^3-x^2-x=N\) 的整数解. 保证解的范围在 \([-100,100]\) 范围内. 输入格式 一行一个整数 \(N(-10^6<=N<=1 ...

  9. linux进程唤醒的细节

    我们已展现的唤醒进程的样子比内核中真正发生的要简单. 当进程被唤醒时产生的真正动 作是被位于等待队列入口项的一个函数控制的. 缺省的唤醒函数[22]22设置进程为可运行的 状态, 并且可能地进行一个上 ...

  10. 【t056】智力问答(multiset做法)

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 新年联欢会上,G.Sha负责组织智力问答节目.G.Sha建立了一个很大很大的超级题库,并衡量了每道题的 ...