Java の for ループに問題があります。反復ディープ検索を実行しようとしていますが、深さ n で子を生成するコードは次のようになります。
for(Iterator<puzzleBoard> child = generateSuccessorsIDS(pb).iterator(); child.hasNext();){
DLS(child.next(),(depth-1));
}
return ステートメントを使用しない場合、DLS は本来あるべき動作を行いますが、return ステートメントがないため、呼び出し元の関数に値が到達しません。return DLS(...) を使用すると、イテレータが生成する最初の値が返されます。これを解決するには?DLS 全体と呼び出し元関数を以下に貼り付けます。
private puzzleBoard IDS(String initial){
puzzleBoard pb = new puzzleBoard(initial,0,new Vector<Integer>(),new Vector<puzzleBoard>(),new Vector<puzzleBoard>());
puzzleBoard result=new puzzleBoard("999999999",0,new Vector<Integer>(),new Vector<puzzleBoard>(),new Vector<puzzleBoard>());
for(int depth=0;depth<3;depth++){//Repeat
System.out.println("DP "+depth);
result = DLS(pb,depth);
System.out.println("Here: "+result.toString());
if(result.isGoalState())
return result;
}
return new puzzleBoard("999999999",0,new Vector<Integer>());
}
private puzzleBoard DLS(puzzleBoard pb, int depth){
pb.printPuzzle();
if(depth==0 && pb.isGoalState()){
System.out.println("!!!!!WOOOOOW!!!!!");
return pb;
}
else if(depth>0){
for(Iterator<puzzleBoard> child = generateSuccessorsIDS(pb).iterator(); child.hasNext();){
DLS(child.next(),(depth-1));
}
}
else
return new puzzleBoard("999999999",0,new Vector<Integer>(),new Vector<puzzleBoard>(),new Vector<puzzleBoard>());
return pb;
}