这就是问题所在:
我必须找到从起点到目的地的路径,并考虑以下因素。
在给定的图中,一个点可以是:
(1) A Checkpoint-->这个点必须在计算的最终路径中
(2) A Mine-->这个点
在计算的最终路径中不应该存在(3) 中性点--> 该点
可能/可能不在
计算的最终路径中
我需要一个算法。
这就是问题所在:
我必须找到从起点到目的地的路径,并考虑以下因素。
在给定的图中,一个点可以是:
(1) A Checkpoint-->这个点必须在计算的最终路径中
(2) A Mine-->这个点
在计算的最终路径中不应该存在
(3) 中性点--> 该点
可能/可能不在
计算的最终路径中
我需要一个算法。
首先清除地雷并列出检查点。
然后,您几乎可以肯定必须进行深度优先或广度优先搜索。哪一个取决于图表。我建议尝试广度优先搜索,并采用适当的修剪启发式方法。搜索者从起点开始,然后只要有选择,它就会复制自己并双向进行。它保留两个列表:它访问过的检查点,以及自上次检查点以来访问过的中性节点。当它访问一个中性节点时,它会将其检查点列表写在墙上,并删除任何属于它自己子集的列表。如果遇到以下情况之一,它将自行终止:
这应该足以让你开始。根据图表,还有其他可能值得的优化(例如消除死角)。
(编辑:当我看到最后一个条件会使某些图表变得不可能时,就抓到了。)
如果您的检查点需要按特定顺序访问,Dijkstra 算法是一个简单的解决方案。您可以针对图形的子集使用该算法。子集将是图,其中开始和结束节点是检查点(或图的打开或关闭节点)。您可以使用边权重来表示不应访问的节点。
但是,我建议A Pathfinding * 因为它可能更适合您尝试做的事情。那里有很多示例代码。
这是一个很好的教程,可以帮助您入门:
您可以将您的地雷和检查点表示为图表中的权重,或使用启发式方法。这很可能取决于检查点是否已排序。
Gamedev.net 是你的朋友。祝你好运!
我个人会为此使用深度优先搜索(DFS)。Dijkstras 算法用于计算最短路径,基于一些边缘距离函数(你没有提到节点之间的任何距离,所以我假设没有)。
因此可以修改 DFS(假设 s 是您的源,t 是目标):
这可能不是最有效的算法,但应该适用于寻找路径。也没有保证您从 DFS 结果中选择的路径是最佳路径。
(这假设可以按任何顺序访问检查点)
好吧,我认为您可以使用Dijkstra 的算法(或类似的算法,我建议使用 Dijkstra 的算法,因为它详尽且通用,并且您没有提供有关数据的太多信息)来找到最短路径...通过以下修改:
Dijkstra 会找到最短的路径(权重最小的路径),保证穿过所有检查站并避开所有地雷。
不过,这不是一个快速算法,因此如果您的地图太大,它可能无法工作。