【发布时间】: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