【发布时间】:2013-10-01 20:58:31
【问题描述】:
我已经实现了一个 A* 算法来找到网格世界中两点之间的最短路径。对于较大的路径长度,该算法需要很长时间。我首先想知道我的实现是否正确,是否可以进行任何优化?
aStar 算法的参数是您的当前位置以及您希望作为(x,y) 元组前往的位置。
节点的Node.value 是一个行进方向(NSEW),getAdjacentNodes() 返回一个与我们可以行进到的节点直接相邻的节点列表。
#Perform an A* search to find the best path to the dirt
def aStar(self, current, end):
openSet = set() #Set of explorable nodes
openHeap = [] #All paths heap, lowest cost on top
closedSet = set() #Best path so far
curNode = Node(0, current, self.manHatDist(current, end))
openSet.add(curNode)
openHeap.append((curNode.cost,curNode))
while openSet:
curNode = heapq.heappop(openHeap)[1]
if curNode.pos == end:
return self.getDirections(curNode)
openSet.remove(curNode)
closedSet.add(curNode)
for tile in self.getAdjacentNodes(curNode.pos):
if tile not in closedSet:
tile.parent = curNode
tile.cost = self.manHatDist(curNode.pos, end) + self.euclidDist(curNode.pos, current) + curNode.cost
if tile not in openSet:
openSet.add(tile)
heapq.heappush(openHeap, (tile.cost,tile))
return []
#Get the moves made to get to this endNode
def getDirections(self, endNode):
moves = []
tmpNode = endNode
while tmpNode.parent is not None:
moves.append(tmpNode.value)
tmpNode = tmpNode.parent
moves.reverse()
return moves
节点类
# Node class for A* search
class Node:
def __init__(self, value, pos, cost):
self.pos = pos
self.cost = cost
self.value = value
self.parent = None
def __lt__(a, b):
if(a.cost < b.cost):
return 1
return 0
def __gt__(a, b):
if(a.cost > b.cost):
return 1
return 0
编辑 - 这是getAdjacentNodes 方法
#Return all possible moves from given tile as Node objects
def getAdjacentNodes(self, curPos):
allMoves = ['North','South','East','West']
posMoves = []
for direction in allMoves:
if(self.canMove(direction, curPos)):
posMoves.append(Node(direction, self.getLocIfMove(curPos, direction), 0))
return posMoves
EDIT2 - 分析结果
【问题讨论】:
-
代码对我来说看起来还不错,我做了一个类似的代码,在迷宫图像中寻找一条路径。通过将循环中的局部变量分配给 tile ,您可以在 for tile in ... 循环中获得一点好处,这样 Python 就不必每次使用它时都查找它。即 t = tile 并在整个循环的其余部分中使用 t,而不是 tile。您是否尝试过分析并查看它最挂在哪里? cyrille.rossant.net/profiling-and-optimizing-python-code
-
类似
for t=tile in adjacentNodes? -
瓷砖中的瓷砖:t = tile 并使用 tthoughout,而不是 tile
-
一个更好的分析链接,pymotw.com/2/profile
-
+1 到线分析器。 // 我有几个问题。为什么选择 A*(A* 几乎不是最好的算法)? Numpy 是一种选择吗?为什么你的
__lt__/__gt__类返回1/0而不是return a.cost > b.cost?这是 Python 3 吗?避免上课是否会给您带来任何速度提升(记住tuples 有排序顺序)?
标签: python optimization path-finding