我已经编写了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)
倍,但是计算得出的代价与对角线移动相同。问题是:我该如何修改当前的启发式算法,以便在等距布局下产生正确的结果?简单地用straight
替换diagonal
或反之亦然是行不通的。![Map layout Map layout](https://istack.dev59.com/o7Qbt.webp)