Java JGraphT具有数百万个动态节点/边缘的良好性能/存储

Java JGraphT具有数百万个动态节点/边缘的良好性能/存储,java,kotlin,graph,shortest-path,jgrapht,Java,Kotlin,Graph,Shortest Path,Jgrapht,我试图在一个有一百万个节点的图中找到最短路径。平均而言,每个节点可能有20条定向边,因此它相当大 除此之外,是否有实时(动态)调整边缘权重的方法 我的意思是,我希望能够通过一个时间参数对图形进行路由。根据该时间参数,它将用某个量乘以边权重 您可能有以下数据: 节点A 节点B 重量为5的边缘1(A至B) 重量为3的边缘2(也从A到B) 我可以调用一个函数: graph.getShortestPath(A, B, 8) // From node A to B at 8am graph.getSh

我试图在一个有一百万个节点的图中找到最短路径。平均而言,每个节点可能有20条定向边,因此它相当大

除此之外,是否有实时(动态)调整边缘权重的方法

我的意思是,我希望能够通过一个时间参数对图形进行路由。根据该时间参数,它将用某个量乘以边权重

您可能有以下数据:

  • 节点A
  • 节点B
  • 重量为5的边缘1(A至B)
  • 重量为3的边缘2(也从A到B)
我可以调用一个函数:

graph.getShortestPath(A, B, 8) // From node A to B at 8am
graph.getShortestPath(A, B, 16) // From node A to B at 4pm
时间参数会影响边权重。当遍历一条边时,我想确定该边的位置,并将其权重乘以一个依赖于时间参数的因子


Java(或者更好的Kotlin)中是否有一个简单的JGraphT示例可以说明这一点?

在如此大的图形上依赖于时间的路由不是一件容易的事情,尤其是当您正在寻找动态更新时。这需要高度复杂的算法和存储方法。毫不奇怪,关于这个话题的学术文献有很多

对于jgrapht,首先阅读。接下来,看看jgrapht中当前包含的各种功能。有关如何使用它们的示例,请参阅。您可能需要使用一种压缩层次算法。您需要支付初始成本来执行算法的初始化,但随后在大型图上进行的最短路径查询速度非常快。 为了更快地存储图形,您可能需要在jgrapht opt包中尝试优化的稀疏图形表示


目前没有一种算法提供一些增量机制来处理动态权重变化。此外,与时间相关的算法目前不包括在内。您可以做的是为图形创建多个时间快照,例如每15分钟创建一个行驶速度快照。当计算从9.05开始的路线的最短路径时,您将使用9.15快照来近似旅行时间。对于快照,请使用视图,通过该视图可以为同一基础图提供不同的加权视图。

在如此大的图上进行时间相关路由并非易事,尤其是在您正在寻找动态更新时。这需要高度复杂的算法和存储方法。毫不奇怪,关于这个话题的学术文献有很多

对于jgrapht,首先阅读。接下来,看看jgrapht中当前包含的各种功能。有关如何使用它们的示例,请参阅。您可能需要使用一种压缩层次算法。您需要支付初始成本来执行算法的初始化,但随后在大型图上进行的最短路径查询速度非常快。 为了更快地存储图形,您可能需要在jgrapht opt包中尝试优化的稀疏图形表示


目前没有一种算法提供一些增量机制来处理动态权重变化。此外,与时间相关的算法目前不包括在内。您可以做的是为图形创建多个时间快照,例如每15分钟创建一个行驶速度快照。当计算从9.05开始的路线的最短路径时,您将使用9.15快照来近似旅行时间。对于快照,请使用视图,通过该视图可以提供相同基础图的不同加权视图。

谢谢Joris-完美答案。即使我不能完全做我想做的,这也是下一个最好的事情。谢谢你在这个项目上所做的一切!谢谢Joris-完美的答案。即使我不能完全做我想做的,这也是下一个最好的事情。谢谢你在这个项目上所做的一切!