如何解决实现A *算法的正确方法是什么?我们是否更新closedSet中的节点?
正如我在A *算法(A-star算法)中一样,我们将节点保留在两个列表中:一个优先级队列和一个规则数组。优先级队列称为openSet,另一个队列称为closedSet。
'openSet'包含我们要访问的节点,closedSet是我们已经访问过的节点。
这是实现A *算法的伪代码:
openSet.add(startNode)
while not openSet.empty():
currentNode = openSet.get()
if currentNode == targetNode: # This is to stop searching when target is found
break
closedSet.add(currentNode)
for neighborNode in currentNode.neighbors:
if neighborNode not in openSet and not in closedSet:
neighborNode.prevIoUsNode = currentNode #building a path from currentNode to neighbor node
neighborNode.g = currentNode.g + adjecentEdge.weight
neighborNode.h = heuristic(neighborNode,targetNode)
neighborNode.f = neighborNode.g + neighborNode.h
openSet.add(neighborNode)
else if neighborNode.g > currentNode.g + adjecentEdge.weight:
neighborNode.prevIoUsNode = currentNode #building a path from currentNode to neighbor node
neighborNode.g = currentNode.g + adjecentEdge.weight
neighborNode.h = heuristic(neighborNode,targetNode)
neighborNode.f = neighborNode.g + neighborNode.h
#Should I remove this part or not?
if neighborNode in closedSet:
closedSet.remove(neighborNode)
openSet.add(neighborNode)
return getPath(startNode,targetNode)
在此代码中,我会更新节点以降低成本,更新是否是closedSet中的节点,如果它是closedSet中的节点,则将其从closedSet中删除并将其添加到openSet中。
我们是否使用A *算法更新closedSet中的节点?
我确实在Python中实现了这两种方法,但都找到了最短的路径。
当我不更新closedSet中的节点时,它会在我的图形中更快地找到路径,但这可能只是一些巧合。
这是实现A *算法的伪代码:
openSet.add(startNode)
while not openSet.empty():
currentNode = openSet.get()
if currentNode == targetNode: # This is to stop searching when target is found
break
closedSet.add(currentNode)
for neighborNode in currentNode.neighbors:
if neighborNode not in openSet and not in closedSet:
neighborNode.prevIoUsNode = currentNode #building a path from currentNode to neighbor node
neighborNode.g = currentNode.g + adjecentEdge.weight
neighborNode.h = heuristic(neighborNode,targetNode)
neighborNode.f = neighborNode.g + neighborNode.h
openSet.add(neighborNode)
else if neighborNode not in closedSet and neighborNode.g > currentNode.g + adjecentEdge.weight:
neighborNode.prevIoUsNode = currentNode #building a path from currentNode to neighbor node
neighborNode.g = currentNode.g + adjecentEdge.weight
neighborNode.h = heuristic(neighborNode,targetNode)
neighborNode.f = neighborNode.g + neighborNode.h
return getPath(startNode,targetNode)
在实施A *算法时,我们是否更新closedSet中的节点?
如果我们更新closedSet中的节点,是否将它们再次添加到openSet中?
解决方法
如果启发式为consistent,则无需更新封闭集中的节点。如果试探法是admissible但不一致一致,则可能需要更新封闭集中的节点。
大多数现实世界中的启发式方法是一致的,因此在实施A *的大部分时间中,该算法的那部分是不必要的,并且从速度上来说根本没有实现。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。