我在尝试理解如何一致性地计算A*寻径实现中的正确G成本时遇到了困难。据我所知,G成本是从起始节点移动到当前节点的成本,但我没有完全理解如何找到用于增加G成本的值。我看到了一些使用10和14的例子,这些数字是任意的吗?还是取决于具体的实现?
当我在开发一个2D游戏时,似乎必须找到一个G成本的“最佳点”(我应该指出,这似乎与用作节点的地板瓷砖的宽度接近),才能 consistently 找到最短路径。
对此事的任何澄清都将非常有帮助。
回答:
这些是你自己定义的。当你“走一步”时增加到G的数值,是你告诉算法你真正喜欢的路径的方式(H只是对一系列G增量的可接受近似,有助于更快地找到你想要的路径)。使用10和14是对1和sqrt(2)的近似,有点像如果你使用欧几里得距离但在每一步都被限制在Moore邻域内会发生的情况,有时这被称为“对角距离”或“八进制距离”(虽然更准确地说,这个术语是为使用准确的sqrt(2)而保留的)。因此,这种选择并非完全凭空而来。
但这确实由你决定,选择不同的成本会使A*偏好(或“不偏好”)某些路径,例如,如果你使对角成本与“直线”成本相同,它将非常喜欢对角移动,它不一定会避免来回锯齿(只要锯齿方向正确,这将是免费的,例如路径/\
将与--
长度相同)。使用高对角成本(>2)将使其找到的路径看起来像是使用了von Neumann邻域,除了在“紧急情况”下它仍然能够对角移动。在1和2之间,差异不太明显,但在障碍物周围有时会显现出来。
因此,使用低于sqrt(2)的对角成本往往会产生“奇怪”的路径,这些路径不必要地锯齿,而使用高于sqrt(2)的对角成本往往会产生“愚蠢”的路径,这些路径未能采取对角捷径。但你可能想要这样做,特别是如果这与“实际成本”相匹配(如果你有一个),例如单位行走所需的时间或类似的东西。另一方面,在我自己的一个游戏中,我故意使对角成本高于基于行走时间的成本,以使路径看起来更自然(否则它太锯齿了)。
黄色表示“已探索”。由于实现细节,下面的路径在对角成本为10时采取了绕道(它从西北方向顺时针添加节点,并使用稳定插入到open
中,而不是使用像堆这样的聪明方法,因此具有相同F值的节点在添加顺序上打破平局)。