【问题标题】:Speed of simplifying A* [closed]简化 A* 的速度 [关闭]
【发布时间】:2013-04-22 09:37:27
【问题描述】:

一段时间以来,我一直在尝试优化我自己的 A* 搜索算法实现,最终稍微改变了实际的算法部分。

我一直想知道这种方法是否会比常规 A* 更快。为什么或者为什么不?如果是这样,有什么理由使用常规 A* 而不是这种略有不同的方法?

def find_path(a, b):
    seen = set()
    opened = set()

    parent = {}
    distance = {a: path_distance(a, b)}

    while opened:
        node = min(opened, key=lambda x: distance[x])

        if node == end:
            path = []

            while node in parent:
                path.append(node)
                node = parent[node]

            return path

        opened.remove(node)

        for neighbor in node.neighbors:
            if neighbor not in seen:
                seen.add(neighbor)
                opened.add(neighbor)

                parent[neighbor] = node
                distance[neighbor] = pathDistance(neighbor, b)

def path_distance(a, b):
    return sum(y - x for x, y in zip(a.position, b.position))

我知道使用堆队列,但这不是这个问题的重点。

【问题讨论】:

  • 我一直想知道这种方法是否会比常规 A 更快 *:你为什么不直接测试它?
  • 愿意解释一下您所做的更改及其背后的原因吗?
  • 什么是“常规 A*”?我认为没有具体的参考实现。
  • 我不是说“它更快吗?”就确切的实际数字而言,我在理论上更想知道。是否有任何理由使用常规 A* 来代替这种方法?
  • @poke:例如,参见维基百科上的伪代码。 en.wikipedia.org/wiki/A*

标签: python performance optimization a-star path-finding


【解决方案1】:

原件有一个开集和一个闭集。它将检查邻居 是否 在封闭集中,如果该暂定分数较高,则将跳过它。如果它在打开的集合中不是,或者暂定分数较低,则将其作为更好的路径。

你有一个打开的集合和一个可见的集合。你检查它是否 not 在 seen 集合中,在这种情况下,你会将它添加到 seen 并使用它。

这是非常不同的,可能会给出不正确的结果。据我所知,您的算法不会产生最短路径,它只会始终使用最后一个邻居作为路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    相关资源
    最近更新 更多