人工智能A星算法文档格式.docx
- 文档编号:20205503
- 上传时间:2023-01-18
- 格式:DOCX
- 页数:12
- 大小:161.38KB
人工智能A星算法文档格式.docx
《人工智能A星算法文档格式.docx》由会员分享,可在线阅读,更多相关《人工智能A星算法文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
对已在CLOSE中的M勺每一个成员,重定向它在G中的每一个后继,以使它们顺着到目前为止发现的最好路径指向它们的祖先。
8)按递增f*值,重排OPEN相同最小f*值可根据搜索树中的最深节点来解决)。
9)返回第3步。
在第7步中,如果搜索过程发现一条路径到达一个节点的代价比现存的路径代价低,就要重定向指向该节点的指针。
已经在CLOSE中的节点子孙的重定向保存了后面的搜索结果,但是可能需要指数级的计算代价。
实验步骤算法流程图程序代码#include#include#includeusingnamespacestd;
constintROW=3;
/行数constintCOL=3;
/列数constintMAXDISTANCE=10000;
最/多可以有的表的数目constintMAXNUM=10000;
typedefstruct_NodeintdigitROWCOL;
intdist;
/一个表和目的表的距离intdep;
/t深度intindex;
/节点的位置Node;
Nodesrc,dest;
/父节表目的表vectornode_v;
/存储节点boolisEmptyOfOPEN()/open表是否为空for(inti=0;
inode_v.size();
i+)if(node_vi.dist!
=MAXNUM)returnfalse;
returntrue;
boolisEqual(intindex,intdigitCOL)/判断这个最优的节点是否和目的节点一样for(inti=0;
iROW;
i+)for(intj=0;
jCOL;
j+)if(node_vindex.digitij!
=digitij)returnfalse;
ostream&
operator(ostream&
os,Node&
node)for(inti=0;
j+)osnode.digitij;
osendl;
returnos;
voidPrintSteps(intindex,vector&
rstep_v)/输出每一个遍历的节点深度遍历rstep_v.push_back(node_vindex);
index=node_vindex.index;
while(index!
=0)rstep_v.push_back(node_vindex);
for(inti=rstep_v.size()-1;
i=0;
i-)/输/出每一步的探索过程coutSteprstep_v.size()-iendlrstep_viendl;
voidSwap(int&
a,int&
b)intt;
t=a;
a=b;
b=t;
voidAssign(Node&
node,intindex)for(inti=0;
j+)node.digitij=node_vindex.digitij;
intGetMinNode()/找到最小的节点的位置即最优节点intdist=MAXNUM;
intloc;
/thelocationofminimizenodefor(inti=0;
i+)if(node_vi.dist=MAXNUM)continue;
elseif(node_vi.dist+node_vi.dep)dist)loc=i;
dist=node_vi.dist+node_vi.dep;
returnloc;
boolisExpandable(Node&
i+)if(isEqual(i,node.digit)returnfalse;
intDistance(Node&
node,intdigitCOL)intdistance=0;
boolflag=false;
for(inti=0;
j+)for(intk=for(intl=0;
kROW;
k+)0;
lCOL;
l+)if(node.digitij=digitkl)distance+=abs(i-k)+abs(jflag=true;
break;
elseflag=false;
if(flag)break;
returndistance;
intMinDistance(inta,intb)return(ab?
a:
b);
voidProcessNode(intindex)intx,y;
boolflag;
j0)Swap(node_up.digitxy,node_up.digitx-1y);
if(isExpandable(node_up)dist_up=Distance(node_up,dest.digit);
node_up.index=index;
node_up.dist=dist_up;
node_up.dep=node_vindex.dep+1;
node_v.push_back(node_up);
Nodenode_down;
Assign(node_down,index);
向下扩展的节点intdist_down=MAXDISTANCE;
if(x0)Swap(node_left.digitxy,node_left.digitxy-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_vindex.dep+1;
node_v.push_back(node_left);
Nodenode_right;
Assign(node_right,index);
/向右扩展的节点intdist_right=MAXDISTANCE;
if(y2)Swap(node_right.digitxy,node_right.digitxy+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_vindex.dep+1;
node_v.push_back(node_right);
node_vindex.dist=MAXNUM;
intmain()/主函数intnumber;
coutInputsource:
endl;
for(inti=0;
i+)/输入初始的表for(intj=0;
jnumber;
src.digitij=number;
src.index=0;
src.dep=1;
coutInputdestination:
/输入目的表for(intm=0;
mROW;
m+)for(intn=0;
nnumber;
dest.digitmn=number;
node_v.push_back(src);
/在容器的尾部加一个数据coutSearch.endl;
clock_tstart=clock();
while
(1)if(isEmptyOfOPEN()coutCanntsolvethisstatement!
endl;
return-1;
elseintloc;
/thelocationoftheminimizenode最优节点的位置loc=GetMinNode();
if(isEqual(loc,dest.digit)vectorrstep_v;
coutSource:
coutsrcendl;
PrintSteps(loc,rstep_v);
coutSuccessful!
coutUsing(clock()-start)/CLOCKS_PER_SECseconds.endl;
elseProcessNode(loc);
return0;
程序运行效果图28316475(初始状态)123804765(结束状态)Step3023II3T65k个人实验小结A*算法是一种有序搜索算法,其特点在于对估价函数的定义上。
对于一般的有序搜索,总是选择f值最小的节点作为扩展节点。
通过本实验,我熟悉启发式搜索的定义、估价函数和算法过程,并利用A*算法求解了8数码难题,理解了求解流程和搜索顺序。
实验过程中巩固了所学的知识,通过实验也提高了自己的编程和思维能力,收获很多。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人工智能 算法