正如amit所说,A*是一种搜索算法,可以应用于(几乎)任何搜索问题。
任何“搜索问题”都可以用以下参数描述(或定义):
- 起始状态(位置)
- 转移函数(如果给定任何状态a,则可以在一个步骤中获得的状态是什么)
- 终止状态(位置)
起始状态和终止状态以及转移函数可以明确或隐含地给出,例如,在通过网格移动时(就像在您的问题中),下一个位置可以是任何邻居(上,下,左,右+可能对角线),或者在一个空间中可能包含显式信息。终止状态也可以事先知道(例如,具有坐标(x,y)的状态),或者可以根据状态的某些特征来定义(例如,如果网格中有硬币,则终止状态可以是任何具有硬币的状态)。
最常见的搜索算法包括BFS、DFS、迭代深度优先搜索(非定向)、爬山法、A*(定向)。还有许多其他算法-请看维基页面右侧的图形。其中一些是“完全的”(意思是,即使在无限搜索空间中,如果存在结束状态,也将始终找到 - BFS、A*),而有些则不是(DFS、爬山法)。另一种分类是通过算法的“最优性”。最优搜索将找到最佳解决方案或通往最佳解决方案的最佳路径(非加权图的BFS、A*),而其他搜索将找到任何可接受的解决方案或通往解决方案的任何可能路径(加权图的BFS)。通常,计算复杂度、内存要求和实现简单性之间存在折衷。定向搜索还会使用一些关于结束状态的预先已知信息来指导搜索(从任何给定状态估计结束状态的距离),而非定向搜索则不会。
例如,如果您知道起始和结束位置的坐标,则有向搜索是有意义的。如果起始位置在左上角,而结束位置在左下角,您更喜欢沿着向下方向搜索状态,而不是向右方向搜索状态。如果您的起始位置在棋盘中央,结束位置没有明确定义(由特征定义),可以在棋盘中的任何位置,则有向搜索并没有太大帮助。
此外,如果您的问题规模不大(例如,在一个100x100的棋盘上搜索),通常没有使用有向搜索的好理由,广度优先搜索或其他非有向搜索算法足够快速,并且使用更复杂的有向搜索获得的加速效果并不显著。
请注意,所有搜索算法都可以使用任何给定的转换函数。
因此,总之,您应该使用的算法类型取决于您的问题限制:
以下是搜索算法的简要概述:
- 搜索空间小,没有关于结束状态的已知信息:无向搜索(BFS,DFS)。
- 内存有限:DFS,迭代深度优先搜索。
- 搜索空间较大且已知结束状态的相关信息:有向搜索(A*,爬山算法)。
- 搜索空间中没有局部极值(例如没有障碍物),或内存有限且已知结束状态的相关信息:爬山算法。
- 还有许多其他限制需要考虑,搜索算法只是可能适用于这些情况的算法示例(根据额外限制可能也不适用)。
这只是搜索算法的简要概述,仅提供了一般理念。如果您不确定哪种算法最适合您的问题,请详细阅读特征和应用。
希望对您有所帮助 ;)