代码之家  ›  专栏  ›  技术社区  ›  feasega

聚合物模拟-2个节点之间的最短路线,适用于所有节点

  •  1
  • feasega  · 技术社区  · 7 月前

    我目前正在研究聚合物的模型,为了对其进行统计研究,我需要计算聚合物(或本例中的图)中所有不同节点的2个节点之间的拓扑距离(基本上是图中2个节点间的最短距离)。

    现在,对于少于1000个节点的小图,计算是相当可管理的,等待时间不太长,但显然对于较大的图,计算需要数小时到数天才能完成。

    值得注意的是,我的图是稀疏的,如果我们将其简化为一条长链,图中的每条链都连接到其邻居(如耦合振子问题的矩阵),并且一些链也以非常小的概率连接。

    首先,我尝试使用一个显而易见的选择——BFS。它在较小的图形上运行良好,但在较大的图形上花费的时间太长(超过500我会说它不起作用)。

    在那之后,我尝试使用带有欧几里德偏差的蒙特卡洛方法来引导进步的方向,这比BFS有效得多,但结果并不准确,对于许多节点来说,它找不到路径。

    然后,我尝试使用A*算法,该算法的效果出乎意料地好,甚至比蒙特卡洛提供了更好的计算时间,并提供了像BFS这样的结果,这真的让我感到惊讶。

    但由于计算的性质,对于大型图形,例如2000个节点,计算时间几乎为4小时。我最终想对至少5000个节点的图进行计算,10000个节点正是我所需要的。

    我想知道是否有人熟悉适用于这个问题的其他算法?我搜索了类似模型中使用的方法,但没有发现任何明显有用的方法。

    提前感谢!

    1 回复  |  直到 7 月前
        1
  •  2
  •   Matt Timmermans    7 月前

    这个问题被称为“所有对最短路径”。

    一般图表

    对于一般图,传统上用O(n 3. )时间使用 Floyd-Warshall Algorithm ,其中“n”是图中的节点数。

    请注意,所需的空间和产生的输出大小为O(n 2. ). 对于大型图形来说,这是一个很大的输出。由于系统内存的限制,您的最大图形大小可能会达到100000左右。

    还要注意n 3. 生长得相当快。如果你用C或等效语言编写,那么对于一个有1000个节点的图来说,它会非常快(几毫秒),但对于100000个节点来说,可能需要几个小时。如果你用较慢的语言编写,那么它会较慢,但这是一种常见的算法,所以你可能会找到一个快速的库实现。 scipy has one 例如。

    稀疏图形

    对于稀疏图,其中每个节点平均只有几条边,BFS比Floyd Warshall快得多,取O(n 2. )时间。

    与上述情况相比,每个节点的平均边数为4条或更少,您应该能够在几秒钟内计算出100000个节点的所有最短路径长度。

    根据您的描述,听起来您尝试了BFS,但对每对节点分别进行了错误的操作。这比你需要做的工作要多得多,因为从单个源节点进行一次BFS搜索将找到到的最短路径 全部的 其他节点。你只需要同时进行n次搜索。