私は、一般化された AI の問題に対して多くの検索アルゴリズムを試しています。そのうちの 1 つは深さ優先検索です。幅優先検索、欲張り検索、および 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 []