【问题标题】:Why doesn't my a* algorithm take the shortest route?为什么我的a*算法不走最短路径?
【发布时间】:2016-06-18 13:17:17
【问题描述】:

我的 a* 算法并不总是采用最短路径。

在这张图片中,机器人必须穿过黑色方块,河流和树木是障碍物。黑线是它走过的路径,这显然不是最短的路径,因为它不应该下降。

http://imgur.com/GBoq9py

这是我的 a* 代码和我正在使用的启发式算法:

def HeuristicCostEstimate(start, goal):
    (x1, y1) = start
    (x2, y2) = goal
    return abs(x1 - x2) + abs(y1 - y2)

def AStar(grid, start, goal):
    entry = 1
    openSet = []
    heappush(openSet,(1, entry, start))
    cameFrom = {}
    currentCost = {}
    cameFrom[tuple(start)] = None
    currentCost[tuple(start)] = 0
    while not openSet == []:
        current = heappop(openSet)[2]
        print(current)
        if current == goal:
            break

        for next in grid.Neighbours(current):
            newCost = currentCost[tuple(current)] + grid.Cost(current, next)
            if tuple(next) not in currentCost or newCost < currentCost[tuple(next)]:
                currentCost[tuple(next)] = newCost
                priority = newCost + HeuristicCostEstimate(goal, next)
                entry +=1
                heappush(openSet,(priority, entry, next))
                cameFrom[tuple(next)] = current

    return cameFrom, current

http://pastebin.com/bEw8x0Lx

感谢您的帮助!并随时要求我澄清任何事情。

编辑:通过返回 0 删除启发式解决了这个问题。这表明问题出在我的启发式上。有谁知道是什么原因造成的吗?

【问题讨论】:

  • 将您的代码粘贴到您的问题中。要使其成为代码块,请将其突出显示并按 Ctrl+k。
  • 代码太多了,不能指望别人帮你调试。
  • 谢谢大家,我现在已经用相关代码编辑了。
  • 我不明白为什么如果它必须走在黑色方块上,这不是最短路径
  • 如果您的启发式算法可以高估成本,那么它是“不可接受的”并且可能导致 A* 找不到最短路径。尝试构建一个测试夹具来计算实际的最短路径,并将其与您的启发式进行比较。

标签: python algorithm shortest-path a-star


【解决方案1】:

A* 并不总能保证找到最短路径。虽然确实没有启发式 (h(n) = 0),但会找到最短路径(它成为 Dijkstra 算法),但这并不意味着使用任何启发式都会找到最短路径。添加启发式算法是为了加快搜索速度,但代价是在某些情况下您找不到最短路径。

要了解发生了什么,请记住启发式是对目标实际距离的估计。如果预测是完美的,则图基本上是预先计算好的。考虑以下情况。

  • 如果您的启发式低于实际成本,则最短路径 会被发现的。

  • 如果启发式等于实际成本,则所有最短路径都是 基本上是预先计算好的,并且会找到最短路径 没有任何不必要的探索。

  • 如果启发式有时大于实际成本,则 A* 不保证能找到最短路径,但搜索时间可能 比启发式低估时要快。

您的启发式方法似乎低估了成本。也可能是您的邻居生成或成本计算器有问题。

进一步阅读:http://theory.stanford.edu/~amitp/GameProgramming/Heuristics.html

【讨论】:

  • 谢谢。我认为这与我的启发式方法没有考虑障碍有关。我会看看是否有更好的启发式方法。
  • 除了我在回答中概述的阅读内容之外,我建议阅读关于以下问题的讨论。在不同的答案中有多个好的链接。 stackoverflow.com/questions/29656932/…
  • 我认为我的启发式总是低估了,因为它找到了最短距离并返回。这不是它的作用吗?
  • 您对 A* 劣势的表述并非 100% 正确。你的链接证明了这一点。 A* 不能保证找到所有路径(Dijkstra 或 BFS 会以牺牲搜索时间为代价)。但如果启发式永远不会大于真实距离,A* 确实保证找到一条最短路径。这个条件是算法的重要组成部分。否则它不是 A* (或者是它的错误实现)。在 Dijkstra 中出现编码错误,它也不能保证找到任何路径。这就像说现代汽车不能保证在没有发动机的情况下行驶。当然不是,因为它不是汽车……
  • 并且低估启发式算法根本不是问题,因为欧几里得距离总是比最终路径短。高估了,这是个问题。我赞成,因为总体而言这仍然是一个很好的答案。
猜你喜欢
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多