




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
重庆交通大学计算机与信息学院验证性实验报告班 级: 软件开发 专业 2013 级 1 班 学 号: 631306050105 姓 名: 何昭霞 实验项目名称: 状态空间搜索 实验项目性质: 验证性实验 实验所属课程: 人工智能 实验室(中心):软件中心实验室(语音楼8楼) 指 导 教 师 : 朱振国 实验完成时间: 2016 年 6 月 10 日评阅意见:实验成绩: 签名: 年 月 日一、实验目的 1. 理解和掌握状态空间搜索的策略。 2.熟悉人工智能系统中的问题求解过程; 3.熟悉状态空间的盲目搜索和启发式搜索算法的应用; 4.熟悉对八数码问题的建模、求解及编程语言的应用。二、实验内容及要求(一)实验内容在一个3*3的九宫中有1-8个数码及一个空格随即的摆放在其中的格子里,现在要求实验这个问题:将该九宫格调整为某种有序的形式。调整的规则是,每次只能将与空格(上、下、左、右)相邻的一个数字平移到空格中。 (二)实验要求 用选定的编程语言编写程序,利用不同的搜索策略进行状态空间搜索(如宽度优先搜索、深度优先搜索、有界深度优先搜索等)。三、实验设备及软件 PC机一台、Visual Studio 2012编程软件四、设计方案 题目 状态空间搜索 8数码问题 设计的主要思路考虑广度优先算法:(1) 状态空间盲目搜索宽度优先搜索其基本思想是,从初始节点开始,向下逐层对节点进形依次扩展,并考察它是否为目标节点,再对下层节点进行扩展(或搜索)之前,必须完成对当层的所有节点的扩展。再搜索过程中,未扩展节点表OPEN中的节点排序准则是:先进入的节点排在前面,后进入的节点排在后面。(2) 宽度优先算法如下首先把初始结点S0放入OPEN表中,然后若OPEN表为空,则搜索失败,问题无解,接着取OPEN表中最前面的结点N放在CLOSE表中,并冠以顺序编号n,若目标结点Sg=N,则搜索成功,问题有解。若N无子结点,则重复取OPEN表中最前面的结点N放在CLOSE表中。扩展结点N,将其所有子结点配上指向N的放回指针,依次放入OPEN表的尾部,然后重复取OPEN表中最前面的结点N放在CLOSE表中。 根据算法的中心思想进行程序设计,其流程图如下图所示。 主要功能使用C语言相关知识,将3*3的九宫格调整为某种有序的形式。五、主要代码#include #include struct node int x,y; int cntdif;int step; int f9; int xy33; queue10000; int map33; int dir42=-1,0,1,0,0,1,0,-1; int open10000; int zz9; int f1,f2; struct node sour,dest; queuetail.fi*3+j=queuetail.xyij=ffi*3+j; queuetail.step=HH.step+1; queuetail.x=sx; queuetail.y=sy; tdif=count(queuetail.f,zz); opentail=visit(queuetail.f); print(queuetail.xy); if(match(queuetail) printf(step(s):%d!n,queuetail.step); return; qsort(queue+head,tail-head+1,sizeof(queue0),comp);/排序,每次选择cntdif数目最小的扩展 int main() int i,j,a9,b9; printf(Please input the nitial status,input 0 to the vacant position :n); for(i=0;i3;i+) for(j=0;j3;j+) scanf(%d,&mapij); sour.xyij=mapij; sour.fi*3+j=mapij; ai*3+j=mapij; if(mapij=0) sour.x=i; sour.y=j; sour.step=0; tdif=0; printf(Please input the final status:n); for(i=0;i3;i+) for(j=0;j3;j+) scanf(%d,&mapij); dest.xyij=mapij; dest.fi*3+j=mapij; bi*3+j=mapij; zzi*3+j=mapij; printf(n); if(judge(a)+judge(b)&1) printf(The final status cannot be reached .); return 0; printf(The searching process is:n); bfs(); return 0; 六、测试结果及说明 七、实验体会 人工智能搜索可分为盲目搜索和启发式搜索。盲目搜索算法有宽度优先算法、深度优先算法(有界深度优先算法),启发式搜索算法有A算法、A*算法。我在本实验中,采用的是宽度优先(广度优先)算法,这种算法是按预定的控制策略进行,在搜素的过程中所获得的信息不用来改进控制策略。由于搜索总是按预定的路线进行,没有考虑问题本身的特性,这种缺乏问题求解的针对性,需要进行全方位的搜索,而没有选择最优的搜索路径。通过这次实验更加熟悉状态空间的宽度优先搜索、深度优先搜索和启发式搜索算法及计算机语言对常用数据结构如链表、队列等的描述应用。因此,我对人工智能搜索有了更深的认识。 重庆交通大学计算机与信息学院验证性实验报告班 级: 软件开发 专业 2013 级 1 班 学 号: 631306050105 姓 名: 何昭霞 实验项目名称: 启发式搜索 实验项目性质: 验证性实验 实验所属课程: 人工智能 实验室(中心):软件中心实验室(语音楼8楼) 指 导 教 师 : 朱振国 实验完成时间: 2016 年 6 月 10 日评阅意见:实验成绩: 签名: 年 月 日一、实验目的 理解和掌握A*算法。二、实验内容及要求(一)实验内容在8数码问题中,利用策略函数判断搜索,并使用A*算法减少搜索目标。 (二)实验要求 用选定的编程语言编写程序,利用不同的搜索策略进行状态空间搜索(如宽度优先搜索、深度优先搜索、有界深度优先搜索等)。三、实验设备及软件 PC机一台、Visual Studio 2012编程软件四、设计方案 题目 启发式搜索A*算法 设计的主要思路根据任务要求,该实验我采用A*搜索算法。对于八数码问题的解决,首先要考虑是否有答案。每一个状态可认为是一个19的矩阵,问题即通过矩阵的变换,是否可以变换为目标状态对应的矩阵.由数学知识可知,可计算这两个有序数列的逆序值,如果两者都是偶数或奇数,则可通过变换到达,否则,这两个状态不可达。这样,就可以在具体解决问题之前判断出问题是否可解,从而可以避免不必要的搜索。如果初始状态可以到达目标状态,常用的状态空间搜索有深度优先和广度优先。广度优先是从初始状态一层一层向下找,直到找到目标为止。深度优先是按照一定的顺序前查找完一个分支,再查找另一个分支,以至找到目标为止。在这里就要用到启发式搜索启发中的估价是用估价函数表示的,如:f(n)=g(n)+h(n)其中f(n)是节点n的估价函数,g(n)是在状态空间中从初始节点到n节点的实际代价,h(n)是从n到目标节点最佳路径的估计代价。在此八数码问题中,显然g(n)就是从初始状态变换到当前状态所移动的步数,估计函数f(n)我们就可采用当前状态各个数字牌不在目标状态未知的个数,即错位数。 1.状态的表示 在A*算法中,需要用到open表和closed表,特别是在open表中,待扩展节点间有很严格的扩展顺序。因此在表示当前状态的变量中,与数据结构中的链表相似,必须要有能指向下一个扩展节点的指针,以完成对open表中元素的索引。这里表示问题的结构体包括表示当前节点状态的DATA和指向open表中下一个待扩展节点的指针NEXT。其中DATA中包括的内容采用一个的二维数组s33表示当前状态的具体信息。而为了保证在搜索到目标状态后能够顺利复现寻优路径,当前状态的DATA中还应该包括一个指向其父节点的指针father,这样,才能在达到目标状态后,通过指针father逐层回溯到初始状态,即复现寻优路径。2.启发函数的设计 根据A*算法的定义,启发函数应满足:h(n)next = NULL; /判断链表是否为空 bool isEmpty(PNode Head) if(Head-next = NULL) return true; else return false; /从链表中拿出一个数据 void popNode(PNode &Head , PNode &FNode)if(isEmpty(Head) FNode = NULL; return; FNode = Head-next; Head-next = Head-next-next; FNode-next = NULL; /向结点的最终后继结点链表中添加新的子结点void addSpringNode(PNode &Head , PNode newData) PSPLink newNode = (PSPLink)malloc(sizeof(SPLink); newNode-pointData = newData; newNode-next = Head-child; Head-child = newNode; /释放状态图中存放结点后继结点地址的空间 void freeSpringLink(PSPLink &Head) PSPLink tmm; while(Head != NULL) tmm = Head; Head = Head-next; free(tmm); /释放open表与closed中的资源 void freeLink(PNode &Head) PNode tmn; tmn = Head; Head = Head-next; free(tmn); while(Head != NULL) /首先释放存放结点后继结点地址的空间freeSpringLink(Head-child); tmn = Head; computeAllValue(udNewNode , theNode); /将本结点加入后继结点链表addNode(spring , udNewNode); /空的格子下边的格子向上移动if(row != 2) PNode duNewNode = (PNode)malloc(sizeof(NNode); statusAEB(duNewNode , theNode); changeAB(duNewNode-datarowcol , duNewNode-datarow + 1col); if(hasAnceSameStatus(duNewNode , theNode-parent) free(duNewNode);/与父辈相同,丢弃本结点 else duNewNode-parent = theNode; duNewNode-child = NULL; duNewNode-next = NULL; computeAllValue(duNewNode , theNode); /将本结点加入后继结点链表addNode(spring , duNewNode); /输出给定结点的状态void outputStatus(PNode stat) for(int i = 0 i 3 i+) for(int j = 0 j 3 j+) cout dataij ; cout gvalue; if(goal-parent != NULL) outputBestRoad(goal-parent); cout 第 deepnum- 层的状态: endl; outputStatus(goal); void AStar() PNode tmpNode;/指向从open表中拿出并放到closed表中的结点的指针PNode spring;/tmpNode的后继结点链PNode tmpLNode;/tmpNode的某一个后继结点PNode tmpChartNode; PNode thePreNode;/指向将要从closed表中移到open表中的结点的前一个结点指针bool getGoal = false;/标识是否达到目标状态long numcount = 1;/记录从open表中拿出结点的序号initial();/对函数进行初始化initLink(spring);/对后继链表的初始化tmpChartNode = NULL; cout 从open表中拿出的结点的状态及相应的值 endl; while(!isEmpty(open) /从open表中拿出f值最小的元素,并将拿出的元素放入closed表中popNode(open , tmpNode); addNode(closed , tmpNode); cout 第 numcount+ 个状态是: endl; outputStatus(tmpNode); cout 其f值为: fvalue endl; cout 其g值为: gvalue endl; cout 其h值为: hvalue gvalue gvalue) tmpChartNode-parent = tmpLNode-parent; tmpChartNode-gvalue = tmpLNode-gvalue; tmpChartNode-fvalue = tmpLNode-fvalue; free(tmpLNode); /状态在closed表中已经存在else if(inLink(tmpLNode , closed , tmpChartNode , thePreNode) addSpringNode(tmpNode , tmpChartNode); if(tmpLNode-gvalue gvalue) PNode commu; tmpChartNode-parent = tmpLNode-parent; tmpChartNode-gvalue = tmpLNode-gvalue; tmpChartNode-fvalue = tmpLNode-fvalue; freeSpringLink(tmpChartNode-child); tmpChartNode-child = NULL; popNode(the
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年变化点管理考试题及答案
- 混凝土防水施工技术方案
- 钢结构连接节点设计优化方案
- 呼兰河传阅读测试题及答案
- 机械设备采购合同范本【三篇】
- 体育业务考试试题及答案
- 小学三级知识竞赛题及答案
- 济南市前期物业管理委托合同
- 广告学原理学习心得范例五篇
- 保障性住房项目可行性分析与风险评估方案
- 人才服务合同书
- 2025年工会财务大赛理论题库(附答案)
- 2025-2026学年统编版八年级上册道德与法治教学计划含教学进度表
- 矿井顶板事故防治课件
- 2025年工会入职考试试题及答案
- 2025年中国电力投资集团校园招聘笔试题型分析及备考策略
- 旅游服务安全知识培训课件
- 抗生素课件教学课件
- 公司章程制定合同协议书范本模板
- 2024人教PEP版三年级英语上册全册教案
- 中国慢性胃炎诊治指南(2022年)解读
评论
0/150
提交评论