【发布时间】:2012-02-09 01:26:52
【问题描述】:
我正在使用 Java 来解决使用 DFS 的 8-Puzzle 问题。
这是我想出的:
public static boolean found = false;
public void solveDepthFirst(EightPuzzle currentState, int lastMove){
if(currentState.goal()){
System.out.println(currentState);
found = true;//to stop DFS when a solution is found (even if not optimal)
return;
}
for(int i=0;i<numMoves;++i){
if(found) return;
EightPuzzle e = currentState.move(i);//0 = up, 1 = down, 2 = left, 3= right
if(!e.equals(currentState) && i != lastMove
&& !visitedNodes.contains(e.toString())){
solveDepthFirst(e, i);
}
if(!visitedNodes.contains(currentState.toString())){
visitedNodes.add(currentState.toString());
}
}
}
!e.equals(currentState) 检查是否可以移动。 (如果 currentState.move(i) 超出范围,则 move() 返回相同的状态)
i != lastMove 确保如果在上一次移动中你向右移动,你现在不会向左移动(因为它没有意义)
visitedNodes 是已访问节点的 HashSet。
堆栈空间不足。当我使用 -xss10m 将堆栈空间从 128k 增加到 10m 时,算法工作正常。但是,我确信可以进行大量其他优化。
任何提示将不胜感激。
【问题讨论】:
标签: java artificial-intelligence stack-overflow depth-first-search