人工智能课内实验报告二 计算机15班 西安交通大学.docx
- 文档编号:6419669
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:23
- 大小:70.08KB
人工智能课内实验报告二 计算机15班 西安交通大学.docx
《人工智能课内实验报告二 计算机15班 西安交通大学.docx》由会员分享,可在线阅读,更多相关《人工智能课内实验报告二 计算机15班 西安交通大学.docx(23页珍藏版)》请在冰豆网上搜索。
人工智能课内实验报告二计算机15班西安交通大学
人工智能课内实验报告
(一)
——A*算法实现重排九宫问题
班级:
计算机15班
姓名:
高君宇
学号:
2110505112
报告完成日期:
2013年11月23日
一.实验目的
熟悉启发式搜索的思想,加深对各种图搜索策略概念的理解;
二.实验内容
在一个3×3的方格棋盘上放置8个标有1、2、3、4、5、6、7、8数字的将牌,留下一个空格(用0表示)。
规定:
与空格相邻的将牌可以移入空格。
要求:
寻找一条从初始状态到目标状态的将牌移动路线。
三.实验原理和算法描述
搜索的一般描述:
1.把初始节点S0放入OPEN表,并建立目前只包含S0的图,记为G;
2.检查OPEN表是否为空,若为空则问题无解,退出;
3.把OPEN表的第一个节点取出放入CLOSE表,并计该节点为n;
4.考察节点n是否为目标节点。
若是,则求得了问题的解,退出;
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到目标节点的最小代价。
算法描述:
1.把初始节点S0放入OPEN表,并建立目前只包含S0的图,记为G;
2.检查OPEN表是否为空,若为空则问题无解,退出;
3.把OPEN表的第一个节点取出放入CLOSE表,并计该节点为n;
4.考察节点n是否为目标节点。
若是,则求得了问题的解,退出;
5.扩展节点n,生成一组子节点。
把其中不是节点n先辈的那些子节点记做集合M,并把这些子节点作为节点n的子节点加入G中;
6.针对M中子节点的不同情况,分别进行如下处理:
1.对于那些未曾在G中出现过的M成员设置一个指向父节点(即节点n)的指针,并把它们放入OPEN表;(不在OPEN表)
2.对于那些先前已经在G中出现过的M成员,确定是否需要修改它指向父节点的指针;(在OPEN表中,对g(x)进行更新)
3.对于那些先前已在G中出现并且已经扩展了的M成员,确定是否需要修改其后继节点指向父节点的指针;(在CLOSE表中,对节点n子节点的子节点更新g(x))
7.对OPEN表中的节点按估价函数进行排序;
8.转第2步。
注:
这里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){
intdiff=0;
for(inti=0;i<3;i++){
for(intj=0;j<3;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;
}
}else{
if(data[row][clumn-1]==d[row][clumn]){
diff=current.diff-1;
}else{
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;
}else{
open.add(child);
}
}
}
if(row!
=0){
if(current.parent.row!
=row-1||current.parent.clumn!
=clumn){
intdata[][]=newint[3][3];
data=Method.copy(current.data);
intdiff=0;
if(data[row][clumn]==d[row][clumn]){
if(data[row-1][clumn]==d[row-1][clumn]){
diff=current.diff+2;
}else{
diff=current.diff+1;
}
}else{
if(data[row][clumn]==d[row-1][clumn]){
if(data[row-1][clumn]==d[row][clumn]){
diff=current.diff-2;
}else{
diff=current.diff-1;
}
}else{
if(data[row-1][clumn]==d[row][clumn]){
diff=current.diff-1;
}else{
if(data[row-1][clumn]==d[row-1][clumn]){
diff=current.diff+1;
}else{
diff=current.diff;
}
}
}
}
inttemp=data[row][clumn];
data[row][clumn]=data[row-1][clumn];
data[row-1][clumn]=temp;
child=newNode(data,current,row-1,clumn,depth,diff);
if(diff==-1||diff==-2){
quicknode=child;
}else{
open.add(child);
}
}
}
if(clumn!
=2){
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;
}
}else{
if(data[row][clumn+1]==d[row][clumn]){
diff=current.diff-1;
}else{
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;
}else{
open.add(child);
}
}
}
if(row!
=2){
if(current.parent.row!
=row+1||current.parent.clumn!
=clumn){
intdata[][]=newint[3][3];
data=Method.copy(current.data);
intdiff=0;
if(data[row][clumn]==d[row][clumn]){
if(data[row+1][clumn]==d[row+1][clumn]){
diff=current.diff+2;
}else{
diff=current.diff+1;
}
}else{
if(data[row][clumn]==d[row+1][clumn]){
if(data[row+1][clumn]==d[row][clumn]){
diff=current.diff-2;
}else{
diff=current.diff-1;
}
}else{
if(data[row+1][clumn]==d[row][clumn]){
diff=current.diff-1;
}else{
if(data[row+1][clumn]==d[row+1][clumn]){
diff=current.diff+1;
}else{
diff=current.diff;
}
}
}
}
inttemp=data[row][clumn];
data[row][clumn]=data[row+1][clumn];
data[row+1][clumn]=temp;
child=newNode(data,current,row+1,clumn,depth,diff);
if(diff==-1||diff==-2){
quicknode=child;
}else{
open.add(child);
}
}
}
}
privatestaticvoidSelectMin(){
intsize=open.size();
intk=0;
for(inti=1;i if(((Node)open.get(k)).value>((Node)open.get(i)).value){ k=i; } } if(k! =0){ 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! =null){ if(quicknode! =null){ current=quicknode; closed.add(quicknode); quicknode=null; }else{ SelectMin(); current=(Node)open.removeFirst(); closed.add(current); } if(Method.equals(current.data,d)){ GetPath(current,supernode); break; }else{ AStarMoveExtend(current); } } longtime_new=System.nanoTime(); longtime=time_new-time_old; intlength=path.size(); inth2=0; frame.jTextArea1.append("最优解: \n"); while(path.size()! =0){ Nodenode=(Node)path.removeFirst(); frame.jTextArea1.append("("+h2+")估价值: "+node.value+"\n"); Method.print(frame,node.data); frame.jTextArea1.append("\n"); h2++; } frame.jTextArea1.append("搜索总长度: "+(closed.size()-1)); frame.jTextArea1.append("\n最短路径长: "+(length-1)); frame.jTextArea1.append("\n搜索时间: "+time/1000+"us"); }else{ frame.jTextArea1.setText("无解"); } } } MainFrame类: packagejiugong; importjava.awt.*; importjavax.swing.*; importjavax.swing.table.DefaultTableModel; 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("宋体",Font.PLAIN,15)); jLabel2.setText("目标状
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人工智能课内实验报告二 计算机15班 西安交通大学 人工智能 实验 报告 计算机 15
![提示](https://static.bdocx.com/images/bang_tan.gif)