非图解算器中的回溯似乎处于无限循环中

时间:2017-04-08 15:28:23

标签: java algorithm artificial-intelligence backtracking constraint-programming

我试图用Java编写非编程解算器用于学校作业。它适用于所有提供的输入,除了一个。我的代码在github上https://github.com/farkadav/Nonogram-solver

在CSPSolver中我解决了非图形。我根据github上的文本文件中的约束生成所有可能的行/列组合然后我检查弧一致性然后我试图通过回溯找到解决方案。我有输出它应该看起来也解决了。当我尝试解决dino.txt时,我的回溯功能似乎进入无限循环解决第11行和第15列。这是该方法的代码。

public void backtracking(){

    if(orderedVars.isEmpty()){

        String[] solString = new String[rowDim];
        for(Line line : rowSolution){

            solString[line.position] = new String();
            for(int j=0; j<colDim; j++){
                solString[line.position] +=line.value[j];
            }

        }
        String solution = new String();
        for(String sol : solString){
            solution += sol +"\n";
        }
        solutions.add(solution);
        return;
    }
    CSPVariable cspVar = orderedVars.poll();


    for(char[] var : cspVar.storage){
        if(consistent(var,cspVar)){

            if(cspVar.Row){                
                rowSolution[helpX++] = new Line(var,cspVar.position,cspVar.Row);                    
                backtracking();
                rowSolution[--helpX] = null;
            } else{
                colSolution[helpY++] = new Line(var,cspVar.position,cspVar.Row);                    
                backtracking();
                colSolution[--helpY] = null;
            }
        }
    }
    orderedVars.add(cspVar);

}

我不知道究竟是什么导致它,任何帮助将不胜感激。如果有任何不清楚的地方,则链接到作业http://cw.fel.cvut.cz/wiki/courses/a4b33zui/task2-malovane-krizovky-en

1 个答案:

答案 0 :(得分:0)

在操作helpX和helpY之间调用backtracking()对我来说是个问题。如果从算法的定义中没有必要尝试以这种方式重新排序,则在调用backtracking()之前修改helpX和helpY。