为A *寻路启发法计算3维的``对角距离''

时间:2018-11-02 10:07:34

标签: python path-finding a-star heuristics

我正在通过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 ...那么公式将如何工作?

感谢您的帮助!

1 个答案:

答案 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