不对。启发式函数h(x)
具有x
由当前搜索状态组成的参数。x
它返回对目标距离的估计。在一个简单的图中,x
是一个图节点。
可接受性要求h(x)
只能低估(或等于目标距离)。此条件适用于每个特定的 x。(您似乎在推断条件适用于所有可能的 x,这太强了。如果有必要, A* 将毫无用处。)
关于您提出的案例的正确陈述是,只有当是一个与目标距离为零的状态时才有h(x) = 0
必要。任何其他值都将被高估。但是,对于任何其他(在同一状态空间中)需要总成本至少达到目标的转换,我们可以有任何这样的。x
x
C>0
h
h(x)<=C
当然,如果x
' 到目标的距离为零,x
则为目标状态,搜索完成。所以你的担忧是空洞的——没有任何值得关注的案例。
要构建的信息h(x)
来自您对搜索空间的了解(例如图的特征)。光靠一般的图表并不能提供任何有用的东西。您可以做的最好的事情是h(x) = cost of min weight outgoing edge of x
针对非目标节点,并且如前所述,h(x) = 0
针对目标。再次注意这是到目标距离的下限。它给了你 Dijkstra!
为了做得更好,您需要了解图表的结构。
编辑
在您的示例中,您提供了详细的知识,因此制作商品h
很简单。您可以使用
/ 4 if x == S
| 3 if x == V1
h(x) = { 2 if x == V2 or V3
| 1 if x == V4
\ 0 if x == G
或者您可以使用任何其他功能h'(x)
,例如h'(x) <= h(x)
all x
。例如,这是可以接受的:
/ 3 if x == S
| 2 if x == V1
h'(x) = { 2 if x == V2 or V3
| 1 if x == V4
\ 0 if x == G
添加
OP指出,对于许多问题,h(x)
可能很难选择!这是完全正确的。如果你找不到一个好的可接受的启发式算法,那么 A* 就是错误的算法!尽管如此,A* 对于可以找到启发式的问题非常有效。我自己试过的例子:
欧几里得距离是任意两个节点之间可能距离的良好下界的图。例如,每对城市 A 和 B 之间的距离为 D,“就像乌鸦飞过一样”,但是从 A 到 B 的道路距离至少是 D 并且可能更多,即它的成本 C 大于或等于 D。在这种情况下,D 是一个很好的启发式算法,因为它是一个低估计值。
与获胜状态的“距离”涉及移动游戏棋子的谜题。在这种情况下,当前相对于获胜状态不在位置的棋子数量是一种很好的启发式方法。例如,来自第 7 位客人的 8 主教问题(尚未处于最终位置的主教数量)和魔方问题(从所有棋子当前位置到获胜状态下正确位置的总曼哈顿距离)。