改进的a-star寻路启发式设计

时间:2012-02-09 11:14:17

标签: algorithm path-finding a-star

FIRST, 理想的路径是(按重要性顺序):

1. shortest

我的启发式(f)是:

manhattan distance (h) + path length (g)

这是有缺陷的,因为它偏向于向目标转向然后蜿蜒回来的路径。

SECOND, 理想的路径是:

1. shortest
2. approaches the destination from the same y coordinate (if of equal length)

我的启发式保持不变。达到目标后,我在最后检查了第二个标准。启发式算法效率稍低(以解决转向问题),这也导致必要的相邻坐标始终被搜索。

THIRD, 理想的路径:

1. shortest
2. approaches the destination from the same y coordinate (if of equal length)
3. takes the least number of turns

现在我尝试制作启发式(f):

manhattan distance (h) + path length (g) * number of turns (t)

这当然适用于标准#1和#3,并且固有地解决了转向问题。不幸的是,它现在非常有效,最终对标准#2的测试不起作用,因为探索的节点集不足以重建最佳解决方案。

有人可以告诉我如何将标准#2纳入我的启发式(f),或者如何解决这个问题?

标准2示例:如果目标是(4,6)并且(3,6)和(4,5)的路径具有相同的长度,那么理想的解决方案应该通过(3,6),因为它从Y平面接近(4,5)来自X平面。但是,如果长度不相同,则无论接近哪个平面,都必须优先考虑最短路径。

2 个答案:

答案 0 :(得分:3)

您似乎混淆了A *启发式,Russell & Norvig调用 h ,部分路径成本 g 。这些构成优先级 f = g + h

启发式应该是从当前点到达目标的成本的乐观估计。曼哈顿距离适用于 h ,如果步骤上,下,左,右并且至少占用单位成本。

但是,您的标准2应该在路径费用 g 中,而不是在 h 中。我不确定你是什么意思“从同一个y坐标接近目的地”,但你可以通过给所有其他方法提供无限或非常高的路径成本来禁止/惩罚进入目标节点。完全没有必要修改启发式 h

到目前为止所采用的转数也应该包含在部分路径成本 g 中。如果你能廉价地计算这样的数字,你可能想要在 h 中包含一个(乐观的)估计剩余转数。

答案 1 :(得分:1)

用一些HACK回答我自己的问题。如果您知道更好的方法来解决这个问题,仍然对其他答案,想法,评论感兴趣。

黑客曼哈顿距离是朝Y平面中最近的方格计算的,而不是目的地本身:

dy = min(absolute_value(dy), absolute_value(dy-1));

然后在构造启发式(f)时:

h = hacked_manhattan_distance();
if (h < 2)
   // we are beside close to the goal
   // switch back to real distance
    h = real_manhattan_distance();