【问题标题】:AI: Fastest algorithm to find if path exists?AI:查找路径是否存在的最快算法?
【发布时间】:2013-03-08 15:38:15
【问题描述】:

我正在寻找一种寻路算法,用于 AI 控制 2D 网格中的实体,该实体需要找到从 A 到 B 的路径。它不一定是最短路径,但需要非常快速地计算.网格是静态的(从不改变),一些网格单元被障碍物占据。

我目前正在使用 A*,但它对于我的目的来说太慢了,因为它总是试图计算最快的路径。主要的性能问题发生在路径不存在时,在这种情况下 A* 将尝试探索太多的单元格。

如果路径不必是最短路径,我是否可以使用其他算法找到比 A* 更快的路径?

谢谢,

发光

【问题讨论】:

  • 当路径不存在时,基本的深度优先搜索可能比 A* 更快,尽管它具有相同的复杂性。原因是它的代码更简单。希望有更好的东西。
  • 您可以将 A* 与不可允许的启发式一起使用,这样会更好。但总的来说,您必须提供更多信息才能获得好的答案。从来没有最快的算法。
  • 如果不知道实际路径就知道路径是否存在,你会满意吗? (或者你可以用你的 A* 来避免它搜索不存在的路径吗?)

标签: algorithm artificial-intelligence path-finding a-star


【解决方案1】:

假设您的网格是静态的并且不会改变。您可以在构建网格后计算一次图表的连通分量。

然后您可以轻松检查源顶点和目标顶点是否在组件内。如果是,则执行 A*,如果不是,则不执行,因为组件之间不能存在路径。

您可以使用 BFS 或 DFS 获取图的连通分量。

【讨论】:

    【解决方案2】:

    要找到 a 路径而不是最短路径,请使用任何图遍历(例如深度优先或最佳优先)。它不一定会更快,实际上它可能会在某些图表上检查比 A* 更多的节点,因此这取决于您的数据。但是,它会更容易实现,并且常数因子会显着降低。

    为了避免在没有路径的情况下搜索路径,您可以创建disjoint sets(在您构建图表后)以非常快速检查两个给定点是否连接。这需要线性空间和线性时间来构建,查找需要分摊的几乎恒定的时间,但您有时仍需要运行完整的算法,因为它只会告诉您是否有路径,不是那条路的去向。

    如果您已经预先构建了数据结构,并且在运行时有更多的时间和空间来换取即时最短路径,那么您也可以大吃一惊: Floyd-Warshall algorithm 在相对适中的 O(|V|^3) 时间内为您提供所有最短路径,考虑到有 |V|²(起点、终点)对,这是最划算的。它计算一个|V| * |V| 矩阵,它可能有点大,但考虑到这是一个整数矩阵,您只需要|V| * |V| * log_2 |V| 位(例如,对于 1024 个顶点,这是 1.25 MiB)。

    【讨论】:

      【解决方案3】:

      您可以使用DFSBFS,因为您只想知道两个顶点是否相连。两种算法都在O(|V|) 中运行,其中V 是图中所有顶点的集合。

      如果您的启发式算法需要一些重要的时间来计算,请使用这两种算法中的任何一种,否则我认为 A* 的运行应该与 DFS 或 BFS 相似或更好。

      作为另一个选项,您可以使用Floyd-Warshall algorithm (O(V^3)) 在创建网格后计算每对顶点之间的最短距离路径,从而在模拟开始时完成所有繁重的工作然后将 O(1) 访问的所有最短路径存储在散列中,或者如果这证明内存爆炸性太大,您可以保留一个矩阵 next 以便 next[i][j] 存储我们必须从该处出发的顶点顶点i 到顶点j。因此我们可以构建从ijas (i, k1=next[i][j]), (k1, k2=next[k1][j]) ... (kr, j) 的路径

      【讨论】:

      • Floyd-Warshall 是 O(V^3) 时间和 O(V^2) 空间。当 V 达到 10^6 时,它实际上是不可用的
      • @nhahtdh 是的,这就是我将 Floyd-Warshall 作为一个选项,具体取决于您拥有的图表和约束。否则应使用 A*、DFS 或 BFS。
      【解决方案4】:

      如果图表足够小,您可以使用Floyd-Warshall algorithm 预先计算所有最短路径。这需要O(|V|²) 内存来存储路径,并需要O(|V|³) 时间来进行预计算。

      显然,对于非常大的图表,这不是一个选项。对于那些您应该使用 Thomas 的答案并预先计算连接的组件(需要线性时间和内存)以避免最昂贵的 A* 搜索。

      【讨论】:

        【解决方案5】:

        A*、BFS、DFS 和所有其他搜索算法在没有路径时都必须检查完全相同数量的节点,因此“首先使用 DFS” 不是一个好的答案。而使用 Floyd-Warshall 是完全不必要的。

        对于静态图,解决方案很简单;请参阅@Thomas 的回答。对于非静态图,问题更复杂;请参阅this answer 了解一个好的算法。

        【讨论】:

          【解决方案6】:

          如果您的迷宫永远不会改变并且任何存在的路径永远存在,您是否可以不使用映射算法来找到迷宫的“区域”并以某种格式存储它们?内存使用量与节点或单元的数量呈线性关系,速度是访问和比较数组的两个元素的速度。

          计算(分割到区域)可能会更耗时,但它在一开始就完成了一次。也许你可以为此目的调整一些洪水填充算法?

          不确定从上面是否清楚,但我认为一个例子总是有帮助的。希望您能原谅我使用 PHP 语法。

          示例(迷宫 5x5)([] 标记障碍物):

              0 1 2 3 4
            +----------+
          0 |[][]   2  |
          1 |  [][]    |
          2 |    []  []|
          3 |  1 []    |
          4 |    []    |
            +----------+
          

          索引区域(使用数字哈希而不是 'x:y' 可能会更好):

          $regions=array(
              '0:1'=>1,'0:2'=>1,'0:3'=>1,'0:4'=>1,'1:2'=>1,'1:3'=>1,'1:4'=>1,
              '2:0'=>2,'3:0'=>2,'3:1'=>2,'3:2'=>2,'3:3'=>2,'3:4'=>2,'4:0'=>2,
              '4:1'=>2,'4:3'=>2,'4:4'=>2
          );
          

          那么你的任务就是找出你的起点和终点是否在同一个区域:

          if ( $regions[$startPoint] == $regions[$endPoint] )
              pathExists();
          



          现在,如果我没记错的话,A* 复杂度(速度)取决于起点和终点之间的距离(或解决方案的长度),这也许可以用来加快您的搜索速度。

          我会尝试在迷宫中创建一些“连接节点”(JN)。这些可以位于一个函数上(快速知道最近的 JN 在哪里),并且您将预先计算所有相邻 JN 之间的路径。

          那么你只需要搜索从起点到最近的 JN 以及从终点到最近的 JN 的解决方案(它们都在同一个区域中(以上))。现在我可以看到一个场景(如果在迷宫的复杂性方面没有很好地选择函数),它有几个区域,其中一些可能根本没有 JN 或者你所有的 JN 落在迷宫中的障碍物上......所以如果可能的话,最好手动定义那些 JN 或使这个 JN 放置函数非微不足道的(考虑到每个区域的面积)。

          一旦您到达 JN,您可能会将它们之间的路径编入索引(以快速检索开始和结束 JN 之间的预定义路径)或执行另一个 A* 寻路,除了这次只在“连接节点”集上 - 因为在 JN 之间的路径搜索会更快。

          【讨论】:

            【解决方案7】:

            您可以考虑使用 Anytime A* 算法(ANA* 或其他变体)。

            这些将首先执行贪婪的最佳优先搜索以找到初始路径。

            然后它将通过运行启发式函数的权重越来越小来进行渐进式改进。

            您可以随时取消搜索并获取目前找到的最佳路径。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-09-05
              • 1970-01-01
              • 2016-11-28
              • 1970-01-01
              • 2011-09-03
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多