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平面。但是,如果长度不相同,则无论接近哪个平面,都必须优先考虑最短路径。
答案 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();