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

问题描述

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

除此之外,是否可以实时(动态)调整边缘权重?

我的意思是我希望能够通过时间参数路由图形。根据该时间参数,它会将边缘权重乘以一定量。

您可能有以下数据:

  • 节点A
  • 节点B
  • 第1边缘(A到B)的权重为5
  • 第2边缘(也从A到B)的权重为3

我可以调用一个函数

graph.getShortestPath(A,B,8) // From node A to B at 8am
graph.getShortestPath(A,16) // From node A to B at 4pm

时间参数将影响边缘权重。例如。遍历边缘时,我想确定该边缘的位置,并将其权重乘以取决于时间参数的因数。

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

解决方法

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

对于jgrapht,请先阅读user guide。接下来,看看jgrapht中当前包含的各种Shortest Path Algorithms。有关如何使用它们的示例,请参见test classes。您可能想使用一种收缩层次算法。您需要支付初始费用来执行算法的初始化,但是随后在大型图上执行最短路径查询的速度确实非常快。 为了更快地存储图形,您可能需要在jgrapht-opt软件包中尝试优化的稀疏图形表示形式。

当前,没有一种算法提供某种增量机制来处理动态权重变化。而且,当前不包括与时间有关的算法。您可以做的是为图表创建多个时间快照,例如每15分钟拍摄一次行驶速度快照。当计算从9.05开始的路线的最短路径时,可以使用9.15快照来估算行驶时间。对于快照,请使用AsWeightedGraph视图,通过该视图可以为同一基础图提供不同的加权视图。