Performance 寻路:如何有效地检查路径是否可行?

Performance 寻路:如何有效地检查路径是否可行?,performance,path-finding,dijkstra,Performance,Path Finding,Dijkstra,我使用Dijkstra算法来求解理想路径。作为程序的一部分,该算法被调用了数千次 超过一半的时间路径是不可能的,Dijkstra的需要很长的时间才能弄清楚这一点(在一个小测试中,可能的路径总共用了2秒钟就解决了,而不可能的路径总共用了25秒钟。) 因此,我想知道是否有一种方法可以非常有效地检查是否有可能在浪费时间使用该算法之前找到两个节点之间的路径。有什么非常有效的方法可以做到这一点吗 谢谢, Dan是否在同一个图形上运行多路径查找?如果是这样,则需要从图形中维护一组不相交的连续空格。这可以通过

我使用Dijkstra算法来求解理想路径。作为程序的一部分,该算法被调用了数千次

超过一半的时间路径是不可能的,Dijkstra的需要很长的时间才能弄清楚这一点(在一个小测试中,可能的路径总共用了2秒钟就解决了,而不可能的路径总共用了25秒钟。)

因此,我想知道是否有一种方法可以非常有效地检查是否有可能在浪费时间使用该算法之前找到两个节点之间的路径。有什么非常有效的方法可以做到这一点吗

谢谢,
Dan

是否在同一个图形上运行多路径查找?如果是这样,则需要从图形中维护一组不相交的连续空格。这可以通过以下方式实时完成:

  • 从每个不成功的路径确定中保持连续空间,作为从起始节点开始的完整闭合集
  • 构造一种数据结构,该数据结构能够在计算后对连续空间进行有效搜索;及
  • 在每个路径确定之前,确定起始节点和目标节点是否位于相同的已知连续空间、两个不同的连续空间或未知空间中

  • (2)的精确最佳机制与图形的性质密切相关,因此我将其留给另一个问题。

    是否在同一个图形上运行多路径查找?如果是这样,则需要从图形中维护一组不相交的连续空格。这可以通过以下方式实时完成:

  • 从每个不成功的路径确定中保持连续空间,作为从起始节点开始的完整闭合集
  • 构造一种数据结构,该数据结构能够在计算后对连续空间进行有效搜索;及
  • 在每个路径确定之前,确定起始节点和目标节点是否位于相同的已知连续空间、两个不同的连续空间或未知空间中

  • (2)的精确最佳机制与图形的性质密切相关,因此我将其留给另一个问题。

    无约束,一次性使用

    在没有约束的图形上,程序以前从未见过(甚至以前的一部分),以后也不会再看到。你唯一能做的就是广度优先搜索或深度优先搜索

    如果内存是问题,可以考虑使用增量深度优先搜索。

    您可以考虑在图形上启动多个线程来查看不同的分支。您需要进行协调,这样他们就不会重复工作,因为他们都可以安全地检查和写入并发共享数据结构。有了并发,您可以让一些线程从头到尾搜索,而另一些线程从头到尾搜索

    在具有循环的图上,您可能希望将节点标记为已访问,以便不执行无限循环

    限制,一次性使用

    想想你的图表和你的目标

    图是稠密的还是稀疏的

    是否存在负边权重?负和循环

    它遵循梯形法则吗

    是否有一个你不在乎是否有路径的最大距离

    这个图是非循环的吗

    图表“简单”吗

    通过一些工作,您可能能够找到一种比dfs更好的用于图形的方法。其他时候,您可能能够以不同的方式构造图形,从而加快dfs的速度。有时,优势可能来自搜索过程中不必存储那么多数据

    多用途约束

    如果值得的话,您可以运行Floyd Warshall来求解每对节点之间的最短路径。该算法可能需要一些时间,但如果您只需在关键区域中查找最短路径,则可能会有好处

    您可以通过在图形上执行初始dfs来预解连接组件,而不是预解最短路径

    如果图形可以更改,但不会急剧更改,那么您可以简单地修改预先计算的结果,而不是每次都从头开始

    最后的想法


    图形的大小和复杂性是重要的考虑因素。对于小型密集连接图的最佳算法对于大型稀疏图或树是不同的。

    无约束,一次性使用

    在没有约束的图形上,程序以前从未见过(甚至以前的一部分),以后也不会再看到。你唯一能做的就是广度优先搜索或深度优先搜索

    如果内存是问题,可以考虑使用增量深度优先搜索。

    您可以考虑在图形上启动多个线程来查看不同的分支。您需要进行协调,这样他们就不会重复工作,因为他们都可以安全地检查和写入并发共享数据结构。有了并发,您可以让一些线程从头到尾搜索,而另一些线程从头到尾搜索

    在具有循环的图上,您可能希望将节点标记为已访问,以便不执行无限循环

    限制,一次性使用

    想想你的图表和你的目标

    图是稠密的还是稀疏的

    是否存在负边权重?负和循环

    它遵循梯形法则吗

    是否有一个你不在乎是否有路径的最大距离

    这个图是非循环的吗

    图表“简单”吗

    通过一些工作,您可能能够找到一种比dfs更好的用于图形的方法。其他时候,您可能能够以不同的方式构造图形,从而加快dfs的速度。有时,优势可能来自搜索过程中不必存储那么多数据

    多用途约束