我正在使用DFS,BFS,UCS和A *等搜索算法在迷宫世界中为pacman实现AI。 DFS的实现非常简单,但对于BFS我很混乱。我不知道如何实现它,因为我无法理解pacman怎么可能从一个位置开始并将其邻居的位置排队并检查它们并进入它们。 :/ 谁能帮我? !
答案 0 :(得分:2)
在BFS中,您遍历算法并发现到每个节点的最短路径。
为了稍后获取此路径,您需要存储parent:V->V
,换句话说,您需要“记住”从哪个单元格到当前单元格。这可以通过存储字典/地图轻松完成,其中键是单元格,值是您用来发现密钥的单元格。
在伪代码中:
BFS(source, target):
queue = empty new queue
queue.add(source)
parent= new dictionary
parent.add(source, None)
while (queue.empty() == false):
curr = queue.dequeue()
if (curr == target)
return getPath(dict, curr)
for each neighbor u of curr:
if u is not a key in parent:
parent[u] = curr
queue.add(u)
上面的BFS填充parent
字典,并且路径由以下getPath()函数返回,该函数基本上遍历字典,直到找到“root”(原始源节点)。 / p>
getPath(dict, target):
sol = [] //empty list
curr = target
while curr != None:
sol.addFirst(curr)
curr = dict.get(curr)
答案 1 :(得分:1)
如果您正在寻找最短路径,则必须记住已访问过的位置,因为最短路径将仅使用其所有位置一次。
以下是该算法的简化版本:
Q := an empty queue of positions
V := an empty set of already visited positions
Q.pushBack( initial position )
While Q is not empty:
current_position := Q.popFront()
If current_position == goal_position:
Return "You won!"
If current_position Is Not In V:
Q.pushBack( NeighboursOf(current_position) )
我使用了一个非常简单的状态,只持有位置。 但是如果你想要一个完整的算法,你的状态必须包含位置加上这个位置的路径。当你比较两个状态时,只需比较位置,而不是路径。