我正在审查这个堆栈溢出帖子 Python - Speed up an A Star Pathfinding Algorithm
我正在尝试确定行for tile in graph[current]:
代表什么。即graph[]
代表什么。我觉得图形应该代表整个网格,但我猜测这是因为我们在图形上给[]运算符赋予当前参数,所以它必须返回一些东西,但我不确定它应该是什么。也许我们可以前往的那些瓷砖与当前的瓷砖直接相邻?
此语法对current = heapq.heappop(openHeap)[1]
的意义是什么?
import heapq
def aStar(self, graph, current, end):
openSet = set()
openHeap = []
closedSet = set()
def retracePath(c):
path = [c]
while c.parent is not None:
c = c.parent
path.append(c)
path.reverse()
return path
openSet.add(current)
openHeap.append((0,current))
while openSet:
current = heapq.heappop(openHeap)[1]
if current == end:
return retracePath(current)
openSet.remove(current)
closedSet.add(current)
for tile in graph[current]:
if tile not in closedSet:
tile.H = (abs(end.x-tile.x)+abs(end.y-tile.y))*10
if tile not in openSet:
openSet.add(tile)
heapq.heappush(openHeap, (tile.H,tile))
tile.parent = current
return []
答案 0 :(得分:0)
我相信graph
变量是某种类型的字典,其中键是当前图块,值是所有有效相邻图块的列表。这样,图表中的每个节点都可以通过简单的字典查找轻松访问。
作者在原始帖子中链接的维基百科上的pseudocode支持此假设 - 功能等效的行列为for each neighbor in neighbor_nodes(current)
current = heapq.heappop(openHeap)[1]
行正在做的是返回文字图块对象。如果您观察到行openHeap.append((0,current))
和heapq.heappush(openHeap, (tile.H,tile))
,您可以观察到作者正在向openHeap
添加两个元素的元组,其中第一个元素是启发式,第二个元素是文字瓷砖对象。
因此,行current = heapq.heappop(openHeap)[1]
与写作相同:
temp = heapq.heappop(openHeap)
current = temp[1]
......或写作:
h, current = heapq.heappop(openHeap)
heaqpq.heappop()
函数本身正在做的是返回堆中的最小元素。据推测,它使用元组中的第一个元素进行索引,因此将使用最小的启发式返回打开的tile作为廉价的O(1)操作。