【问题标题】:Weird behavior in A* algorithm with diagonal heuristic具有对角启发式的 A* 算法中的奇怪行为
【发布时间】:2014-10-25 03:14:48
【问题描述】:

我正在使用 A* 算法,所以我可以用网络摄像头拍摄迷宫的照片并让程序解决它。 结果如下:

当我使用 h = 0 时,我得到了一个很好的解决方案。使用曼哈顿距离也提供了一个很好的解决方案。然而,对角线距离会做一些奇怪的事情,比如我用绿色圈出的图案。或者更奇怪的是这个,来自不同的迷宫:

我是否错误地实现了对角线距离?

public void findHeuristic()
{
    int dx = Math.abs(x - MazeBot.goal.x);
    int dy = Math.abs(y - MazeBot.goal.y);

    h = 10 * (dx + dy) - 6 * Math.min(dx, dy); //diagonal distance
}

【问题讨论】:

  • 您能解释一下为什么您采用这种方式实现对角距离吗? 10 和 6 是从哪里来的?天真地,您似乎想使用距离公式 (sqrt(dx^2 + dy^2),但也许我错过了您的情况的一个微妙之处。
  • 我按照这里的指南进行操作:theory.stanford.edu/~amitp/GameProgramming/…

标签: java path-finding a-star heuristics


【解决方案1】:

我以前没有听过“对角距离”这个词,但我想我明白你的意思了——你正在测量你可以垂直、水平或垂直跳跃需要多少次“跳跃”对角线。我无法弄清楚为什么你的系数来自哪里,除非你想通过移动的长度来加权跳跃。在这种情况下,您才刚刚开始逼近欧几里得度量。

因此,假设每个“跳跃”的大小相同:dx + dy - Math.min(dx, dy)

但是,请注意对角线作业实际上是 sqrt(2) 长度,您最终会得到 (dx + dy) - (2 - Math.sqrt(2)) * Math.min(dx, dy)。那是关于(dx + dy) - 0.5857 * Math.min(dx, dy)。我假设您希望保持整数并且没有速度和效率的除法,并且由于如果输出按正常数缩放它不会改变您的启发式的效用,您只需通过将所有内容相乘来选择一些非常接近的系数到 10 点:10 * (dx + dy) - 5.857 * Math.min(dx, dy) 大约是 10 * (dx + dy) - 6 * Math.min(dx, dy)'。 (你现在拥有的。)

由于您创建了更精细的欧几里得度量近似值,因此您的路径必然会假定更直接地指向目标。但是,由于您的近似值实际上是近似值的近似值,因此您最终会得到一些奇怪的结果:

您的Math.min(dx, dy) 越大,自6 > 5.857 以来的错误越大,您实际上使对角线路径的成本低于应有的成本,但随着您越来越接近它们,非对角线路径开始测量得相对更好。这本身并不会导致一条真正不太理想的路径,但我希望它会在您的遍历中产生一些难以预测的陌生感。

【讨论】:

  • A* 仅在您的启发式是可接受的情况下才有效,也就是说,如果您从不高估真实距离。如果你这样做了,所有的赌注都会被取消。
  • 嗯,有趣。我想我会坚持曼哈顿距离。顺便说一句,我正在按照此处的指南进行启发式操作:theory.stanford.edu/~amitp/GameProgramming/…
猜你喜欢
  • 1970-01-01
  • 2014-06-05
  • 2019-04-06
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 2022-01-13
  • 1970-01-01
相关资源
最近更新 更多