人工智能中的双向搜索算法

2025年4月6日 | 阅读 7 分钟

双向搜索算法是一种图遍历算法。该算法减少了搜索空间。它通过同时运行两次搜索来实现这一点。一次搜索从起始节点开始,另一次搜索从目标节点开始。搜索在中间停止。这大大减少了所探索的节点数量。在大型图或搜索空间中尤其如此。

双向搜索算法简介

广度优先搜索 (BFS)深度优先搜索 (DFS) 等搜索算法是传统的。它们通常沿一个方向探索整个搜索空间。它从起始节点到目标节点,反之亦然。随着搜索空间大小的增长,这些算法可能会变得低效。双向搜索方法解决了这个问题。它降低了搜索深度。这导致更快的探索。

双向搜索的主要概念是在起始节点和目标节点都进行探索。此搜索一直持续到两者在一个公共节点相遇。这个会合点给出了起始节点和目标节点之间的最佳路径。

双向搜索算法的关键特性

  1. 该算法执行双向搜索。与通常只从头到尾的典型搜索算法不同,双向搜索并非如此。相反,它执行两次单独的搜索。
  2. 请注意:一次搜索从头开始。另一次搜索从尾部开始。
  3. 它们都在中间相遇,并创建最短路径。这确保最短路径始终存在。
  4. 该算法确保效率。它通过将搜索分为两部分来实现。因此,它探索的节点比常规搜索算法少。

双向搜索算法的步骤

以下是使用人工智能实现双向搜索算法的步骤:

初始化

  • 准备两个搜索队列。一个用于从起始节点开始的正向搜索。另一个用于从目标节点开始的反向搜索。
  • 将起始节点添加到正向队列。将目标节点附加到反向队列。创建两个集合来跟踪已访问的节点。一个用于正向搜索,另一个用于反向搜索。

搜索扩展

交替处理节点。在正向搜索和反向搜索之间进行。正向搜索查看从起始节点开始的当前节点的邻居。你必须记住这一点。反向搜索探索从目标节点开始的当前节点的邻居。这在每一步都发生。当你完成此操作时。请务必将探索到的节点添加到已访问集合中。

检查交集

扩展完成后进行检查。查看正向搜索已访问集合中的节点。验证它是否在反向搜索已访问集合中。如果发现重叠,则搜索已相遇。

路径构建

在公共节点相遇时构建路径。构建完整路径。合并从起始节点到公共节点的路径。这是正向搜索。合并从目标节点到公共节点的路径。这是反向搜索。

终止

当正向和反向搜索相遇时,搜索结束。它揭示了起始节点和目标节点之间的最短路径。

双向搜索示例

考虑一个简单的图,我们想找到从节点 A 到节点 G 的最短路径。

步骤 1 (初始化)

  • 正向队列:{A}
  • 反向队列:{G}
  • 正向已访问:{A}
  • 反向已访问:{G}

步骤 2 (从 A 扩展正向搜索)

  • 探索 A 的邻居:{B, C}
  • 将 B 和 C 添加到正向队列和正向已访问。
  • 正向队列:{B, C}
  • 正向已访问:{A, B, C}

步骤 3 (从 G 扩展反向搜索)

  • 探索 G 的邻居:{F}
  • 将 F 添加到反向队列和反向已访问。
  • 反向队列:{F}
  • 反向已访问:{G, F}

步骤 4 (从 B 扩展正向搜索)

  • 探索 B 的邻居:{D}
  • 将 D 添加到正向队列和正向已访问。
  • 正向队列:{C, D}
  • 正向已访问:{A, B, C, D}

步骤 5 (从 F 扩展反向搜索)

  • 探索 F 的邻居:{D, E}
  • 将 D 和 E 添加到反向队列和反向已访问。
  • 反向队列:{D, E}
  • 反向已访问:{G, F, D, E}

步骤 6 (在 D 处会合)

  • 节点 D 位于正向和反向已访问集合中。
  • 搜索在 D 处相遇。因此,算法结束。

步骤 7 (路径构建)

  • 从 A 到 D 的路径是 A → B → D。
  • 从 G 到 D 的路径是 G → F → D。
  • 最终路径是 A → B → D → F → G。

示例

输出

 
Path found: ['A', 'B', 'D', 'F', 'G']   

时间复杂度

在大型图中,双向搜索的时间复杂度优于传统的单向搜索。对于分支因子为 b 和深度为 d 的图,单向搜索(BFS)的时间复杂度为 O(bd)。双向搜索的时间复杂度约为 O(bd/2)。

这种减少是因为每次搜索只探索总深度的一半。这导致扩展的节点数量呈指数级减少。

空间复杂度

双向搜索的空间复杂度高于其他一些搜索算法。它需要存储两个搜索前沿。一个从起始点开始,一个从目标点开始。还有两个已访问集合。对于每个搜索前沿,空间复杂度约为 O(bd/2)。因此总空间复杂度为 O(bd/2)。

双向搜索的优点

  1. 更快的搜索:双向搜索比单向搜索算法更快。在大型搜索空间中尤其如此。它探索的节点更少。换句话说,它不需要像传统搜索那样检查尽可能多的可能终点。
  2. 最短路径最优:双向搜索承诺在无权图中找到最短路径。
  3. 对称性:该算法在对称图或对称搜索问题中表现出色。这意味着搜索可以从起始节点或目标节点以同样高的效率移动。

双向搜索的缺点

  1. 高内存要求:它需要大量的内存。存储了正向和反向搜索的节点。在大型图中尤其如此。
  2. 会合点:很难确定确切的会合点。它是两次搜索相遇的点。在图结构不规则的情况下尤其如此。在不对称的情况下也是如此。
  3. 反向搜索复杂性:某些问题需要反向搜索。它从目标开始。这可能很困难或效率低下。当目标状态定义不明确时尤其如此。当目标状态不容易遍历时也是如此。

双向搜索的应用

  1. 图中的寻路:这在导航系统中至关重要。在路由算法中也很重要。它也用于游戏中。双向搜索有助于找到两点之间的最短路径。
  2. 人工智能 (AI) 游戏:它用于 AI 游戏。这些游戏围绕寻找最佳系列动作展开。此类游戏还需要帮助解决谜题。
  3. 状态空间中的问题:出现大问题。以 8 谜题和 15 谜题为例。在给定情况下,搜索空间是巨大的。双向搜索很方便。它有助于降低计算成本。

结论

力量在于双向搜索。它是一种人工智能算法。它查找两个节点之间的最短路径。同时进行两次搜索。一个从起始点开始。另一个从目标点开始。它显著减少了探索的节点。它比传统搜索算法更快。这在大型图中很有益。

需要额外的内存来管理两个前沿。时间复杂度得到改善,尤其是在大空间中。该技术很有价值。它在寻路、导航和 AI 驱动的应用程序等领域找到了用途。搜索空间可以被分割。它在中间相遇。这提供了实用的解决方案。它适用于大型状态空间。它也适用于复杂的网络。