【发布时间】:2012-09-23 11:35:26
【问题描述】:
我正在尝试多种搜索算法来解决广义 AI 问题,其中之一是深度优先搜索。我已经将广度优先搜索、贪心搜索和 A* 搜索从它们的自然递归形式转换为迭代形式,但是在使用深度优先搜索 cleanly 时遇到了更多麻烦(尽管这并不超出我的能力,我不确定这样做的最pythonic方式,因此问题)。
我遇到了 CPython 的 1000 次递归调用限制,即使是一些中型问题。后继状态是延迟生成的(_generate_states 是生成器,不是列表),并且需要从初始状态开始的路径。
从使用调用堆栈到显式堆栈的最 Pythonic 方式是什么?堆栈中应该存储多少信息?回溯时(当没有状态返回非空列表时),从堆栈前面弹出死信息的最佳方法是什么?
def dfs(initial, closed_set, goal, capacity):
if initial == goal:
return [initial]
for state in _generate_states(initial, capacity):
if state not in closed_set:
result = dfs(state, [initial] + closed_set, goal, capacity)
if result:
return [state] + result
return []
【问题讨论】:
-
我不知道是否有最 Pythonic 的方式,但我很好奇是否有其他人有比这更好的答案。应该存储多少信息的答案是“不超过算法工作所需的量”。
-
只是一个小改进 - 如果您使用 deque 而不是列表,您可能会获得稍微更快的堆栈。
-
@Omnifarious 当我优化 BF 时也是这种情况,我存储了很多冗余路径(因为每个当前层节点都有相同的父路径)。我也很想知道处理这方面的最佳方法。
-
DFS 的非递归代码看起来应该与 BFS 几乎相同,除了您将使用堆栈而不是队列。
-
我不得不承认我是多么讨厌“pythonic”这个词。
标签: python recursion artificial-intelligence iteration depth-first-search