更新:搜索第一个解决方案。
对于普通的深度优先搜索很简单,只需使用哈希集
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