人工智能A星算法.docx
- 文档编号:4733093
- 上传时间:2022-12-08
- 格式:DOCX
- 页数:12
- 大小:34.77KB
人工智能A星算法.docx
《人工智能A星算法.docx》由会员分享,可在线阅读,更多相关《人工智能A星算法.docx(12页珍藏版)》请在冰豆网上搜索。
人工智能A星算法
A*算法实验报告
实验目的
1熟悉和掌握启发式搜索的定义、估价函数和算法过程
2.学会利用A*算法求解N数码难题
3.理解求解流程和搜索顺序
实验原理
A*算法是一种有序搜索算法,其特点在于对估价函数的定义上。
对于一般的
有序搜索,总是选择f值最小的节点作为扩展节点。
因此,f是根据需要找到一条最小代价路径的观点来估算节点的,所以,可考虑每个节点n的估价函数值为两个分量:
从起始节点到节点n的代价以及从节点n到达目标节点的代价。
实验条件
1.WindowNT/xp/7及以上的操作系统
2.内存在512M以上
3.CPU在奔腾II以上
实验内容
1.分别以8数码和15数码为例实际求解A*算法
2.画出A*算法求解框图
3.分析估价函数对搜索算法的影响
4.分析A*算法的特点
实验分析
1.A*算法基本步骤
1)生成一个只包含开始节点n°的搜索图G,把n°放在一个叫OPEI的列表上。
2)生成一个列表CLOSE,它的初始值为空。
3)如果OPE表为空,则失败退出。
4)选择OPE上的第一个节点,把它从OPE中移入CLPSEP称该节点为n。
5)如果n是目标节点,顺着G中,从n到n°的指针找到一条路径,获得解决方案,成功退出(该指针定义了一个搜索树,在第7步建立)。
6)扩展节点n,生成其后继结点集M在Gt,n的祖先不能在M中。
在G中安
置M的成员,使他们成为n的后继。
7)从M勺每一个不在G中的成员建立一个指向n的指针(例如,既不在OPE中,也不在CLOSED)。
把M的这些成员加到OPE中。
对M的每一个已在OPE中或CLOSE中的成员m如果到目前为止找到的到达m勺最好路径通过n,就把它的指针指向n。
对已在CLOSE中的M的每一个成员,重定向它在G中的每一个后继,以使它们顺着到目前为止发现的最好路径指向它们的祖先。
8)按递增f*值,重排OPEN相同最小f*值可根据搜索树中的最深节点来解决)。
9)返回第3步。
在第7步中,如果搜索过程发现一条路径到达一个节点的代价比现存的路径代价低,就要重定向指向该节点的指针。
已经在CLOSE中的节点子孙的重定向保存了后面的搜索结果,但是可能需要指数级的计算代价。
实验步骤
算法流程图
#inelude
usingnamespacestd;
constintROW=3;//行数
constintCOL=3;//列数
constintMAXDISTANCE=10000;//最多可以有的表的数目
constintMAXNUM=10000;
typedefstruct_Node{
intdigit[ROW][COL];
intdist;//一个表和目的表的距离
intdep;//t深度
intindex;//节点的位置
}Node;
Nodesrc,dest;//父节表目的表
vector
boolisEmptyOfOPEN()//open表是否为空
{
for(inti=0;i if(node_v[i].dist! =MAXNUM) returnfalse; } returntrue; } boolisEqual(intindex,intdigit[][COL])//判断这个最优的节 点是否和目的节点一样 { for(inti=0;i for(intj=0;j if(node_v[index].digit[i][j]! =digit[i][j]) returnfalse; } returntrue; } ostream&operator«(ostream&os,Node&node) { for(inti=0;i for(intj=0;j os< os< } returnos; } 输出每一 输出每一步的 voidPrintSteps(intindex,vector { rstep_v.push_back(node_v[index]); index=node_v[index].index; while(index! =0) { rstep_v.push_back(node_v[index]); index=node_v[index].index; }_ for(inti=rstep_v.size()-1;i>=0;i--)〃 探索过程 cout<<"Step"< < } voidSwap(int&a,int&b) { intt; t=a; a=b; b=t; } voidAssign(Node&node,intindex) { for(inti=0;i for(intj=0;j node.digit[i][j]=node_v[index].digit[i][j]; 即最优节点 }_ intGetMinNode()//找到最小的节点的位置 { intdist=MAXNUM; intloc;//thelocationofminimizenode for(inti=0;i { if(node_v[i].dist==MAXNUM) continue; elseif((node_v[i].dist+node_v[i].dep) dist=node_v[i].dist+node_v[i].dep; }一一 } returnloc; } boolisExpandable(Node&node) { for(inti=0;i if(isEqual(i,node.digit)) returnfalse; } returntrue; } intDistance(Node&node,intdigit[][COL]){ intdistanee=0; boolflag=false; for(inti=0;i for(intj=0;j for(intk=0;k for(intl=0;l if(node.digit[i][j]==digit[k][l]){distanee+=abs(i-k)+abs(j-l);flag=true; break; } else flag=false; } if(flag) break; } returndistanee; } intMinDistance(inta,intb) { return(a a: b); } voidProcessNode(intindex) { intx,y; boolflag; for(inti=0;i for(intj=0;j if(node_v[index].digit[i][j]==0) {_ x=i;y=j; flag=true; break; } elseflag=false; } if(flag) break; } Nodenode_up; Assign(node_up,index);〃向上扩展的节点 intdist_up=MAXDISTANCE; if(x>0) { Swap(node_up.digit[x][y],node_up.digit[x-1][y]); if(isExpandable(node_up)) {_ dist_up=Distance(node_up,dest.digit); node_up.index=index; node_up.dist=dist_up; node_up.dep=node_v[index].dep+1; node_v.push_back(node_up); }一一一 } Nodenode_down; Assign(node_down,index);//向下扩展的节点 intdist_down二MAXDISTANCE; if(x<2) { Swap(node_down.digit[x][y],node_down.digit[x+1][y]);if(isExpandable(node_down)) { dist_down二Distance(node_down,dest.digit); node_down.index=index; node_down.dist=dist_down; node_down.dep=node_v[index].dep+1; node_v.push_back(node_down); }一一一 } Nodenode_left; Assign(node_left,index);//向左扩展的节点 intdist_left=MAXDISTANCE; if(y>0) { Swap(node_left.digit[x][y],node_left.digit[x][y-1]); if(isExpandable(node_left)) { dist_left=Distance(node_left,dest.digit); node_left.index=index; node_left.dist=dist_left; node_left.dep=node_v[index].dep+1; node_v.push_back(node_left); }一一一 } Nodenode_right; Assign(node_right,index);//向右扩展的节点 intdist_right=MAXDISTANCE; if(y<2) { Swap(node_right.digit[x][y],node_right.digit[x][y+1]);if(isExpandable(node_right)) {_ dist_right=Distance(node_right,dest.digit); node_right.index=index; node_right.dist=dist_right; node_right.dep=node_v[index].dep+1; node_v.push_back(node_right); } } node_v[index].dist=MAXNUM; } intmain()//主函数 { intnumber; cout<<"Inputsource: "< for(inti=0;i for(intj=0;j cin>>number; src.digit[i][j]=number; } src.index=0; src.dep=1; cout<<"Inputdestination: "< for(intm=0;m for(intn二0;n cin>>number; dest.digit[m][n]=number; } node_v.push_back(src);〃在容器的尾部加一个数据 cout<<"Search..."< clock_tstart=clock(); while (1) { if(isEmptyOfOPEN()) { cout<<"Cann'tsolvethisstatement! "< return-1; } else {卄 intloc;//thelocationoftheminimizenode最优节点的 位置 loc=GetMinNode(); if(isEqual(loc,dest.digit)) { vector cout<<"Source: "< cout< PrintSteps(loc,rstep_v); cout<<"Successful! "< cout<<"Using"<<(clock()-start)/CLOCKS_PER_SEC <<"seconds."< break; } else ProcessNode(loc); } } return0; } 程序运行效果图 2 8 3 1 6 4 7 5 (初始状态) 1 2 3 8 0 4 7 6 5 (结束状态) Inputsource: 283 destination: 705 164 t3 U P2n I1 5 6 0 8 *F: \CODE(C++)\A星M^\Debug\A,.IMM Step2 203 i8q 7G5 3 3nH5p e286t 5<31了 >「工门门匚匚I1;门工门;丄』山」了『一P冋IfTfajr Step5 |l23 804 765 Successful! UsingQseconds. Pressanukeqtocontinue 術I卜 个人实验小结 A*算法是一种有序搜索算法,其特点在于对估价函数的定义上。 对于一般的有序搜索,总是选择f值最小的节点作为扩展节点。 通过本实验,我熟悉启发式搜索的定义、估价函数和算法过程,并利用A*算法求解了8数码难题,理解了求解流程和搜索顺序。 实验过程中巩固了所学的知识,通过实验也提高了自己的编程和思维能力,收获很多。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人工智能 算法