Python A *寻路,这行做什么?

时间:2013-09-29 16:32:28

标签: python a-star

我正在审查这个堆栈溢出帖子 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 []

1 个答案:

答案 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)操作。