⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readme.txt

📁 自己用JAVA编的人工智能的A*算法的八数码程序
💻 TXT
字号:

尚老师暂时我还没作出来扩展节点的显示,我先把这个发过来吧,

我尽量把扩展节点显示出来,有的地方我还没想明白,如果做出来,我再发过去。

你让我做的一些JAVA小程序,我整理一下,下周给您发过去。


说明:


本程序在JBuilder环境下运行

EightFigure 问题程序由四部分组成:

Frame1.java   显示初始界面 ,初始化,调用searchProcess和Frame2

Frame2.java   显示运行结果界面

mainProcess.java  系统自动生成的程序运行的入口,运行时右键点击此处运行

searchProcess.java    系统主要的执行过程,为本程序的主要部分。


searchProcess.java 程序的关键原码如下:

public class searchProcess {
public Vector open=new Vector();
public Vector close=new Vector();
public  int pnodeId=0;

public  Vector execute(int[][] Source,int[][] Dest){
       boolean flag;

      Node source=new Node(0,0,Source,0,0,0);
      Node dest=new Node(0,0,Dest,0,0,0);
      source.h=caculatemove(source,dest);
      source.f=source.g+source.h;

      push(source,open);
      Node pnode=source;

   while(flag=true){                  //OPEN表为空退出
      if(open.isEmpty()){
                   flag=false;
                   break;
                     }
      pnode=pop(open);
      push(pnode,close);
      if (judgesame(pnode, dest))    //找到目标退出
       break;
      extendnode(pnode,dest);
      queopen();
   }


      Node Father;                //根据父节点找最佳路径
      Vector Result=new Vector();
      int k=0;
      if(flag=true){
        Result.add(pnode);
        int m=pnode.parentid;
        while(m>0){
          Father=found(m,close,source);

          m=Father.parentid;
           Result.add(Father);
          k++;
        }
      }

      else{                          //没找到标志
        System.out.print("no found");
          }
       Result.add(source);
      return Result;              //即为结果

  }

  //////////////////////////////////////
  //以下是EXECUTE实现的所有方法:
  public  void push(Node node,Vector ope){     //将NODE加进OPEN表
    ope.add(node);
  }

  public   Node pop(Vector ope){             //将OPEN表的第一个NODE弹出
    Node firstnode=(Node)ope.get(0);
    ope.removeElementAt(0);
    return firstnode;
  }

  public   Node found(int k,Vector vec,Node Source){ //在CLOSE表中ID号相同的NODE
   Node result=Source;
   int i;
   for(i=0;i<vec.size();i++){
     if(k==((Node)vec.get(i)).Id)
     {
     result=(Node)vec.get(i);
     }
  }
  return result;
}

  public  boolean judgesame(Node s1,Node s2){       //判断找到的NODE是否是目标NODE
     int[][] arr=new int[3][3];
    for(int i=0;i<=2;i++){
      for(int j=0;j<=2;j++){
        if(!(s1.arr[i][j]==s2.arr[i][j]))
          return false;
      }
    }
    return true;
 }


  public  void extendnode(Node pnode,Node des){  //将OPEN表中第一个NODE 扩展

  int m=0;
  int n=0;
  //将NODE的“0”定位M,N
 for(int i=0;i<=2;i++)
    { for(int j=0;j<=2;j++)
     if(pnode.arr[i][j]==0)
     {
      m=i;
      n=j;
    }
 }

 //以下分四个方向扩展:上、下、左、右,并加入OPEN表中

 if(m-1>-1)
 { int[][] arr=new int[3][3];
  boolean flag=true;

   Node pnewnode=new Node(0,0,arr,0,0,0);
   for(int i=0;i<=2;i++)
   for( int j=0;j<=2;j++)
  pnewnode.arr[i][j]=pnode.arr[i][j];
 pnewnode.arr[m][n]=pnewnode.arr[m-1][n];
 pnewnode.arr[m-1][n]=0;


 int  k=0;
             while(k<close.size())
             {
               flag=true;
              for(int ii=0;ii<=2;ii++)
              {
               for( int jj=0;jj<=2;jj++)
                    if(pnewnode.arr[ii][jj]!=((Node)close.get(k)).arr[ii][jj])
                      {flag=false;
                       break;
                       }
                       if(flag==false) break;
             }
             if(flag==true) break;
             k++;
             }

          if(flag==false)
           {
               pnewnode.parentid=pnode.Id;
               pnodeId=pnodeId+1;
               pnewnode.Id=pnodeId;
               pnewnode.g=pnode.g+1;
                pnewnode.h=caculatemove(pnewnode,des);
                pnewnode.f=pnewnode.g+pnewnode.h;
                open.add(pnewnode);
           }
 }


 if(m+1<3)
 { int[][] arr=new int[3][3];
  boolean flag=false;
   Node pnewnode=new Node(0,0,arr,0,0,0);
   for(int i=0;i<=2;i++)
    for(int j=0;j<=2;j++)
       pnewnode.arr[i][j]=pnode.arr[i][j];
       pnewnode.arr[m][n]=pnewnode.arr[m+1][n];
       pnewnode.arr[m+1][n]=0;

int  k=0;
             while(k<close.size())
             {
               flag=true;
              for(int ii=0;ii<=2;ii++)
              {
               for( int jj=0;jj<=2;jj++)
                    if(pnewnode.arr[ii][jj]!=((Node)close.get(k)).arr[ii][jj])
                      {flag=false;
                       break;
                       }
                       if(flag==false) break;
             }
             if(flag==true) break;
             k++;
             }

     if(flag==false)

          {
           pnewnode.parentid=pnode.Id;
           pnodeId=pnodeId+1;
           pnewnode.Id=pnodeId;
           pnewnode.g=pnode.g+1;
           pnewnode.h=caculatemove(pnewnode,des);
           pnewnode.f=pnewnode.g+pnewnode.h;
          open.add(pnewnode);
         }
 }


 if(n-1>-1)
{ int[][] arr=new int[3][3];
 boolean flag=false;
  Node pnewnode=new Node(0,0,arr,0,0,0);
  for( int i=0;i<=2;i++)
   for(int j=0;j<=2;j++)
      pnewnode.arr[i][j]=pnode.arr[i][j];
      pnewnode.arr[m][n]=pnewnode.arr[m][n-1];
      pnewnode.arr[m][n-1]=0;

   int  k=0;
             while(k<close.size())
             {
               flag=true;
              for(int ii=0;ii<=2;ii++)
              {
               for( int jj=0;jj<=2;jj++)
                    if(pnewnode.arr[ii][jj]!=((Node)close.get(k)).arr[ii][jj])
                      {flag=false;
                       break;
                       }
                       if(flag==false) break;
             }
             if(flag==true) break;
             k++;
             }
       if(flag==false){
                        pnewnode.parentid=pnode.Id;
                        pnodeId=pnodeId+1;
                        pnewnode.Id=pnodeId;
                        pnewnode.g=pnode.g+1;
                        pnewnode.h=caculatemove(pnewnode,des);
                         pnewnode.f=pnewnode.g+pnewnode.h;
                        open.add(pnewnode);
                       }
}


 if(n+1<3)
 { int[][] arr=new int[3][3];
  boolean flag=false;
   Node pnewnode=new Node(0,0,arr,0,0,0);
   for( int i=0;i<=2;i++)
    for( int j=0;j<=2;j++)
       pnewnode.arr[i][j]=pnode.arr[i][j];
       pnewnode.arr[m][n]=pnewnode.arr[m][n+1];
       pnewnode.arr[m][n+1]=0;

 int  k=0;
             while(k<close.size())
             {
               flag=true;
              for(int ii=0;ii<=2;ii++)
              {
               for( int jj=0;jj<=2;jj++)
                    if(pnewnode.arr[ii][jj]!=((Node)close.get(k)).arr[ii][jj])
                      {flag=false;
                       break;
                       }
                       if(flag==false) break;
             }
             if(flag==true) break;
             k++;
             }


    if(flag==false)
    {
      pnewnode.parentid=pnode.Id;
      pnodeId=pnodeId+1;
     pnewnode.Id=pnodeId;
      pnewnode.g=pnode.g+1;
      pnewnode.h=caculatemove(pnewnode,des);
       pnewnode.f=pnewnode.g+pnewnode.h;
      open.add(pnewnode);

      }
   }
}



   public  void queopen(){                         //OPEN表排序,只用找F值最小的设为第一个NODE
     int indexmin=0;
     int[][] arr=new int[3][3];
     Node temp=new Node(0,0,arr,0,0,0);
    Node node0=(Node)open.get(0);
    int minvalue=node0.f;
    for(int i=0;i<open.size();i++){
       Node opei=(Node)open.get(i);
       // int minvalue=(Node)open.get(i
       if(opei.f<minvalue)
       {
         minvalue=opei.f;
         indexmin=i;
        }
  }


      temp=(Node)open.get(0);
      open.setElementAt((Node)open.elementAt(indexmin),0);
      open.setElementAt(temp,indexmin);
  }


public  int caculatemove(Node nod,Node destin){       //计算NODE到目标NODE 需要走的步数,即为H值
      int totalstep=0;
      int i,j,k,l,value;
      int row=0;
      int col=0;
      int step=0;
      for( i=0;i<=2;i++){
        for( j=0;j<=2;j++)
        {
          value=nod.arr[i][j];
          int t=1;
          for( k=0;k<=2;k++)
          {
            for( l=0;l<=2;l++) {
              if(value==destin.arr[k][l]) {
                t=0;
                row=k;
                col=l;
                break;
              }
            }
            if(t==0)
            {
              break;
            }
          }
          step=abs(i-row)+abs(j-col);

          if (value!=0)
            totalstep+=step;
        }
       }
      return totalstep;
     }

 public  int abs(int num)  //取一个数的绝对值
      {
    int nume;
    if(num>0)
     nume=num;
     else
     nume=-num;
    return nume;
     }

}


class Node {              //定义NODE 结构
 int Id;
int[][] arr=new int[3][3];
int parentid;
int g;
int f;
int h;
public Node()
{}

public  Node(int Id,int parentid,int[][] arr,int f,int g,int h) {
 this.Id=Id;
 this.parentid=parentid;
 for(int i=0;i<=2;i++)
 {for(int j=0;j<=2;j++)
this.arr[i][j]=arr[i][j];
 }
 this.f=f;
 this.g=g;
 this.h=h;
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -