防止深度优先搜索算法陷入无限循环,8拼图

时间:2017-08-17 23:22:19

标签: java algorithm artificial-intelligence depth-first-search

所以我的代码适用于基本的8个拼图问题,但是当我用更难的拼图配置进行测试时,它会遇到无限循环。有人可以编辑我的代码,以防止这种情况发生。请注意,我已经包含了阻止循环或循环的代码。我尝试包括迭代深度优先搜索技术,但这也不起作用。有人可以查看我的代码。

    /** Implementation for the Depth first search algorithm */
static boolean depthFirstSearch(String start, String out ){    

    LinkedList<String> open = new LinkedList<String>();
    open.add(start);

    Set<String> visitedStates = new HashSet<String>();      // to prevent the cyle or loop

    LinkedList<String> closed = new LinkedList<String>();

    boolean isGoalState= false;

    while((!open.isEmpty()) && (isGoalState != true) ){

        String x = open.removeFirst();

        System.out.println(printPuzzle(x)+"\n\n");
        jtr.append(printPuzzle(x) +"\n\n");

        if(x.equals(out)){               // if x is the goal
            isGoalState = true;
            break;
        }
        else{
                                                                // generate children of x 
            LinkedList<String> children = getChildren(x);

            closed.add(x);               // put x on closed
            open.remove(x);             // since x is now in closed, take it out from open

            //eliminate the children of X if its on open or closed ?
            for(int i=0; i< children.size(); i++){
                if(open.contains(children.get(i))){
                    children.remove(children.get(i));
                }
                else if(closed.contains(children.get(i))){
                    children.remove(children.get(i));
                }
            }


            // put remaining children on left end of open   
            for(int i= children.size()-1 ; i>=0 ; i--){
                if ( !visitedStates.contains(children.get(i))) {   // check if state already visited
                       open.addFirst(children.get(i));              // add last child first, and so on 
                       visitedStates.add(children.get(i));
                }
            }

        }
    }

        return true;
    }

1 个答案:

答案 0 :(得分:0)

我建议将你正在考虑的职位放在https://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html中,并根据他们离解决的距离有所不同。

所以你所做的就是从队列中取出最近的位置,然后从尚未处理过的所有一个移动选项中添加。然后重复一遍您将花费大部分时间来探索接近解决的可能性,而不是永远随机移动。

现在你的问题是&#34;我们离解决它的距离有多近&#34;。一种方法是将所有出租车距离的总和取为正方形所在的位置和它们所需的位置。一个更好的启发式方法可能是给予更多的权重,让角球首先远离角落。如果你做对了,改变你的启发式应该很容易。