Algorithm A*启发式,高估/低估?
我对高估/低估这两个术语感到困惑。我完全理解A*算法的工作原理,但我不确定使用高估或低估的启发式算法的效果 当你取直接鸟瞰线的平方时,是不是高估了?为什么它会使算法不正确?对所有节点使用相同的启发式 当你取直接鸟瞰线的平方根时,是低估了吗?为什么算法仍然正确Algorithm A*启发式,高估/低估?,algorithm,search,graph,artificial-intelligence,a-star,Algorithm,Search,Graph,Artificial Intelligence,A Star,我对高估/低估这两个术语感到困惑。我完全理解A*算法的工作原理,但我不确定使用高估或低估的启发式算法的效果 当你取直接鸟瞰线的平方时,是不是高估了?为什么它会使算法不正确?对所有节点使用相同的启发式 当你取直接鸟瞰线的平方根时,是低估了吗?为什么算法仍然正确 我找不到一篇文章能很好地解释这一点,所以我希望这里有人有一个很好的描述 据我所知,你通常会低估,这样你仍然可以找到最短的路径。你可以通过高估来更快地找到答案,但你可能找不到最短的路径。因此,为什么高估是“不正确的”,而低估仍然可以提供最佳解
我找不到一篇文章能很好地解释这一点,所以我希望这里有人有一个很好的描述 据我所知,你通常会低估,这样你仍然可以找到最短的路径。你可以通过高估来更快地找到答案,但你可能找不到最短的路径。因此,为什么高估是“不正确的”,而低估仍然可以提供最佳解决方案
很抱歉,我无法提供有关鸟瞰路线的任何见解…当启发式的估计高于实际的最终路径成本时,您的估计过高。当它较低时,你低估了它(你不必低估,你只需不要高估;正确的估计是可以的)。如果图形的边代价都是1,那么您给出的示例将提供高估和低估,尽管平面坐标距离在笛卡尔空间中也非常有效 高估并不能使算法“不正确”;这意味着你不再有一个可接受的启发式,这是保证a*产生最佳行为的条件。使用不可接受的启发式,该算法可能会做大量多余的工作来检查应该忽略的路径,并可能因为探索这些路径而找到次优路径。这是否真的发生取决于你的问题空间。发生这种情况是因为路径成本与估计成本“脱节”,这从本质上给算法带来了关于哪些路径比其他路径更好的混乱想法 我不确定你是否会找到它,但你可能想看看那本书。我提到(和链接)主要是因为几乎不可能用谷歌搜索它。从中,算法描述的相关部分是: 该算法将继续执行,直到目标节点的f值低于队列中的任何节点(或直到队列为空) 关键思想是,在激励不足的情况下,A*只会在知道路径的总成本将超过目标已知路径的成本时停止探索通往目标的潜在路径。由于路径成本的估计值始终小于或等于路径的实际成本,因此*可以在估计成本超过已知路径的总成本时丢弃路径 由于高估,A*不知道何时可以停止探索潜在路径,因为可能存在实际成本较低但估计成本高于当前已知目标路径的路径。简短回答 @混乱回答有点误导imo(应突出显示can) 高估并不能使算法“不正确”;这意味着你不再有一个可接受的启发式,这是保证a*产生最佳行为的条件。使用不可接受的启发式,算法可以完成大量多余的工作 正如@AlbertoPL所暗示的那样 你可以通过高估来更快地找到答案,但你可能找不到最短的路径
最后(除了数学优化),最优解很大程度上取决于是否考虑计算资源、运行时、特殊类型的“映射”/状态空间等。 长话短说 作为一个例子,我可以想到一个实时应用程序,其中机器人通过使用高估的启发式方法更快地到达目标,因为提前启动的时间优势大于采用最短路径但等待计算此解决方案的时间优势
为了给您留下更好的印象,我将分享一些我用Python快速创建的示例性结果。结果来自相同的A*算法,只是启发式不同。每个节点(网格单元)都有到除墙以外的所有八个相邻节点的边。对角边成本sqrt(2)=1.41 第一张图片显示了一个简单示例的算法返回路径。您可以通过高估启发式(红色和青色)看到一些次优路径。另一方面,存在多条最优路径(蓝色、黄色、绿色),这取决于最先找到的启发式路径 到达目标时,不同的图像显示所有展开的节点。颜色显示使用该节点的估计路径成本(考虑到从起点到该节点的“已采用”路径;从数学上讲,它是迄今为止的成本加上该节点的启发式)。在任何时候,该算法都会以最低的估计总成本(如前所述)扩展节点 1。零(蓝色)- 对应于Dijkstra算法
- 扩展节点:2685
- 路径长度:89.669
- 扩展节点数:658
- 路径长度:89.669
- 无障碍物的最短路径(如果您遵循八个方向)
- 不高估的最高可能估计值(因此为“理想”)
- 扩展节点:854
- 路径长度:89.669
- 无障碍物的最短路径(如果不沿对角线移动;换句话说,“沿对角线移动”的成本估计为2)
- 高估
- 扩展节点:562
- 路径长度:92.840
- 高估
- 展开的节点:
(*) => current pos: A A -------> B - 。。。 -> C |_______________________| => the prediction range of h(x)
(*) => current pos: B A -------> B - 。。。 -> C |____________| => the prediction range of h(x)
Front Rear ------------------------- => This is a priority queue PQ. | 20 | 20 | 30 | ... | 99 | ^-------- => This is the "fake" optimal.