简体   繁体   English

8Puzzle求解器中的NoSuchElementException

[英]NoSuchElementException in 8Puzzle solver

I'm trying to make a Java program that gives me the solution of the 8puzzle problem 我正在尝试制作一个Java程序,为我解决8puzzle问题

The solution procedure as the following: 解决方法如下:

-First I create an initial node that contains the initial grid (initial state) -首先,我创建一个包含初始网格(初始状态)的初始节点

  • I put the node in Queue 我将节点放入队列

  • I test if the node is a goal so I use the stack to save the solution road(from the node to the initial root) 我测试节点是否是目标,所以我使用堆栈来保存解决方案之路(从节点到初始根)

else I will add his successors (which represents the possible permutation of 0) in the Queue and I redo the test. 否则,我将在队列中添加他的后继者(代表可能的0排列),然后重做测试。

This is the code: Class Noued 这是代码:类编号

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;


public class Noued {
int grille[]=new int[9];
int niveau;

Noued suiv1=null;
Noued suiv2=null;
Noued suiv3=null;
Noued suiv4=null;
Noued pred=null;


 static void successeur(Noued r)
{Queue<Integer> permut;
Integer elt;

    permut=taquin8.Test_permut(taquin8.zero(r.grille));

    if(permut.element()!=null){
        elt=permut.remove();
        r.suiv1=new Noued();
        r.suiv1.pred=r;
        for(int i=0;i<9;i++){r.suiv1.grille[i]=r.grille[i];}
        r.suiv1.niveau=r.niveau+1;
    r.suiv1.grille[taquin8.indice_ent(r.suiv1.grille,0)]=r.suiv1.grille[elt];
    r.suiv1.grille[elt]=0;

    if(permut.element()!=null){
        elt=permut.remove();
        r.suiv2=new Noued();
        r.suiv2.pred=r;
        for(int i=0;i<9;i++){r.suiv2.grille[i]=r.grille[i];}
        r.suiv2.niveau=r.niveau+1;
        r.suiv2.grille[taquin8.indice_ent(r.suiv2.grille,0)]=r.suiv2.grille[elt];
        r.suiv2.grille[elt]=0;


    }

    if(permut.element()!=null){
        elt=permut.remove();
        r.suiv3=new Noued();
        r.suiv3.pred=r;
        for(int i=0;i<9;i++){r.suiv3.grille[i]=r.grille[i];}
        r.suiv3.niveau=r.niveau+1;
        r.suiv3.grille[taquin8.indice_ent(r.suiv3.grille,0)]=r.suiv3.grille[elt];
        r.suiv3.grille[elt]=0;

        if(permut.element()!=null){
            elt=permut.remove();
            r.suiv4=new Noued();
            r.suiv4.pred=r;
            for(int i=0;i<9;i++){r.suiv4.grille[i]=r.grille[i];}
            r.suiv4.niveau=r.niveau+1;
            r.suiv4.grille[taquin8.indice_ent(r.suiv4.grille,0)]=r.suiv4.grille[elt];
            r.suiv4.grille[elt]=0;


        }       
    }
    }
}




//afficher un arbre
 static void affich_ab(Noued r)
{
if(r!=null){taquin8.affichertab(r.grille);}
if(r.suiv1!=null){System.out.println("\n***S1***"); affich_ab(r.suiv1);}
if(r.suiv2!=null){System.out.println("\n***S2***"); affich_ab(r.suiv2);}
if(r.suiv3!=null){System.out.println("\n***S3***"); affich_ab(r.suiv3);}
if(r.suiv4!=null){System.out.println("\n***S4***"); affich_ab(r.suiv4);}    

}

}

Class Taquin8: Taquin8类:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;


public class taquin8 {
static Integer n1,n2;
static int start[] = {1,2,3,4,0,5,7,8,6};
static int goal[] = {1,2,3,4,5,6,7,8,0};


    //affichage d'une grille    
    static void affichertab(int t[])
    {
        for (int i=0;i<9;i++){ 
            if ((i%3)==2){System.out.println("["+t[i]+"]");}
            else {System.out.print("["+t[i]+"]");}
                                }

    }
    //rechercher l'indice d'un entier
    static int indice_ent(int t[],int x)
    {int ind = 10;
        for (int i=0;i<9;i++){ 
            if (t[i]==x) ind=i;
        }
        return ind;

    }

    //rechercher l'indice de zero
    static int zero(int t[])
    {int ind = 10;
        for (int i=0;i<9;i++){ 
            if (t[i]==0) ind=i;
        }
        return ind;

    }

    //egalité de tableau
        static boolean egal_tab(int t1[],int t2[])
        {int c=0;
            for (int i=0;i<9;i++){ 
                if (t1[i]!=t2[i]) c++;
            }
            if (c==0) {return true;}
            else return false;

        }

    //procedure pour faire la permutation de deux entier

    static  void permutaion(Integer n1, Integer n2)
    {Integer t;
    t=n1;
    taquin8.n1=n2;
    taquin8.n2=t;
    }



    //Test pour les possibilites de permutaion de 0
    static Queue<Integer> Test_permut(int g)
    {
        Queue<Integer> pp = new LinkedList<Integer>();


    switch (g)
    {
    case 0:
    {
        pp.add(1);
        pp.add(3);
    break;}

    case 1:
    {
        pp.add(0);
        pp.add(2);
        pp.add(4);
    break;}


    case 2:
    {
        pp.add(1);
        pp.add(5);
    break;}

    case 3:
    {
        pp.add(0);
        pp.add(4);
        pp.add(6);

    break;}

    case 4:
    {
        pp.add(1);
        pp.add(3);
        pp.add(5);
        pp.add(7);

    break;}

    case 5:
    {
        pp.add(2);
        pp.add(4);
        pp.add(8);

    break;
    }

    case 6:
    {
    pp.add(3);
    pp.add(7);
    break;}

    case 7:
    {
    pp.add(4);
    pp.add(6);
    pp.add(8);

    break;}

    case 8:
    {
    pp.add(5);
    pp.add(7);
    break;}
    default:{};            
    }

        return pp;
    }

static //largeur
    ArrayList<Noued> largeur(Noued r,ArrayList<Noued> f)
    {

        f=new ArrayList<Noued>();


    f.add(r);

if(!taquin8.egal_tab(r.grille,goal)){
    Noued.successeur(r);
if(r.suiv1!=null){f.add(r.suiv1);}
if(r.suiv2!=null){f.add(r.suiv2);}
if(r.suiv3!=null){f.add(r.suiv3);}
if(r.suiv4!=null){f.add(r.suiv4);}
}


return f;


    }







    //Programme Principal
    public static void main(String[] args) {
        Queue<Noued> queue = new LinkedList<Noued>();
         Stack<Noued> sol = new Stack<Noued>();

Noued rac=new Noued();
rac.grille=start;
rac.niveau=0;


queue.add(rac);

int but=0;

//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXtest la file le but






while(but==0){  
    Noued   t=queue.element();
if(t.grille.equals(goal)){System.out.println("LE BUUUUUUUUUUUUt"); 
                                                Noued emp=t;
                                                while(emp.pred!=null){
                                                                        sol.push(emp);
                                                                        emp=emp.pred;
                                                                        }
                                                but=1;

                                                            }




else{Noued.successeur(t);
if(t.suiv1!=null){queue.add(rac.suiv1);}
if(t.suiv2!=null){queue.add(rac.suiv2);}
if(t.suiv3!=null){queue.add(rac.suiv3);}
if(t.suiv4!=null){queue.add(rac.suiv4);}
}
queue.remove(); 
}
//affichage de la frontiere
/*
if(queue!=null){
while(queue.size()!=0){
                    taquin8.affichertab(queue.remove().grille);
                    System.out.println("\n");
                    }

}

*/


if(sol!=null){
while(sol.size()!=0){
                    taquin8.affichertab(sol.pop().grille);
                    System.out.println("\n");
                    }

}           




    }
}

The result is something like: 结果是这样的:


Exception in thread "main" java.util.NoSuchElementException
    at java.util.LinkedList.getFirst(Unknown Source)
    at java.util.LinkedList.element(Unknown Source)
    at Noued.successeur(Noued.java:53)
    at taquin8.main(taquin8.java:208)

From your stack trace, it appears that the LinkedList behind the permut Queue is empty. 从您的堆栈跟踪中,似乎permut队列后面的LinkedList为空。 That is, permut is empty. 也就是说, permut是空的。 Looking at Noued.successeur , we see that permut is coming from taquin8.Test_permut() . 查看Noued.successeur ,我们看到permut来自taquin8.Test_permut() And looking at Taquin8.Test_permut , we see that the default case returns an empty Queue. 看一下Taquin8.Test_permut ,我们看到default情况下返回一个空Queue。 So, you need to figure out why taquin8.Test_permut is entering the default case. 因此,您需要弄清楚为什么taquin8.Test_permut输入默认大小写。 Hint: g is outside the range [0:8]. 提示: g在[0:8]范围之外。

I recommend running your code through a debugger, or at least adding some println statements. 我建议通过调试器运行代码,或者至少添加一些println语句。

Ok, I solved the precedent problem. 好的,我解决了先例问题。

But now I have An "infinite while loop" (Taquin8 class) it look correct form me (Algo side) I don't know where is the problem ! 但是现在我有了一个“无限while循环”(Taquin8类),从我看来(Algo方面)它是正确的,我不知道问题出在哪里!

Class Noued : 课堂名称:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;


public class Noued {
int grille[]=new int[9];
int niveau;
int vis;
Noued suiv1=null;
Noued suiv2=null;
Noued suiv3=null;
Noued suiv4=null;
Noued pred=null;

static void successeur(Noued r)
{Queue<Integer> permut;
Integer elt;

    permut=taquin8.Test_permut(taquin8.zero(r.grille));
    if(permut!=null){

    if(!permut.isEmpty()){
        elt=permut.element();
        r.suiv1=new Noued();
        r.suiv1.pred=r;
        for(int i=0;i<9;i++){r.suiv1.grille[i]=r.grille[i];}
        r.suiv1.niveau=r.niveau+1;
    r.suiv1.grille[taquin8.indice_ent(r.suiv1.grille,0)]=r.suiv1.grille[elt];
    r.suiv1.grille[elt]=0;



    permut.remove();
    if(!permut.isEmpty()){
        elt=permut.element();
        r.suiv2=new Noued();
        r.suiv2.pred=r;
        for(int i=0;i<9;i++){r.suiv2.grille[i]=r.grille[i];}
        r.suiv2.niveau=r.niveau+1;
    r.suiv2.grille[taquin8.indice_ent(r.suiv2.grille,0)]=r.suiv2.grille[elt];
    r.suiv2.grille[elt]=0;



    permut.remove();
if(!permut.isEmpty()){
        elt=permut.element();
        r.suiv3=new Noued();
        r.suiv3.pred=r;
        for(int i=0;i<9;i++){r.suiv3.grille[i]=r.grille[i];}
        r.suiv3.niveau=r.niveau+1;
    r.suiv3.grille[taquin8.indice_ent(r.suiv3.grille,0)]=r.suiv3.grille[elt];
    r.suiv3.grille[elt]=0;


    permut.remove();
if(!permut.isEmpty()){
        elt=permut.element();
        r.suiv4=new Noued();
        r.suiv4.pred=r;
        for(int i=0;i<9;i++){r.suiv4.grille[i]=r.grille[i];}
        r.suiv4.niveau=r.niveau+1;
    r.suiv4.grille[taquin8.indice_ent(r.suiv4.grille,0)]=r.suiv4.grille[elt];
    r.suiv4.grille[elt]=0;



    permut.remove();

    }
    }
    }


    }




}else{System.out.println("\n PERMUT IS EMPTY");}
}
//afficher un arbre
 static void affich_ab(Noued r)
{
if(r!=null){taquin8.affichertab(r.grille);}
if(r.suiv1!=null){System.out.println("\n***S1***"); affich_ab(r.suiv1);}
if(r.suiv2!=null){System.out.println("\n***S2***"); affich_ab(r.suiv2);}
if(r.suiv3!=null){System.out.println("\n***S3***"); affich_ab(r.suiv3);}
if(r.suiv4!=null){System.out.println("\n***S4***"); affich_ab(r.suiv4);}    

}

}

Class Taquin8: Taquin8类:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;


public class taquin8 {
static Integer n1,n2;
static int start[] = {1,2,3,4,5,6,7,0,8};
static int goal[] = {1,2,3,4,5,6,7,8,0};


    //affichage d'une grille    
    static void affichertab(int t[])
    {
        for (int i=0;i<9;i++){ 
            if ((i%3)==2){System.out.println("["+t[i]+"]");}
            else {System.out.print("["+t[i]+"]");}
                                }

    }
    //rechercher l'indice d'un entier
    static int indice_ent(int t[],int x)
    {int ind = 10;
        for (int i=0;i<9;i++){ 
            if (t[i]==x) ind=i;
        }
        return ind;

    }

    //rechercher l'indice de zero
    static int zero(int t[])
    {int ind = 10;
        for (int i=0;i<9;i++){ 
            if (t[i]==0) ind=i;
        }
        return ind;

    }

    //egalité de tableau
        static boolean egal_tab(int t1[],int t2[])
        {int c=0;
            for (int i=0;i<9;i++){ 
                if (t1[i]!=t2[i]) c++;
            }
            if (c==0) {return true;}
            else return false;

        }

    //procedure pour faire la permutation de deux entier

    static  void permutaion(Integer n1, Integer n2)
    {Integer t;
    t=n1;
    taquin8.n1=n2;
    taquin8.n2=t;
    }



    //Test pour les possibilites de permutaion de 0
    static Queue<Integer> Test_permut(int g)
    {
        Queue<Integer> pp = new LinkedList<Integer>();


    switch (g)
    {
    case 0:
    {
        pp.add(1);
        pp.add(3);
    break;}

    case 1:
    {
        pp.add(0);
        pp.add(2);
        pp.add(4);
    break;}


    case 2:
    {
        pp.add(1);
        pp.add(5);
    break;}

    case 3:
    {
        pp.add(0);
        pp.add(4);
        pp.add(6);

    break;}

    case 4:
    {
        pp.add(1);
        pp.add(3);
        pp.add(5);
        pp.add(7);

    break;}

    case 5:
    {
        pp.add(2);
        pp.add(4);
        pp.add(8);

    break;
    }

    case 6:
    {
    pp.add(3);
    pp.add(7);
    break;}

    case 7:
    {
    pp.add(4);
    pp.add(6);
    pp.add(8);

    break;}

    case 8:
    {
    pp.add(5);
    pp.add(7);
    break;}
    default:{};            
    }

        return pp;
    }

 //largeur







    //Programme Principal
    public static void main(String[] args) {
        Queue<Noued> queue = new LinkedList<Noued>();
         Stack<Noued> sol = new Stack<Noued>();

Noued rac=new Noued();
rac.grille=start;
rac.niveau=0;

int but=0;
queue.add(rac);

while((but!=1)&&(!queue.isEmpty())){
                                        Noued test=queue.element();
                                        System.out.println("\n---------");
                                        taquin8.affichertab(test.grille);

                                        if(test.grille.equals(goal)){
                                                                        System.out.println("GOAAAAAAL");
                                                                        but=1;
                                                                    }
                                        else{
                                                Noued.successeur(test);
                                                if(test.suiv1!=null){queue.add(test.suiv1);}
                                                if(test.suiv2!=null){queue.add(test.suiv2);}
                                                if(test.suiv3!=null){queue.add(test.suiv3);}
                                                if(test.suiv4!=null){queue.add(test.suiv4);}
                                            }

                                        queue.remove();
                                    }


    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM