我对“过度估计/低估”这些术语感到困惑。我完全理解A*算法的工作原理,但是我不确定具有高估或低估启发式的影响。
过度估计是当你对直接鸟瞰线平方处理时吗?为什么会使算法不正确?同样的启发式被用于所有节点。
低估是当你对直接鸟瞰线取平方根时吗?为什么算法仍然是正确的?
我找不到一个清晰易懂的文章来解释这个问题,所以希望这里有人能够提供一个好的描述。
我对“过度估计/低估”这些术语感到困惑。我完全理解A*算法的工作原理,但是我不确定具有高估或低估启发式的影响。
过度估计是当你对直接鸟瞰线平方处理时吗?为什么会使算法不正确?同样的启发式被用于所有节点。
低估是当你对直接鸟瞰线取平方根时吗?为什么算法仍然是正确的?
我找不到一个清晰易懂的文章来解释这个问题,所以希望这里有人能够提供一个好的描述。
关键思想是,使用低估计值,A*只有在已知路径总成本超过通往目标的已知路径成本时才停止探索通向目标的潜在路径。由于路径成本的估计值始终小于或等于路径的实际成本,因此一旦估计成本超过已知路径的总成本,A*就可以丢弃该路径。该算法会一直执行,直到目标节点的f 值小于队列中任何节点的值(或队列为空)。
@chaos的回答有点误导(应该强调“可以”),高估并不一定使算法“不正确”;它意味着你不再拥有一个可接受的启发式,这是保证A*产生最优行为的条件。使用一个不可接受的启发式,算法可能会执行大量多余的工作。
正如@AlbertoPL所暗示的那样。
通过高估,您可以更快地找到答案,但您可能无法找到最短路径。
最终(除了数学上的最优解),最优解强烈取决于您是否考虑计算资源、运行时间、特殊类型的“地图”/状态空间等。
例如,我可以想到一个实时应用程序,在这个应用程序中,通过使用高估的启发式方法,机器人可以更快地到达目标,因为通过早期启动节省的时间比通过计算最短路径但等待更长时间节省的时间更多。
为了让您更好地了解情况,我分享了一些我用Python快速创建的示例结果。这些结果来自相同的A*算法,只是启发式不同。每个节点(网格单元)都与八个邻居(除了墙壁)相连。对角线边缘成本为sqrt(2)=1.41。
第一张图片显示了算法返回的简单示例情况下的路径。您可以看到一些高估启发式的次优路径(红色和青色)。另一方面,有多个最优路径(蓝色、黄色、绿色),取决于启发式方法找到哪一个。
不同的图像显示了当目标被达到时扩展的所有节点。颜色显示了使用该节点的估计路径成本(同时考虑从起点到该节点的“已经采取”的路径;在数学上,它是迄今为止的代价加上该节点的启发式)。在任何时候,算法都会扩展具有最低估计总成本的节点(如前所述)。
1. 零(蓝色)
2. 直线距离(黄色)
3. 理想(绿色)
4. 曼哈顿距离(红色)
5. 乘以10的直线距离(青色)
为了使A*正确地工作(总是找到“最佳”解决方案而不仅仅是任何一个),您的估计函数需要乐观。
这里的乐观主要指您的期望始终比现实好多了。
乐观主义者会尝试很多可能最终会让人失望的事情,但他们会发现所有好的机会。
悲观主义者预期结果不佳,因此不会尝试很多事情。由于这个原因,他们可能会错过一些绝佳的机会。
因此对于A*来说,乐观意味着始终低估成本(即“它可能不那么远”)。当你这样做时,一旦你找到一个路径,你仍然可能对几个未开发的选项感到兴奋,这些选项可能更好。 这意味着您不会停留在第一个解决方案上,并仍然尝试其他解决方案。大多数可能会让人失望(不会更好),但它保证您总能找到最佳解决方案。当然,尝试更多的选项需要更多的工作(时间)。
一种悲观的A*将始终高估成本(例如,“该选项可能非常糟糕”)。一旦它找到一个解决方案并知道路径的真实成本,每条其他路径都会看起来更差(因为估计总是比现实更差),并且一旦找到目标就不会尝试任何其他选择。
最有效的A*是永远不低估,但是要么完美地估计,要么只是稍微过于乐观。然后您将不会天真地尝试太多糟糕的选项。
对于每个人的一个好教训。始终保持一点乐观!
f(x) = g(x) + h(x)
,其中g(x)
是从 起点
到 当前节点
的实际花费,h(x)
是从 当前节点
到 目标
的预测花费。假设最优花费为 R
,则:
h(x)
在搜索的早期阶段起着重要作用。假设有三个节点 A、B、C:
(*) => 当前位置:A
A -------> B - 。。。 -> C
|_______________________| => h(x) 的预测范围
一旦你到达 B,从 A 到 B 的代价是真实的,而预测的 h(x)
不再包括它:
(*) => 当前位置:B
A -------> B - 。。。 -> C
|____________| => h(x) 的预测范围
当我们说低估时,意味着你的 h(x)
会导致所有通往目标的路径上的 x
都满足 f(x) < R
。
高估确实会使算法不正确:
假设 R
是 19
。并且给定两个代价为 20
、21
的路径已经到达了目标:
前面 后面
------------------------- => 这是一个优先队列 PQ。
| 20 | 20 | 30 | ... | 99 |
^-------- => 这是“虚假”的最优解。
但是假设 f(y)=g(y)+h(y)
,并且 y
确实在通向最优代价 R
的正确路径上,但由于 h(y)
被高估了,所以 PQ
中的 f(y)
目前是 30
,因此在我们能够将 30
更新为 19
之前,算法已经会从 PQ
中弹出 20
并错误地认为它是一个“最优”的解。