我一直试图优化我自己的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))
我知道使用堆队列,但这不是这个问题的焦点。
答案 0 :(得分:2)
原件有一个打开的设置和一个关闭的设置。它将检查封闭集中的邻居是否,如果该临时分数更高,则它将跳过它。如果在打开的集合中不,或者暂定得分较低,则会将其用作更好的路径。
你有一个打开的集合和一个看到的集合。你检查看到的集合中是否不,在这种情况下你会将它添加到看到的地方,并使用它。
这是非常不同的,可能会给出不正确的结果。据我所知,你的算法不会导致最短的路径,它只会总是使用最后一个邻居作为路径。