采用A算法解决八数码问题_第1页
采用A算法解决八数码问题_第2页
采用A算法解决八数码问题_第3页
采用A算法解决八数码问题_第4页
采用A算法解决八数码问题_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、人工智能实验一报告题目:采用A*算法解决八数码问题姓名:张博涵学号:081110317专业:信息与计算科学提交日期:2014-05-22- -structSpringLink*next;/指向兄第结点SPLink,*PSPLink;PNodeopen;PNodeclosed;/开始状态与目标状态statusstartt=0,1,2,3,4,5,6,7,8;statustarget=1,4,2,3,5,8,6,7,0;/初始化一个空链表voidinitLink(PNode&Head)Head=(PNode)malloc(sizeof(NNode);Head-next=NULL;/判断链表是否为空

2、boolisEmpty(PNodeHead)if(Head-next=NULL)returntrue;elsereturnfalse;/从链表中拿出一个数据voidpopNode(PNode&Head,PNode&FNode)if(isEmpty(Head)FNode=NULL;return;FNode=Head-next;Head-next=Head-next-next;FNode-next=NULL;/向结点的最终后继结点链表中添加新的子结点voidaddSpringNode(PNode&Head,PNodenewData)PSPLinknewNode=(PSPLink)malloc(si

3、zeof(SPLink);newNode-pointData=newData;newNode-next=Head-child;Head-child=newNode;/释放状态图中存放结点后继结点地址的空间voidfreeSpringLink(PSPLink&Head)PSPLinktmm;while(Head!=NULL)tmm=Head;Head=Head-next;free(tmm);释放open表与closed表中的资源voidfreeLink(PNode&Head)PNodetmn;tmn=Head;Head=Head-next;free(tmn);while(Head!=NULL)/

4、首先释放存放结点后继结点地址的空间freeSpringLink(Head-child);tmn=Head;Head=Head-next;free(tmn);/向普通链表中添加一个结点voidaddNode(PNode&Head,PNode&newNode)newNode-next=Head-next;Head-next=newNode;/向非递减排列的链表中添加一个结点voidaddAscNode(PNode&Head,PNode&newNode)PNodeP;PNodeQ;P=Head-next;Q=Head;while(P!=NULL&P-fvaluefvalue)Q=P;P=P-next

5、;/上面判断好位置之后,下面就是简单的插入了newNode-next=Q-next;Q-next=newNode;计算结点额h值intcomputeHValue(PNodetheNode)intnum=0;for(inti=0;i3;i+)for(intj=0;jdataij!=targetij)num+;returnnum;计算结点的f,g,h值voidcomputeAllValue(PNode&theNode,PNodeparentNode)if(parentNode=NULL)theNode-gvalue=0;elsetheNode-gvalue=parentNode-gvalue+1;

6、theNode-hvalue=computeHValue(theNode);theNode-fvalue=theNode-gvalue+theNode-hvalue;/初始化函数,进行算法初始条件的设置voidinitial()初始化open以及closed表initLink(open);initLink(closed);/初始化起始结点,令初始结点的父节点为空结点PNodeNULLNode=NULL;PNodeStart=(PNode)malloc(sizeof(NNode);for(inti=0;i3;i+)for(intj=0;jdataij=starttij;Start-parent=

7、NULL;Start-child=NULL;Start-next=NULL;computeAllValue(Start,NULLNode);起始结点进入open表addAscNode(open,Start);/将B节点的状态赋值给A结点voidstatusAEB(PNode&ANode,PNodeBNode)for(inti=0;i3;i+)for(intj=0;jdataij=BNode-dataij;/两个结点是否有相同的状态boolhasSameStatus(PNodeANode,PNodeBNode)for(inti=0;i3;i+)for(intj=0;jdataij!=BNode-

8、dataij)returnfalse;returntrue;/结点与其祖先结点是否有相同的状态boolhasAnceSameStatus(PNodeOrigiNode,PNodeAnceNode)while(AnceNode!=NULL)if(hasSameStatus(OrigiNode,AnceNode)returntrue;AnceNode=AnceNode-parent;returnfalse;/取得方格中空的格子的位置voidgetPosition(PNodetheNode,int&row,int&col)for(inti=0;i3;i+)for(intj=0;jdataij=0)r

9、ow=i;col=j;return;/交换两个数字的值voidchangeAB(int&A,int&B)intC;C=B;B=A;A=C;/检查相应的状态是否在某一个链表中boolinLink(PNodespciNode,PNodetheLink,PNode&theNodeLink,PNode&preNode)preNode=theLink;theLink=theLink-next;while(theLink!=NULL)if(hasSameStatus(spciNode,theLink)theNodeLink=theLink;returntrue;preNode=theLink;theLin

10、k=theLink-next;returnfalse;/产生结点的后继结点(与祖先状态不同)链表voidSpringLink(PNodetheNode,PNode&spring)introw;intcol;getPosition(theNode,row,col);/空的格子右边的格子向左移动if(col!=2)PNoderlNewNode=(PNode)malloc(sizeof(NNode);statusAEB(rlNewNode,theNode);changeAB(rlNewNode-datarowcol,rlNewNode-datarowcol+1);if(hasAnceSameStat

11、us(rlNewNode,theNode-parent)free(rlNewNode);/与父辈相同,丢弃本结点elserlNewNode-parent=theNode;rlNewNode-child=NULL;rlNewNode-next=NULL;computeAllValue(rlNewNode,theNode);/将本结点加入后继结点链表addNode(spring,rlNewNode);/空的格子左边的格子向右移动if(col!=0)PNodelrNewNode=(PNode)malloc(sizeof(NNode);statusAEB(lrNewNode,theNode);chan

12、geAB(lrNewNode-datarowcol,lrNewNode-datarowcol-1);if(hasAnceSameStatus(lrNewNode,theNode-parent)free(lrNewNode);/与父辈相同,丢弃本结点elselrNewNode-parent=theNode;lrNewNode-child=NULL;lrNewNode-next=NULL;computeAllValue(lrNewNode,theNode);/将本结点加入后继结点链表addNode(spring,lrNewNode);/空的格子上边的格子向下移动if(row!=0)PNodeudN

13、ewNode=(PNode)malloc(sizeof(NNode);statusAEB(udNewNode,theNode);changeAB(udNewNode-datarowcol,udNewNode-datarow-1col);if(hasAnceSameStatus(udNewNode,theNode-parent)free(udNewNode);/与父辈相同,丢弃本结点elseudNewNode-parent=theNode;udNewNode-child=NULL;udNewNode-next=NULL;computeAllValue(udNewNode,theNode);/将本

14、结点加入后继结点链表addNode(spring,udNewNode);/空的格子下边的格子向上移动if(row!=2)PNodeduNewNode=(PNode)malloc(sizeof(NNode);statusAEB(duNewNode,theNode);changeAB(duNewNode-datarowcol,duNewNode-datarow+1col);if(hasAnceSameStatus(duNewNode,theNode-parent)free(duNewNode);/与父辈相同,丢弃本结点elseduNewNode-parent=theNode;duNewNode-c

15、hild=NULL;duNewNode-next=NULL;computeAllValue(duNewNode,theNode);/将本结点加入后继结点链表addNode(spring,duNewNode);/输出给定结点的状态voidoutputStatus(PNodestat)for(inti=0;i3;i+)for(intj=0;j3;j+)coutdataij;coutgvalue;if(goal-parent!=NULL)outputBestRoad(goal-parent);cout第deepnum-层的状态:endl;outputStatus(goal);voidAStar()P

16、NodetmpNode;/指向从open表中拿出并放到closed表中的结点的指针PNodespring;/tmpNode的后继结点链PNodetmpLNode;/tmpNode的某一个后继结点PNodetmpChartNode;PNodethePreNode;/指向将要从closed表中移到open表中的结点的前一个结点的指针boolgetGoal=false;/标识是否达到目标状态longnumcount=1;/记录从open表中拿出结点的序号initial。;/对函数进行初始化initLink(spring);/对后继链表的初始化tmpChartNode=NULL;cout从open表中

17、拿出的结点的状态及相应的值endl;while(!isEmpty(open)从open表中拿出f值最小的元素,并将拿出的元素放入closed表中popNode(open,tmpNode);addNode(closed,tmpNode);cout第numcount+个状态是:endl;outputStatus(tmpNode);cout其f值为:fvalueendl;cout其g值为:gvalueendl;cout其h值为:hvaluegvaluegvalue)tmpChartNode-parent=tmpLNode-parent;tmpChartNode-gvalue=tmpLNode-gva

18、lue;tmpChartNode-fvalue=tmpLNode-fvalue;free(tmpLNode);状态在closed表中已经存在elseif(inLink(tmpLNode,closed,tmpChartNode,thePreNode)addSpringNode(tmpNode,tmpChartNode);if(tmpLNode-gvaluegvalue)PNodecommu;tmpChartNode-parent=tmpLNode-parent;tmpChartNode-gvalue=tmpLNode-gvalue;tmpChartNode-fvalue=tmpLNode-fvalue;freeSpringLink(tmpChartNode-child);tmpChartNode-child=NULL;popNode(thePreNode,commu);addAscNode(open

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论