基于A *的椭圆属性,为什么该算法关闭 一系列扩展椭圆中的所有节点?
答案 0 :(得分:0)
A *使用函数f(x) = g(x) + h(x)
来评估下一个要访问的节点,其中g(x)
是从开始到x
的实际成本,而h(x)
是从x
到目标(=启发式)的估计成本。
让我们在欧几里得平面的连续情况下进行研究,我们要从(0, 0)
到(10, 20)
。然后:
g(x) = Length(x)
勘探前沿的形状在很大程度上取决于启发式方法。让我们从完美的启发式开始
h(x) = Length(x - (10, 20))
我们可以在平面上绘制g(x) + h(x)
的值,并查看被访问节点的顺序(f
较小的点将首先被访问)。这样做,我们应该知道,如果以前没有节点被访问过,则无法访问该节点,因此实际值仅表示顺序。我们会牢记这一点。使用完美的启发式方法,我们得到以下图片:
起点与目标之间的连接上的所有点都具有相同的f
成本,等于起点与目标之间的距离。如果我们检查f
,就会看到
f = Length(x - (0, 0)) + Length(x - (10, 20)),
这恰好是椭圆的隐式形式,以开始和目标为焦点。
我说过,形状取决于试探法。如果启发式方法是实际距离的下限,则它是有效的。试试吧
h(x) = 0.5 * Length(x - (10, 20))
现在,该算法将在到达目标之前开始探索围绕起点的更多点。特别是,轮廓点内目标点之前的所有点都将被访问。
我们甚至可以进一步设置
h(x) = 0
这是Dijkstra算法的设置,在这里我们无法说出到目标的距离:
此处,该算法将在起点附近访问磁盘中的节点。
与目标距离的一个常见近似值是曼哈顿距离,因为它的计算成本很低:
h(x, y) = |x - 10| + |y - 20|
此试探法无效,因为它不是实际距离的下限。它给我们:
在这种情况下,接近目标的点的f
得分比接近起点的得分低。尽管在此图中它们的值较低,但是由于尚未探究其邻居,因此当然不会首先对其进行访问。这是一个特写:
我们可以通过引入一个常数因子来使启发式算法有效:
h(x, y) = 1/sqrt(2) * (|x - 10| + |y - 20|)
这将为我们提供具有适当前部形状的有效启发式方法: