BFS功能正确吗?

时间:2014-02-23 00:29:08

标签: algorithm breadth-first-search

问题是使用bfs函数构建/找到peg solitare游戏的解决方案。您将获得一个包含开始状态的节点,从该状态开始,节点将扩展为更多状态(其子节点)。一旦找到包含目标状态的节点,该函数就应该停止。

public void search(){
    bfs.add(StartGoal);
while(!bfs.isEmpty()) {
    node = bfs.poll();  
    if(node.isGoal()){System.out.println("success"); return;}
    node.expand();
    for(MyNode m : node.childs){
        if(!m.isGoal()){
            m.setVisited();
            bfs.add(m);}}
        node.setVisited();
    }

expand函数,启动子链接列表并根据下一个可能的板状态创建子节点。

public void expand(){
    if(childs != null) return;//already expanded do nothing
    else{
    childs= new LinkedList<MyNode>();
    for(BoardState b: state.nextStates())
        childs.add(new MyNode(this, b));}   
}

我运行了代码并对其进行了多次改进。一旦队列达到300万以上,它就会因空间不足而崩溃。我的问题是:这最终会起作用吗?代码是否正确?

这是我的第一篇文章,很抱歉,如果我很好地格式化问题。 感谢。

1 个答案:

答案 0 :(得分:0)

您的代码不正确。我看到两个大错误,或者一个有两个主要后果的大错误,还有一个小错误。可能还有其他我看不到的错误,还有其他一些需要改进的地方。第一个错误是

    if(!m.isGoal()){
        m.setVisited();
        bfs.add(m);}}

你明确地永远不会将目标状态添加到队列中。

第二个错误是您从未测试是否已访问过某个节点。这可能与第一个错误相同,因为看起来它们可以通过相同的修复来修复:

if (!m.isVisited()) {

第三个错误是您只在处理第一个子节点后标记访问过的节点。如果没有子节点,您将永远不会标记访问过的节点,如果节点可能将其自身作为子节点,则在扩展父节点之前将子节点添加到队列中。这不会影响结果的正确性,但可能会影响您的效率。