【发布时间】:2009-08-12 14:53:22
【问题描述】:
我已经编写了 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,反之亦然不会工作。
【问题讨论】:
-
你说你正在寻找修复启发式;您可以发布与启发式相关的代码吗?或者有足够的代码让我们确定解决方案?
-
您的启发式算法是基于像素的吗?曼哈顿距离是方形网格地图的典型距离,应该很容易转换为等距,因为无论如何您可能会将地图存储在方形矩阵中。无论如何,发布有关您当前的启发式方法如何工作以及如何在内部表示地图的提示将非常有帮助。我认为 CoderTao 的回答是正确的,但我也很困惑为什么他的建议需要完全重写。
-
我的启发式方法不是基于像素的,我的地图也没有存储在方阵中,因此需要重写。如果是,则该地图将存储在方阵中,例如菱形。地图被投影为一个矩形。
-
是的;但地图中的每个方格仍然是一组两个坐标。我们并不是建议对所有内容进行大规模重写。计算启发式时只需进行一些数据处理。最终,我们仍然需要一个更好的描述,以便能够更好地建议您采取什么课程。 (例如:我一直在谈论如何修复算法的完成部分的距离;在重读时,听起来你只是在“到达这里的距离”部分遇到了问题)
-
“到这里的距离”部分是启发式的。而我需要的是一种能解释地图布局不规则性的启发式方法。
标签: algorithm search heuristics a-star isometric