我正在尝试编写自己的A *寻路算法并遇到问题;当寻求最短的成本路径时,出现以下错误:
绿色填充节点是起始节点,红色填充节点是目标节点,粉红色填充节点是算法采用的实际路径。
这当然不是最短路径,我确定问题在于我的启发函数(曼哈顿距离):
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;
}
在我看来,曼哈顿距离公式在这里并不理想,因此我的问题是:其他距离测量算法对我有用吗?
编辑:为了清楚起见,每个节点的宽度由行/屏幕宽度= 640的节点数决定,每个节点的高度由列/屏幕高度= 480的节点数决定。
答案 0 :(得分:1)
负成本意味着一条路线是免费的,或者更多的是它对之前的动作打折。看起来你试图通过乘以聚合的-1来解释这个问题,但损坏已经完成了。这就是解决方案使用了对角线的原因,(1 - 1)* -1仍为零,因此被认为是免费的。
我会用以下内容替换if语句,它通过分别对它应用abs来使用每个组件的大小:
返回Math.abs(x)+ Math.abs(y);