我正在尝试一些广义AI问题的搜索算法,其中之一是深度优先搜索。我将广度优先搜索,贪婪搜索和A *搜索从它们的自然递归形式转换为迭代搜索,但是在深度优先搜索中执行它有点麻烦cleanly
(虽然它不超出我的能力,但我我不确定最好的方法,因此问题)。避免Python堆栈
即使是一些中型问题,我也遇到了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 []
我不知道有一个最Python的方式,但我很好奇,如果任何人有比这更好的答案。而应该存储多少信息的答案是“不超过您对算法工作的要求”。 – Omnifarious
只是一个小改进 - 如果您使用[deque](http://docs.python.org/library/collections.html#collections.deque)而不是列表,则可能会获得_slightly_更快的堆栈。 –
@Omnifarious当我优化存储大量冗余路径(因为每个当前层节点都有相同的父路径)时,BF也是如此。我很好奇看到处理这个问题的最好方法。 – efritz