图搜索算法

时间:2009-08-17 16:47:42

标签: graph-theory traversal

问题在于:
我必须找到从起点到目的地的路径,并考虑以下因素。

在给定的图表中,一个点可以是:

  • (1)检查点 - >这一点必须 在计算的最终路径中

  • (2)矿井 - >这一点不应该 在计算的最终路径中

  • (3)中性点 - >这一点
    可能/可能不在最后的中 路径计算

我需要一个算法。

4 个答案:

答案 0 :(得分:4)

首先移除地雷并列出检查点。

然后你几乎肯定要进行深度优先或广度优先搜索。哪一个取决于图表。我建议尝试广度优先搜索,并使用适当的修剪启发式方法。寻求者从起始点开始,然后只要它有选择让它自己复制并且双向进行。它保留了两个列表:它访问过的检查点,以及自上一个检查点以来访问的中性节点。当它访问中性节点时,它将其检查点列表写在墙上,并擦除任何自己的子集列表。如果遇到下列情况之一,它将自行终止:

  • 它访问其中一个列表上的节点。
  • 它在墙上看到了一个自己的超集的检查点列表。
  • 它在没有访问过所有检查点的情况下到达目的地。

这应该足以让你入门。根据图表,还有其他优化(例如删除死角)可能是值得的。

编辑:当我看到它会使某些图表变得不可能时,抓住了最后一个条件。)

答案 1 :(得分:2)

如果需要按特定顺序访问检查点, Dijkstra算法是一个简单的解决方案。您可以将该算法用于图的子集。子集将是图形,其中起始节点和结束节点是检查点(或图的开始或结束节点)。您可以使用边权重来表示不应访问的节点。

但是,我建议使用 A * Pathfinding ,因为它可能更适合您要做的事情。那里有很多示例代码。

这是一个很好的教程,可以帮助您入门:

A* Pathfinding for Beginners

您可以在图表中将您的地雷和检查点表示为权重,或使用启发式方法。这很可能取决于是否订购检查站。

Gamedev.net是你的朋友。祝你好运!

答案 2 :(得分:1)

好吧,我认为你可以使用Dijkstra's algorithm(或类似的东西,我建议Dijkstra的,因为它是详尽的和一般的,你没有提供有关你的数据的那么多信息)来找到最短的路径..经过这些修改:

  1. 检查点的值等于中性点数的负数。
  2. 地雷的值等于中性点数。
  3. 中性点的值为1.
  4. Dijkstra将找到最短路径(权重最低的路径),保证越过所有检查点并避开所有地雷。

    虽然这不是一个快速算法,但如果您的地图太大,它可能无效。

答案 3 :(得分:1)

就我个人而言,我会使用深度优先搜索(DFS)。 Dijkstras算法用于计算最短路径,基于一些边缘距离函数(您没有提到节点之间的任何距离,所以我假设没有)。

因此可以修改DFS(假设s是你的来源而t是目的地):

  • 首先删除所有“我的”节点及其相邻边缘。如果无法访问一个地雷节点,那么也可以将其删除,因为路径中不能使用任何传入或传出边缘。
  • 从节点执行DFS。
  • 一旦执行了DFS,您将拥有一组节点序列,例如: [s,a,b,d,e,t],[s,b,d,t,e]等。
  • 如果这些序列中的任何一个包含节点t之前的所有检查点节点,那么这是一个合适的路径。
  • 如果DFS结果中没有此类序列,则没有符合条件的路径。要么你错过了检查站,要么去矿山到达目的地。

这可能不是最有效的算法,但应该用于查找路径。也没有承诺从DFS结果中选择的路径是最佳路径。

(这假设可以按任何顺序访问检查点)