人工智能课内实验报告二 计算机15班 西安交通大学Word文档下载推荐.docx
《人工智能课内实验报告二 计算机15班 西安交通大学Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《人工智能课内实验报告二 计算机15班 西安交通大学Word文档下载推荐.docx(23页珍藏版)》请在冰豆网上搜索。
![人工智能课内实验报告二 计算机15班 西安交通大学Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2023-1/6/ba802f65-0947-4462-a9b7-00500026434f/ba802f65-0947-4462-a9b7-00500026434f1.gif)
5.扩展节点n,生成一组子节点。
把其中不是节点n先辈的那些子节点记做集合M,并把这些子节点作为节点n的子节点加入G中;
6.针对M中子节点的不同情况,分别进行如下处理:
1.对于那些未曾在G中出现过的M成员设置一个指向父节点(即节点n)的指针,并把它们放入OPEN表;
(不在OPEN表)
2.对于那些先前已经在G中出现过的M成员,确定是否需要修改它指向父节点的指针;
(在OPEN表中)
3.对于那些先前已在G中出现并且已经扩展了的M成员,确定是否需要修改其后继节点指向父节点的指针;
(在CLOSE表中)
7.按某种搜索策略对OPEN表中的节点进行排序;
8.转第2步。
A*搜索:
如果一般搜索过程满足如下限制,则它就称为A*算法:
(1)把OPEN表中的节点按估价函数:
f(x)=g(x)+h(x)
f(x)的值从小至大进行排序(一般搜索过程的第7步)。
(2)g(x)是从初始节点S0到节点x的路径的代价,g(x)是对g*(x)的估计,g(x)>
0。
(3)h(x)是h*(x)的下界,即对所有的x均有:
h(x)≤h*(x)。
其中,g*(x)是从初始节点S0到节点x的最小代价;
h*(x)是从节点x到目标节点的最小代价。
算法描述:
(在OPEN表中,对g(x)进行更新)
(在CLOSE表中,对节点n子节点的子节点更新g(x))
7.对OPEN表中的节点按估价函数进行排序;
注:
这里h(x)的值取当前状态和目标状态相应九宫格上位置相同而数字不同的个数。
四.实验结果
七.实验体会
广度优先搜索算法比较可靠,只要问题有解,这种算法总可以得到解,而且得到的是最优解。
但同时也有很大的缺点,例如它的盲目性较大,当目标节点距初始节点较远时将会产生许多无用节点,搜索效率低。
相比之下,使用到代价函数的A*搜索算法,的效率较高。
八.源代码
AStar类:
packagejiugong;
importjavax.swing.table.DefaultTableModel;
importjava.util.LinkedList;
publicclassAStar{
privatestaticLinkedListopen=newLinkedList();
privatestaticLinkedListclosed=newLinkedList();
privatestaticLinkedListpath=newLinkedList();
privatestaticNodequicknode=null;
privatestaticint[][]d=newint[3][3];
privatestaticclassNode{
intvalue;
intdiff=0;
intdepth=-1;
intdata[][];
introw;
intclumn;
Nodeparent;
Node(intdata[][],Nodeparent,introw,intclumn,intdepth,intdiff){
this.data=data;
this.parent=parent;
this.row=row;
this.clumn=clumn;
this.depth=depth;
this.diff=diff;
this.value=depth+diff;
}
}
privatestaticintDiffValue(int[][]src,int[][]dest){
for(inti=0;
i<
3;
i++){
for(intj=0;
j<
j++){
if(src[i][j]!
=dest[i][j]){
diff++;
}
}
returndiff;
privatestaticvoidAStarMoveExtend(Nodecurrent){
intdepth=current.depth+1;
introw=current.row;
intclumn=current.clumn;
Nodechild;
if(clumn!
=0){
if(current.parent.row!
=row||current.parent.clumn!
=clumn-1){
intdata[][]=newint[3][3];
data=Method.copy(current.data);
intdiff=0;
if(data[row][clumn]==d[row][clumn]){
if(data[row][clumn-1]==d[row][clumn-1]){
diff=current.diff+2;
}else{
diff=current.diff+1;
}else{
if(data[row][clumn]==d[row][clumn-1]){
if(data[row][clumn-1]==d[row][clumn]){
diff=current.diff-2;
}else{
diff=current.diff-1;
if(data[row][clumn-1]==d[row][clumn-1]){
diff=current.diff+1;
}else{
diff=current.diff;
inttemp=data[row][clumn];
data[row][clumn]=data[row][clumn-1];
data[row][clumn-1]=temp;
child=newNode(data,current,row,clumn-1,depth,diff);
if(diff==-1||diff==-2){
quicknode=child;
open.add(child);
if(row!
=row-1||current.parent.clumn!
=clumn){
if(data[row-1][clumn]==d[row-1][clumn]){
if(data[row][clumn]==d[row-1][clumn]){
if(data[row-1][clumn]==d[row][clumn]){
if(data[row-1][clumn]==d[row-1][clumn]){
data[row][clumn]=data[row-1][clumn];
data[row-1][clumn]=temp;
child=newNode(data,current,row-1,clumn,depth,diff);
=2){
=clumn+1){
if(data[row][clumn+1]==d[row][clumn+1]){
if(data[row][clumn]==d[row][clumn+1]){
if(data[row][clumn+1]==d[row][clumn]){
if(data[row][clumn+1]==d[row][clumn+1]){
data[row][clumn]=data[row][clumn+1];
data[row][clumn+1]=temp;
child=newNode(data,current,row,clumn+1,depth,diff);
=row+1||current.parent.clumn!
if(data[row+1][clumn]==d[row+1][clumn]){
if(data[row][clumn]==d[row+1][clumn]){
if(data[row+1][clumn]==d[row][clumn]){
if(data[row+1][clumn]==d[row+1][clumn]){
data[row][clumn]=data[row+1][clumn];
data[row+1][clumn]=temp;
child=newNode(data,current,row+1,clumn,depth,diff);
privatestaticvoidSelectMin(){
intsize=open.size();
intk=0;
for(inti=1;
size;
if(((Node)open.get(k)).value>
((Node)open.get(i)).value){
k=i;
if(k!
Nodenode=(Node)open.get(0);
open.set(0,(Node)open.get(k));
open.set(k,node);
privatestaticvoidGetPath(Nodenode,Nodesupernode){
while(node.parent!
=null){
path.addFirst(node);
node=node.parent;
publicstaticvoidA_Star(MainFrameframe,DefaultTableModelsrc,DefaultTableModeldest){
open=newLinkedList();
closed=newLinkedList();
path=newLinkedList();
ints[][];
intlocation[]=newint[2];
s=Method.toTwoArray(src);
d=Method.toTwoArray(dest);
location=Method.Location(s,0);
if(Method.isSolutionExist(Method.toArray(src),Method.toArray(dest),s,d)){
frame.jTextArea1.setText("
有解\n"
);
Nodecurrent;
Nodesupernode=newNode(newint[3][3],null,-1,-1,-1,-1);
Noderoot=newNode(s,supernode,location[0],location[1],0,DiffValue(s,d));
open.add(root);
longtime_old=System.nanoTime();
while(open.size()!
=0||quicknode!
if(quicknode!
current=quicknode;
closed.add(quicknode);
quicknode=null;
SelectMin();
current=(Node)open.removeFirst();
closed.add(current);
if(Method.equals(current.data,d)){
GetPath(current,supernode);
break;
AStarMoveExtend(current);
longtime_new=System.nanoTime();
longtime=time_new-time_old;
intlength=path.size();
inth2=0;
frame.jTextArea1.append("
最优解:
\n"
while(path.size()!
Nodenode=(Node)path.removeFirst();
frame.jTextArea1.append("
("
+h2+"
)估价值:
"
+node.value+"
Method.print(frame,node.data);
h2++;
搜索总长度:
+(closed.size()-1));
\n最短路径长:
+(length-1));
\n搜索时间:
+time/1000+"
us"
无解"
}
MainFrame类:
importjava.awt.*;
importjavax.swing.*;
importjava.awt.event.ActionListener;
importjava.awt.event.ActionEvent;
importjava.util.*;
publicclassMainFrameextendsJFrame{
Objectjiugong1[][]={{2,8,1},{3,0,4},{7,5,6}};
Objectjiugong2[][]={{1,2,3},{8,0,4},{7,6,5}};
Objectobj[]={"
first"
"
second"
third"
};
JPanelcontentPane;
JPaneljPanel1=newJPanel();
JPaneljPanel2=newJPanel();
JTablejTable1=newJTable();
JTablejTable2=newJTable();
JButtonjButton1=newJButton();
JButtonjButton4=newJButton();
JButtonjButton5=newJButton();
JLabeljLabel1=newJLabel();
JLabeljLabel2=newJLabel();
JScrollPanejScrollPane1=newJScrollPane();
JTextAreajTextArea1=newJTextArea();
DefaultTableModelsrc=newDefaultTableModel(jiugong1,obj);
DefaultTableModeldest=newDefaultTableModel(jiugong2,obj);
publicMainFrame(){
try{
setDefaultCloseOperation(EXIT_ON_CLOSE);
jbInit();
}catch(Exceptionexception){
exception.printStackTrace();
privatevoidjbInit()throwsException{
contentPane=(JPanel)getContentPane();
contentPane.setLayout(null);
this.getContentPane().setBackground(Color.pink);
setSize(newDimension(400,400));
contentPane.setBackground(Color.pink);
jLabel1.setText("
初始状态:
jLabel1.setFont(newjava.awt.Font("
宋体"
Font.PLAIN,15));
jLabel1.setBounds(20,10,80,25);
jLabel2.setFont(newjava.awt.Font("
jLabel2.setText("
目标状