BFS算法如何告诉我们从源到目标的最短路径?

时间:2016-05-02 18:07:08

标签: algorithm

我知道什么是BFS算法以及它是如何实现的,但有人会告诉我如何使用它来找到两点之间的最短路径......我特意要求pacman游戏板。幽灵如何使用BFS到达目标(pacman)?

3 个答案:

答案 0 :(得分:2)

您可以将Pacman地图转换为连接节点的图表。将地图的每个单元格转换为图形的节点。如果您可以直接从一个单元格到另一个单元格(即它们是相邻的),请连接它们。

如果幽灵在走廊里,那么他可以去两个相邻的牢房。因此,当前单元在图中具有两个相邻节点。如果他在一个十字路口,那么还有更多的路要走。每个细胞都是如此。

幽灵然后搜索图形,好像它是一个植根于幽灵当前所在单元格的树。

enter image description here

  • 请注意,如果BFS在此图片中从左向右搜索,则可能会发现许多节点为“15”,但它会找到“2”并具有最短路径。
  • 如果'14'然后变成另一个连接并且通过'1'到达'2'并不重要,因为该路径 比我们已找到的路径长()因为“14”的路径已经更长了。

你必须以某种方式记住你在当前树中采用的路径('当前',因为对于下一个鬼位置它将是不同的)。在DFS中,您将使用您拥有的堆栈。这里我们使用BFS,所以你可以做的是让图中的每个节点都有一个空的额外字段。执行BFS时,将节点的前任存储在该字段中。示例:在5的额外字段中存储'6'。当你找到目标'2'时,你会走过那条链:2-> 3-> 4-> 5-> 6,然后你扭转它!

答案 1 :(得分:1)

BFS ,与另一个答案提到的相比,能够正确找到未加权图表中节点之间的最短路径。在未加权的图形中,路径的长度只是从源到目标的边数。

pacman板可以被认为是一个未加权的图:板的每个方块(不是墙)都是一个节点,并且与其直接邻居有边缘。

当幽灵搜索到PacMan的最短路径时,它会从它所在的方格开始在此图表上进行BFS搜索。一旦搜索找到PacMan,我们就可以回溯到找到最短路径。我们将获得一系列动作(例如North - > West - > South ...),ghost将需要按照此路径到达pacman的当前位置。

然而,如果pacman也在与鬼魂同时移动,我们需要在每次移动后重新运行BFS以找到到达新位置的最短路径。

答案 2 :(得分:0)

没有。 BFS只是搜索图形或树的一种方式。

要计算两点之间的最短路径,您需要一个算法来做到这一点。使用优先级队列可以很容易地实现Dijkstras算法。有人可能会争辩说Dijkstras算法是BFS(优先级队列与队列)的特例。

  

我们被告知必须使用BFS搜索到pacman的最短路径

使用GIMP超过四分钟我设法创建了一张图片,为什么BFS深度不足以确定最短路径。

enter image description here

红G是幽灵。黄色P是我们的英雄。蓝点是关于幽灵应该采取什么路径的决定的交叉点。绿线是最短的路径。粉红色? line是BFS首先找到的路径。

编辑:我刚刚意识到我对这些路径做出了错误的选择,它们距离我们都只有三层。我只追踪了点而不是实际的分支。我确信G和P有更合适的位置可以更清楚地显示BFS - 最短路径差异。

问题的标题可能是错误传达。 BFS是鬼魂找到吃豆人的合理方式,但它并不是最短的路径。

编辑:回应评论。如果Pac-Man板表示为加权图,则会回答这个问题。像

这样的东西
|-----A-----|X|------B-----|
|XXXXX|XXXXX|X|XXXXXX|XXXXX|
oXXXXX3XXXXX|X|XXXXXX|XXXXXo
|XXXXX|XXXXX|X|XXXXXX|XXXXX|
C-----D-----E-F------G-----H

或作为邻居代表

AD 4
CD 6 etc..

如果东西是所有像素,BFS会以非常简单的方式减少到尝试大多数路径

我通过谷歌从http://trelford.com/blog/image.axd?picture=maze_thumb.png偷走了pacman背景。

至于幽灵运动的实际实施,可在http://gameinternals.com/post/2072558330/understanding-pac-man-ghost-behavior

进行深入分析