我正在通过3D数据网格运行A *路径查找。可用的移动是周围的26个节点(即,您可以对角移动),我一直使用欧几里得距离作为启发式算法,效果很好,但我也想尝试“对角距离”以了解其工作原理(如果有的话)任何速度的进步)
我已经在网上找到了一些逻辑,可以在二维空间中做到这一点...
function heuristic(node) =
dx = abs(node.x - goal.x)
dy = abs(node.y - goal.y)
return D * (dx + dy) + (D2 - 2 * D) * min(dx, dy)
..,其中D是北/东/南/西距离(例如1m),D2是对角线距离(例如sqrt(2))
我不确定如何将其转换为3维-因此,我们将不胜感激任何帮助
作为一个额外的问题(因为实际上是多少个网格...),假设x和y轴上的节点相距5m,而z轴上的相距2m ...那么公式将如何工作?
感谢您的帮助!
答案 0 :(得分:2)
它可以相对容易地扩展到3D。确实需要找到3个值的“中间”,鉴于我们有最小值和最大值,有一个技巧。
dx = absdiff(node.x, goal.x)
dy = absdiff(node.y, goal.y)
dz = absdiff(node.z, goal.z)
dmin = min(dx, dy, dz)
dmax = max(dx, dy, dz)
dmid = dx + dy + dz - dmin - dmax
这适用于Python样式的整数,甚至适用于Java样式的int
,但对于浮点数,它可能会导致一些舍入。
像这样合并它们:
return (D3 - D2) * dmin + (D2 - D1) * dmid + D1 * dmax