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

📄 说明.txt

📁 自己用JAVA编的一个人工智能的野人过河的程序
💻 TXT
字号:
程序可在JDK下运行,也可在JBUILDER下直接运行:



程序分四大部分:

1:Application 
                                                 //系统自动生成;程序由此运行

2:Frame1                                                        //Frame1显示初始界面

    void jButton4_actionPerformed(ActionEvent e) {                //button的响应事件     

    Vector finalresult=new Vector();
    SearchProcess searchprocess=new SearchProcess();
    finalresult=searchprocess.success();                     //searchprocess.success方法找最佳路径
                                                               并返回结果;
    Frame2 frame2=new Frame2(finalresult);
    frame2.show();                                           //Frame2显示结果
              
3:Frame2


4:SearchProcess                                             //程序的主要方法的实现

package yerenchengxu;

import java.io.*;
import java.util.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.lang.Math;

class SearchProcess {

  public Vector Open=new Vector();
  public Vector Close=new Vector();


  int id=0;

   public Vector success(){
     Boat boat1=new Boat();
     Boat boat2=new Boat();
     Riverside riverside1=new Riverside();
     Riverside riverside2=new Riverside();
     Riverside riverside3=new Riverside();
     Riverside riverside4=new Riverside();

   boolean flag=true;

  Node Source=new Node(0,0,0,boat1,riverside1,riverside2,0,0,0);  //初始化初始节点

  Source.riverside1.wildMan=3;
  Source.riverside1.churchMan=3;
  Source.riverside2.wildMan=0;
  Source.riverside2.churchMan=0;
  Source.boat.wildMan=0;
  Source.boat.churchMan=0;
  Source.side=1;
  Source.id=0;
  Source.parentid=0;
  Source.h=4;
  Source.f=4;
  Source.g=0;

  Node Dest=new Node(0,0,0,boat2,riverside3,riverside4,0,0,0);   //初始化目标节点
  Dest.riverside1.wildMan=0;
  Dest.riverside1.churchMan=0;
  Dest.riverside2.wildMan=3;
  Dest.riverside2.churchMan=3;
  Dest.boat.wildMan=0;
  Dest.boat.churchMan=0;



  push(Source,Open);
  Node Current=Source;
  while(flag==true){                        //OPEN表为空退出
    if(Open.isEmpty()){
        flag=false;
        break;
       }
   Current=pop(Open);
   push(Current,Close);
   if(judgesame(Current,Dest))             //判断是否为目标节点,是则退出
     break;
   extend(Current,Dest,Open);               //扩展OPEN表中首节点:即F值最小的节点

   queopen();                                //OPEN表排序
    }

    Node Father;                            //从最后的目标节点通过FATHER找最佳路径存储在RESULT中
    Vector Result=new Vector();
  if(flag==true){
    Result.add(Current);
   int m=Current.parentid;
   int k=0;
    while(m>0){
      Father=found(m,Close,Dest);
      Result.add(Father);
      m=Father.parentid;
      k++;
    }
  }
  else{
        System.out.print("no found");
          }
       Result.add(Source);
  return Result;

 }



///////////////////所有方法的实现/////////////////////////
     public void push(Node sour,Vector open){
           open.add(sour);
     }

     public Node pop(Vector open){
          Node firstnode=(Node)open.get(0);
          open.removeElementAt(0);
          return firstnode;
     }

     public boolean judgesame(Node cur,Node des){

        if(cur.riverside1.wildMan==des.riverside1.wildMan&&cur.riverside1.churchMan==des.riverside1.churchMan&&cur.side==des.side)
        return true;
        else return false;
      }

       public void extend(Node current,Node des,Vector open){    //扩展节点
         int nwildMan1=0;
         int  nchurchMan1=0;
         int nwildMan2=0;
       int  nchurchMan2=0;
       int i;

       Boat boatState[]=new Boat [5];
      for( i=0;i<5;i++)
        boatState[i]=new Boat();


        if(current.side==1)                                       //定义了十个操作
          {
          boatState[0].wildMan=2;
          boatState[0].churchMan=0;
          boatState[1].wildMan=1;
          boatState[1].churchMan=1;
          boatState[2].wildMan=0;
          boatState[2].churchMan=2;
          boatState[3].wildMan=1;
          boatState[3].churchMan=0;
          boatState[4].wildMan=0;
          boatState[4].churchMan=1;

          }

          else
          {
          boatState[0].wildMan=0;
          boatState[0].churchMan=1;
          boatState[1].wildMan=1;
          boatState[1].churchMan=0;
          boatState[2].wildMan=0;
          boatState[2].churchMan=2;
          boatState[3].wildMan=1;
          boatState[3].churchMan=1;
          boatState[4].wildMan=2;
          boatState[4].churchMan=0;
          }

        boolean  flag=true;


        int j;
         for( j=0;j<5;j++)
         {
           if(current.side==1)
           {
            nwildMan1=current.riverside1.wildMan-boatState[j].wildMan;
            nchurchMan1=current.riverside1.churchMan-boatState[j].churchMan;
           }
           else
           {
            nwildMan1=current.riverside1.wildMan+boatState[j].wildMan;
            nchurchMan1=current.riverside1.churchMan+boatState[j].churchMan;
           }

            nwildMan2=3-nwildMan1;
            nchurchMan2=3-nchurchMan1;

           if((nwildMan1<=nchurchMan1||nchurchMan1==0)&&(nwildMan2<=nchurchMan2||nchurchMan2==0)&&nwildMan1>=0&&nchurchMan1>=0&&nwildMan2>=0&&nchurchMan2>=0) //判断要扩展的节点是否合法:野人数小于等于修道士的人数

           {


  if(j<5)

                  {
                current.boat.wildMan=boatState[j].wildMan;
                current.boat.churchMan=boatState[j].churchMan;
                Boat boat=new Boat();
                Riverside riverside1=new Riverside();
                Riverside riverside2=new Riverside();

                Node next=new Node(0,0,0,boat,riverside1,riverside2,0,0,0);

                next.riverside1.wildMan=nwildMan1;
                next.riverside1.churchMan=nchurchMan1;
                next.riverside2.wildMan=nwildMan2;
                next.riverside2.churchMan=nchurchMan2;
                next.boat.wildMan=0;
                next.boat.churchMan=0;
                next.id=++id;
                next.parentid=current.id;
                next.g=current.g+1;
                if(next.g%2==0)
                next.side=1;
                else
                next.side=0;

                next.h=next.riverside1.wildMan+next.riverside1.churchMan-2*next.side;
                next.f=next.h+next.g;


               if(next.id!=0)                                                   //判断扩展节点是否在CLOSE中
                  {
                     int k=0;
                        while((k<Close.size()))
                         {

                          if((next.riverside1.wildMan!=((Node)(Close.get(k))).riverside1.wildMan)||(next.riverside1.churchMan!=((Node)(Close.get(k))).riverside1.churchMan)||(next.side!=((Node)(Close.get(k))).side))
                           flag=false;
                          else
                         flag=true;



                        if(flag==true) break;

                            k++;
                         }
                   }

                   if(flag==false)

                      push(next,Open);                                       //扩展节点加入到OPEN表中


                }


            }


         }
       }


    public void queopen()                                     //将最小值放到OPEN表的首位
    {
      int indexmin=0;

      Node temp;
      Node node0=(Node)Open.get(0);
     int minvalue=node0.f;

      for(int i=0;i<Open.size();i++){
      Node opei=(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 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;
}
}



class Node{
  int f,h,g,id,parentid;
  Boat boat;
  Riverside riverside1;
  Riverside riverside2;
  int side;
  public Node()
  {};
  public Node(int f,int h,int g,Boat boat,Riverside riverside1,Riverside riverside2,int side,int id,int parentid){
    this.f=f;
    this.h=h;
    this.g=g;
    this.boat=boat;
    this.riverside1=riverside1;
    this.riverside2=riverside2;
    this.side=side;
    this.id=id;
    this.parentid=parentid;

  }

}
class Boat{
  int wildMan;
  int churchMan;
  public Boat()
  {}
  public Boat(int wildMan,int churchMan)
  {
    this.wildMan=wildMan;
    this.churchMan=churchMan;
  }
}
class Riverside{
   int wildMan;
   int churchMan;
   public Riverside()
   {}
}

⌨️ 快捷键说明

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