【问题标题】:A* efficiency vs Greedy Best FirstA* 效率与贪婪的最佳优先
【发布时间】:2015-02-22 06:28:29
【问题描述】:

给定以下迷宫:

|||||||||||||||||||||||||||||||||||||
|       | | |           |   |     | |
| ||||||| | ||| | ||| ||| ||||||| | |
|       |       | |     |     | |   |
||||| ||||| ||| | | | ||| ||||| | |||
|   | | | |   | | | |   | |   | |   |
| ||| | | | ||| ||||| ||| | ||| ||| |
|       |     |   |   |     | | |   |
||| ||||||||| ||||||| ||| ||| | | | |
|             |       | |   |     | |
| | ||||| | ||| | | ||| | ||| ||| | |
| | |     | | | | |     |   | | | | |
| | | ||||||| | ||||||||| ||| | ||| |
| | | |     |   |     |     |   |   |
||| ||| | ||||| ||||| ||| ||| ||||| |
|     | | |     | |     | |   | | | |
| | | | | ||| ||| ||| ||| | | | | | |
| | | | |                 | | |     |
||| ||||||| | | ||||| ||| | ||| |||||
|       | | | |     |   |     | |   |
||||| | | ||||||||| ||||||||||| | |||
|   | |           | |     |   | |   |
| ||| ||||| ||||||||| ||||| | | ||| |
| |   |      |        |     |       |
| | | ||||| ||| | | | | |||||||||||||
| | |   |     | | | |       |   | | |
| | ||| ||| | | | ||||||||| ||| | | |
| |   | |   | | |   | |   | | |     |
| ||| ||| ||||| ||| | | ||||| | |||||
|       |   |     | |     |   | |   |
||| | ||||| ||||| ||| ||| | ||| | |||
| | | | | | | |     | |   | |   | | |
| | ||| | | | | ||||||||| | | | | | |
|   |   |   |                 |     |
| | | | ||| ||| ||||||| ||| ||| ||| |
|+| | |       |   |       |   | |  P|
|||||||||||||||||||||||||||||||||||||

我有来自两种不同算法的两个结果(其中,我希望是 A* 和 Greedy First 的正确实现):

                                    #nodes searched; hops to goal
large maze - a* -                   expanded: 1120 (cost: 209)
large maze - greedy -               expanded: 916 (cost: 209)

这是正常行为吗?在给定单一路径的情况下,A* 并不总是最优比其他算法更有效吗?我知道这取决于问题设置,但这也通过更大的测试进行了复制:

mega maze - a* -                    expanded: 8964 (837)
mega maze - greedy (mh heur) -      expanded: 5455 (837)

我认为 A* 应该在这里优于 Greedy First 是不是错了? 以下是我的启发式方法...也许我的启发式值设置错误?:

#greedy
self.heuristic = abs(goalNodeXY[0] - self.xy[0]) + abs(goalNodeXY[1] - self.xy[1])

#A* --- costFromStart == path length from starting point
self.heuristic = math.hypot(self.xy[1]-goalNodeXY[1],self.xy[0]-goalNodeXY[0]) + costFromStart

【问题讨论】:

  • 这些数字是什么单位?秒? MB 内存?
  • 对不起.. 这只是节点/路径长度。 1 跳 = 1。我会在问题中澄清

标签: python artificial-intelligence path-finding heuristics


【解决方案1】:

在给定单一路径的情况下,A* 并不总是最优并且比其他算法更有效吗?

没有。 A* 总能找到最佳路径,但并不总是比其他算法更快。贪婪搜索有时做得更好是完全正常的。

此外,您的 A* 启发式不如用于贪心算法的启发式。您在贪心算法中使用了曼哈顿距离,在 A* 搜索中使用了欧几里得距离;曼哈顿距离始终是对剩余路径长度的更好估计,并且永远不会高估,因此在 A* 搜索中也使用曼哈顿距离会更好。

【讨论】:

  • 您能否详细说明这一点? Manhattan distance is always a better estimate of the remaining path length [vs Euclidean] -- 我刚刚将 A* 的启发式更改为 MHD + currentCost,但与 Euclidean + currentCost 相比,它在搜索过程中扩展了近 200 个额外节点?你的观点是笼统的吗?
  • @MrDuk:剩余路径长度至少是当前位置到目标的曼哈顿距离,而曼哈顿距离总是至少是欧几里得距离。我没想到你会得到结果,但这当然是可能的;使用更准确的启发式通常会减少扩展节点的数量,但并非总是如此。
【解决方案2】:

A* 的一个很好的启发式方法是最接近剩余距离的方法(如果您需要 A* 始终找到最佳路径,也永远不会超过它)。由于迷宫中的距离被定义为遍历的单元数,因此如果明显优于欧几里德距离(假设),您的贪婪启发式近似值,因为它可以完美地预测剩余部分没有障碍物的情况,并且如果有障碍物,总是更接近真实距离。

因此,您的第一种方法绝对优于第二种方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-23
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多