📄 说明.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 + -