我一直在阅读关于路径寻找算法的文章,我现在正在寻找一个像A *一样工作但是代理不能沿对角方向移动的算法。节点是否仍然沿对角线扩展还是以其他方式扩展?也许它根本与A *无关?另外请考虑下面的图像,其中显示三角形是我们的代理,棕色矩形是网格方块之间的障碍,箭头只是为了清楚地表明你仍然可以穿过在它们的“边界”上有障碍物的方块,当没有面对那个障碍时。您会建议我使用哪种算法作为具有这些特征的路径查找问题的基础?请原谅我,如果这样的事情已经发布,我找不到它。
答案 0 :(得分:6)
A *是图形中的搜索算法,给定起始位置和一组目标节点,它会找到一条路径 - 基于图形的顶点和边缘。
如果您希望代理无法对角移动,您需要做的就是设计图形,使对角线顶点之间没有边缘。
我假设您正在使用next:V->2^V
函数来获取代理可以进入下一步的所有职位。如果是这种情况,只需确保不从此功能返回对角线。
答案 1 :(得分:2)
正如amit所说,A *是一种搜索算法,可以应用于(几乎)任何搜索问题。
可以使用以下参数描述(或定义)任何搜索问题:
可以明确地或隐含地给出开始和结束状态以及转换函数,例如,当在网格中移动时(如在你的问题中),下一个位置可以是任何邻居(上,下,左,右+可能是对角线),或者可以在一个空格中包含显式信息。 结束状态也可以事先知道(例如坐标为(x,y)的状态),或者可以通过状态的某些特征来定义(例如,如果网格中有硬币,则结束状态可能是任何有硬币的州。)
最常见的搜索算法是BFS,DFS,迭代-DFS(非定向),爬山,A *(定向)。有许多others - 查看维基页面右侧的图形。其中一些是完整的(意思是,即使在无限的搜索空间中存在始终总是 - 如果它存在 - BFS,A *),而有些则不是( DFS,爬山)。其他分类是通过算法最优性。最佳搜索将找到最佳解决方案或最佳可能路径(非加权图的BFS,A *),而其他人将找到任何可接受的解决方案或解决方案的任何可能路径(加权图中的BFS)。通常,需要在计算复杂性,内存要求和实现的简单性之间进行权衡。定向搜索另外使用一些关于结束状态的预先知道信息来指导搜索(估计任何给定状态的最终状态距离),而非定向搜索则不会。
例如,如果您知道开始和结束位置的坐标,则定向搜索是有意义的。如果起始位置在左上角,而结束位置在左下角,则您更喜欢向下搜索状态而不是向右搜索状态。如果您的起始位置位于电路板的中间位置,则不明确地(由特性定义)结束结束位置,并且可以在电路板中任何地方,定向搜索没有多大帮助。
此外,如果您的问题不是很严重(例如在100x100板上搜索),通常没有充分的理由使用定向搜索,BFS或其他非定向搜索算法将足够快地运行并且通过使用更复杂的定向搜索获得的加速并不重要。
请注意,所有搜索算法都可以使用任何给定的转换函数。
所以,结束。您应该使用的算法类型取决于您的问题限制:
这只是搜索算法的简短概述,只是给出了一般的理想。如果您不确定哪种算法最适合您的问题,您应该更详细地阅读这些特性和应用程序。
希望这会有所帮助;)