基于JGraphT实现的路径探寻

基于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并去重,形成的边集即为最小子图。

原文地址:https://www.cnblogs.com/miracle9527/p/12182235.html

时间: 2024-10-09 22:01:57

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

基于分层路网的路径规划算法

http://www.docin.com/p-1308678703.html 路径规划一般包括如下几种情况: 最短路径规划 最短时间规划 最经济规划 通过赋予图中的边以不同的权值来满足用户不同的需求 最短路径由于普通道路限速问题,未必是最短时间到达目的地, 可能上高速更快一些 分层思想 对于一个点P,以自身为中心,不断的扩大半径进行搜索,查看当前是否包括一个升级到高层路网的节点 如果有,说明当设置P为起点,然后设置T为终点,而且当distance(pt)> R,说明应该进行路网的升层 选择一个查

基于字符串模式的路由路径的一些示例。

此路由路径将匹配 acd 和 abcd. app.get('/ab?cd', function(req, res) { res.send('ab?cd'); }); 此路由路径将匹配 abcd.abbcd.abbbcd 等. app.get('/ab+cd', function(req, res) { res.send('ab+cd'); }); 此路由路径将匹配 abcd.abxcd.abRABDOMcd.ab123cd 等. app.get('/ab*cd', function(req, r

基于直接地址映射的CMAC神经网络

紧锣密鼓的项目又开始了,经过一番研究准备融合神经网络与增强学习来实现基于FPGA的XX路径规划,越来越觉得这里边需要学的东西太多了,特别是机器学习好深邃啊.之前要在FPGA上实现的BP神经网络准备换成CMAC神经网络了,一开始以为CMAC神经网络挺容易,后来才发现理解起来也不是那么简单,而且与具体应用联系起来时实现起来还是问题重重,主要是在高维输入环境下权值的存取如何来解决,看了Jar-Shone Ker的直接权值地址映射CMAC法(线性收缩阵列法)困扰算是解决了.它采用一种多重权值的存储层接口

activemq+zookeeper 集群部署基于levedb

集群图 zookeeper集群,上一篇博客写了zookeeper集群的部署 Ip 服务注册端口 主机名 192.168.56.15 2181 zk01 192.168.56.16 2181 zk02 192.168.56.17 2181 zk03 activemq部署 IP 管控台端口 集群通讯端口 消息端口 192.168.56.15 8161 61621 51511 192.168.56.16 8162 61622 51512 192.168.56.17 8163 61623 51513 h

基于pgrouting的任意两点间的最短路径查询函数

前面文章介绍了如何利用postgresql创建空间数据库,建立空间索引和进行路径规划.但是在真实的场景中用户进行路径规划的时候都是基于经纬度数据进行路径规划的,因为用户根本不会知道道路上节点的ID.因此文本讲述如何查询任意两点间的最短路径. 一.定义函数名及函数参数 函数名定义为: pgr_fromAtoB 参数设置分别为: 输入为数据库表名,起点和终点的经纬度坐标 输出为:路段序号,gid号,道路名,消耗及道路集合体. IN tbl varchar, --数据库表名 IN x1 double

文件的绝对路径与相对路径

用DW写HTML的时候,可以直接选择到具体文件的路径,现在改用了webstorm,只能选择到与HTML文件同一目录下的文件.就此整理一下文件的绝对路径与相对路径的区别. 1.绝对路径 先说在本地计算机上,文件的绝对路径当然是指:文件在硬盘上真正存在的路径. 例如这个路径:D:/wamp/www/img/icon.jpg告诉我们icon.jpg文件是在D盘的wamp目录下的img子目录中.我们不需要知道其他任何信息就可以根据绝对路径判断出文件的位置. 还有超链接文件位置,也属于绝对路径,例如htt

基于函数的索引

以下内容摘自<Oracle SQL 高级编程> 第12.4.2章节-基于函数的索引[其中代码部分被修改,原始请参考书籍] 如果一个谓语在索引列上应用了函数,则优化器不会选用该列上的索引.例如,对于谓语to_char(CYRQ, 'YYYY-MM-DD') = '2014-01-21',不会选用CYRQ列上的索引,因为在索引列上应用了to_char函数.这个限制可以通过表达式to_char(CYRQ)在创建基于函数的索引来克服.基于函数的索引预存函数的结果.谓语中所声明的表达式必须基于函数的索引

asp.net路径问题

各位有没有碰到在日常工作中经常在路径设置的时候把 "~/ ../ .../ . / .http://www.cnblogs.com/"这些符号搞混搞乱了?偶尔还会因路径的问题郁闷了半天 还以为是程序上出了问题. 比如你的工程是Webapplication1(url是:http://localhost/webapplication1/webform1.aspx) Request.ApplicationPath 就是/Webapplication1 如果是站点就直接返回"/&qu

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

刚开始学习ASP.NET的朋友可能会不理解路径中的-符代表什么,例如ImageUrl=”~/Images/SampleImage.jpg” 现在我们看看-代表什么意思.-是ASP.NET 的Web 应用程序根目录运算符,当您在服务器控件中指定路径时可以使用该运算符.ASP.NET 会将 ~ 运算符解析为当前应用程序的根目录.可以结合使用 ~ 运算符和文件夹来指定基于当前根目录的路径. 下面的示例演示了使用 Image 服务器控件时用于为图像指定根目录相对路径的 ~ 运算符.在此示例中,无论页面位