更新: 最初の解決策を検索します。
通常の深さ優先検索の場合は単純で、ハッシュセットを使用するだけです
bool DFS (currentState) =
{
if (myHashSet.Contains(currentState))
{
return;
}
else
{
myHashSet.Add(currentState);
}
if (IsSolution(currentState) return true;
else
{
for (var nextState in GetNextStates(currentState))
if (DFS(nextState)) return true;
}
return false;
}
しかし、深さ制限になると、これだけでは済まされない
bool DFS (currentState, maxDepth) =
{
if (maxDepth = 0) return false;
if (myHashSet.Contains(currentState))
{
return;
}
else
{
myHashSet.Add(currentState);
}
if (IsSolution(currentState) return true;
else
{
for (var nextState in GetNextStates(currentState))
if (DFS(nextState, maxDepth - 1)) return true;
}
return false;
}
その場合、事前に完全な検索を行うことはありません (ある意味で、解決策があれば常に見つけることができるという意味で)。maxdepth
どうすれば直せますか?アルゴリズムにスペースの複雑さが追加されますか?
または、状態をメモする必要がまったくありません。
アップデート:
たとえば、決定木は次のようになります。
A - B - C - D - E - A
|
F - G (Goal)
状態 A から開始し、G はゴール状態です。明らかに、深さ 3 の下に解があります。
ただし、深さ 4 で私の実装を使用すると、検索の方向がたまたま
A(0) -> B(1) -> C(2) -> D(3) -> E(4) -> F(5)
深さを超えると、 に戻りますがA
、E
訪問された場合、チェック方向は無視されますA - E - F - G