C++ 静态节点的*寻路启发式算法

C++ 静态节点的*寻路启发式算法,c++,path-finding,a-star,C++,Path Finding,A Star,我试图编写自己的A*寻路算法,但遇到了一个问题;在寻找最短成本路径时,会出现以下错误: 其中,绿色填充的节点是开始节点,红色填充的节点是目标节点,粉红色填充的节点是算法所采用的实际路径 这当然不是最短路径,我确信问题在于我的启发式函数(曼哈顿距离): int-Map::ManhattandInstance(节点求值节点,节点目标节点) { int x=evaluatedNode.xCoord-goalNode.xCoord; int y=evaluatedNode.yCoord-goalNod

我试图编写自己的A*寻路算法,但遇到了一个问题;在寻找最短成本路径时,会出现以下错误:

其中,绿色填充的节点是开始节点,红色填充的节点是目标节点,粉红色填充的节点是算法所采用的实际路径

这当然不是最短路径,我确信问题在于我的启发式函数(曼哈顿距离):

int-Map::ManhattandInstance(节点求值节点,节点目标节点)
{
int x=evaluatedNode.xCoord-goalNode.xCoord;
int y=evaluatedNode.yCoord-goalNode.yCoord;
如果(x+y<0)
返回(x+y)*-1;
其他的
返回x+y;
}
在我看来,曼哈顿距离公式在这里并不理想,因此我的问题是:还有什么其他的距离测量算法适合我


编辑:为了清楚起见,每个节点的宽度由行中的节点数/屏幕宽度=640确定,每个节点的高度由列中的节点数/屏幕高度=480确定。

负成本意味着路线是免费的,或者比之前的移动折扣更多。看起来你已经试着通过乘以骨料的-1来解释这一点,但是损害已经造成了。这就是为什么解使用了对角线,(1-1)*-1仍然是零,因此被认为是自由的

我将用以下语句替换if语句,该语句通过单独应用abs来使用每个组件的大小:


返回Math.abs(x)+Math.abs(y)

你认为(3,5)和(2,6)之间的距离是多少?这是最短的距离。(你的公式错了)。
int Map::manhattanDistance(Node evaluatedNode, Node goalNode)
{
    int x = evaluatedNode.xCoord - goalNode.xCoord;
    int y = evaluatedNode.yCoord - goalNode.yCoord;
    if(x + y < 0)
        return (x + y) * -1;
    else
        return x + y;
}