为什么对抗性搜索 minimax 算法使用深度优先搜索 (DFS) 而不是广度优先搜索 (BFS)?

人工智能 搜索 极小极大 广度优先搜索 深度优先搜索 对抗搜索
2021-11-03 18:02:28

我知道实际的算法需要使用深度优先搜索,但是在另一个搜索算法(如广度优先搜索)上使用它是否有功能原因?

1个回答

主要原因是广度优先搜索需要更多内存(由于分配内存需要时间,在内存中跳转而不是处理仍在 CPU 缓存中的内容,这可能也会使其在实践中变慢一点,等等。)。广度优先搜索需要内存来记住所有不同分支中的“位置”,而深度优先搜索在递归之前首先完成整个路径——这实际上不需要任何内存,除了堆栈跟踪。这是假设我们对 DFS 使用递归实现——我们通常在 minimax 的情况下这样做。

如果您查看这两种方法的伪代码,您可以清楚地看到这一点(忽略此处的极小极大细节,仅提供用于简单搜索的伪代码):

BreadthFirstSearch(start):
    Q = new queue()
    Q.append(start)
    while Q is not empty:
        node = Q.pop()
        if node is leaf:
            do something with leaf
        else:
            for each child of node:
                Q.append(child)

DepthFirstSearch(start):
    if start is leaf:
        do something with leaf
    for each child of start:
        DepthFirstSearch(child)
        // probably do something with return value from the recursive DFS call

您会看到 BFS 需要一个队列对象,该对象在内存中显式存储一堆东西,而 DFS 不需要。


一旦你了解了 Minimax 的扩展,还有更多的故事,比如 Alpha-Beta 剪枝和迭代深化……但由于问题只是关于 Minimax,所以我现在就暂且不谈。