我知道实际的算法需要使用深度优先搜索,但是在另一个搜索算法(如广度优先搜索)上使用它是否有功能原因?
为什么对抗性搜索 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,所以我现在就暂且不谈。