我已经编写了 A* 搜索算法的实现。问题是我目前使用的启发式方法只能在方形网格上准确地工作。由于我的地图是等距的,因此启发式没有考虑地图的实际布局,因此也没有考虑单元格之间的距离。
更新:经过大量的日志记录和分析(读作花费大量时间试图找出平庸),我得出的结论是,我目前的启发式方法工作得很好,有一个小例外:最终结果与真正的直线相反对角线运动。
inline int Pathfinder::calculateDistanceEstimate(const CellCoord& coord) const
{
int diagonal = std::min(abs(coord.x-goal->position.x), abs(coord.y-goal->position.y));
int straight = (abs(coord.x-goal->position.x) + abs(coord.y-goal->position.y));
return 14 * diagonal + 10 * (straight - 2 * diagonal);
}
这意味着在等轴测sqrt(2)
地图上,直线移动的成本实际上是对角线移动的数倍,它被计算为对角线移动的移动。问题是:如何修改我当前的启发式方法,以便为等距布局产生正确的结果?简单地替换为,反之亦然是行不通的。diagonal
straight