Python 计算';对角线距离';在3维中进行A*路径查找启发式

Python 计算';对角线距离';在3维中进行A*路径查找启发式,python,path-finding,a-star,heuristics,Python,Path Finding,A Star,Heuristics,我正在三维数据网格上运行*路径查找。可用的移动是周围的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,

我正在三维数据网格上运行*路径查找。可用的移动是周围的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))

我不太清楚如何将其转换为三维空间-因此,任何帮助都将不胜感激

作为一个额外的问题(因为这是实际网格的多少…)假设x轴和y轴上的节点相距5米,但z轴上的节点相距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

我的猜测是,沿3对角线移动,直到X、Y或Z都正确为止,然后它就转化为二维问题(上图)。这真是聪明。你的博客充满了聪明的见解和惊人的帖子,真的很感激。