当我们使用具有非允许启发式的A *时,我们有时会得到非最佳路径。
但是当它被允许拥有零成本的路径时,我想到的唯一可接受的启发式是h(x) = 0
,它将A *转变为“简单的”Dijkstra算法。
我说错了吗?这是唯一可能允许的启发式方法吗?不使用可接受的启发式的真正损失是什么?还有其他路径寻找算法可以更好地使用零成本路径吗?
一个例子:
假设下图(边缘上方的数字显示成本):
1 1 0 1 1
S --> V1 --> V2 --> V3 --> V4 --> G
其中:
通过查看图表,我们看到C(S) = 4
。
我可以使用哪种启发式函数h(x)
?如果我使用欧几里得距离我得到了:
f(S) = g(S) + h(S)
f(S) = 0 + 5 = 5
我们可以看到这种启发式过度估计实际距离,因此对于更复杂的图形,它可能找不到最优解。
答案 0 :(得分:2)
不正确。启发式函数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
,如上所述,目标是h
。再次注意,这是距目标距离的下限。它给你Dijkstra!
为了做得更好,您需要了解图表的结构。
修改强>
在您的示例中,您提供了详细的知识,因此制作好 / 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)
,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
。例如,这是可以接受的:
h(x)
<强>加成强>
OP指出,对于许多问题,{{1}}很难选择!这是完全正确的。如果你找不到一个好的可接受的启发式算法,那么A *是错误的算法!尽管如此,A *对于可以找到启发式的问题非常有效。我自己尝试过的例子:
欧几里德距离是任意两个节点之间可能距离的良好下界的图。例如,每对城市A和B在乌鸦飞行时间隔距离D“,但是从A到B的道路距离长度至少为D且可能更多,即其成本C大于或等于等于D.在这种情况下,D是一个很好的启发式,因为它是一个低估计。
与获胜状态“距离”涉及移动游戏棋子的谜题。在这种情况下,相对于获胜状态当前不在位置的棋子数是精细启发式的。例如,来自第7位客人的8-bishop问题(尚未进入最终位置的主教的数量)和幻方问题(从所有棋子的当前位置到获胜状态下的正确位置的总Manhatten距离)。