【发布时间】:2013-10-22 17:16:45
【问题描述】:
我正在尝试解决以下问题: 我有一个 2D 平铺游戏,其中包括在空域中飞行的飞机,试图降落在最近的机场(可能有 'n' 个目标)。这个想法是让飞机自己寻找最佳路径,避免碰撞。
所以我打算尝试 A* 算法,但后来我发现了另一个限制:如果需要,飞机可以改变它们的高度。所以我有想法实现与 A* 相同的理念,但在 3D 中(将节点扩展到可能的移动,让平面也向上、向下、向下、向北、向上等移动,制作抽象的 3D处理相对高度,从而让算法找到具有 3D 移动的最佳路径)。
关于启发式,我放弃了 manhattan 实例,因为我希望算法更高效(因为你知道一个好的启发式可以进行更有效的搜索,manhattan 高估了成本,而且我正在使用对角线移动),所以我决定实现对角距离(它结合了曼哈顿和欧几里得的方面),建议使用 8 邻接(扩展节点也在对角线移动中)。但是我有更多的邻接点,所以我试图将对角线距离公式调整为 16 个邻接点(不包括向上和向下对角线,如 up-northeast、down-sowthwest 等),所以曼哈顿对每个 ' 的估计对角线移动'(除了我提到的那些)具有相同的成本值(1个对角线移动= 2个正交移动,而不是我排除的“上下对角线”中的3个),并且这个公式启发式被概括如下:
设节点A为起点,节点B为目标,它们各自的位置为(xa,ya,za)和(xb,yb,zb)
numberOfDiagonalSteps = min{|xa-xb|,|ya-yb|,|za-zb|}
曼哈顿距离 = |xa-xb| + |是的| + |za-zb|
numberOfStraightSteps = manhattanDistance - 2*numberOfDiagonalSteps
假设对角线步长的成本为 sqrt(3)(你知道,毕达哥拉斯,正交成本为 1):
启发式是:h(n) = numberOfStraightSteps + sqrt(3)*numberOfDiagonalSteps
嗯...我的一个问题是,随着飞机的移动(“障碍节点”),算法必须刷新,重新执行,那么,你建议我做什么最好? 我的意思是……是这样尝试更好,还是更好地尝试实现 D*-Lite?
我的另一个问题是关于时间复杂度的。很明显,这些算法的最坏情况是指数级的,但它可以从一个好的启发式算法中得到真正的改进。但是我没有找到如何精确分析我的问题中的算法。我可以为该算法提供多少时间复杂度,或者您建议我在我的情况下做什么?
感谢您的关注。
【问题讨论】:
-
请注意:如果您沿对角线移动(在所有维度上,例如向下-东北-东),您的距离为 sqrt(3)。
-
“曼哈顿高估了成本” - 你cannot use A* with a heuristic that overestimates the cost。您可能想要的是Euclidean distance。此外,A* 在 3D 中也可以正常工作,只需在代码中正确构建图形即可。我不知道你为什么提到D*-Lite,这听起来并不适用于你的问题。
-
@Danny 您可以很好地将 A* 与高估启发式一起使用。在实践中经常这样做。您失去的是确保找到的解决方案的最优性。
-
为什么不简单地使用欧几里得距离作为启发式?
-
@ziggystar:当然,您可以使用任何(缺少)约束条件下的任何算法,前提是您取消了结果正确的要求 :)
标签: algorithm artificial-intelligence time-complexity path-finding a-star