八数码实验报告.docx
《八数码实验报告.docx》由会员分享,可在线阅读,更多相关《八数码实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
![八数码实验报告.docx](https://file1.bdocx.com/fileroot1/2022-10/24/402e00d4-0f05-4e1c-a250-99ba47b30432/402e00d4-0f05-4e1c-a250-99ba47b304321.gif)
八数码实验报告
八数码实验报告
八数码实验报告
篇一:
八数码实验报告利用人工智能技术解决八数码游戏问题
1.八数码游戏问题简介九宫排字问题(又称八数码问题)是人工智能当中有名的难题之一。
问题是在3×3方格盘上,放有八个数码,剩下第九个为空,每一空格其上下左右的数码可移至空格。
问题给定初始位置和目标位置,要求通过一系列的数码移动,将初始位置转化为目标位置。
2.八数码游戏问题的状态空间法表示
①建立一个只含有初始节点S0的搜索图G,把S0放入OPEN表中
②建立CLOSED表,且置为空表
③判断OPEN表是否为空表,若为空,则问题无解,退出
④选择OPEN表中的第一个节点,把它从OPEN表移出,并放入CLOSED表中,将此节点记为节点n
⑤考察节点n是否为目标节点,若是,则问题有解,成功退出。
问题的解就是沿着n到S0的路径得到。
若不是转
⑥
⑥扩展节点n生成一组不是n的祖先的后继节点,并将它们记为集合M,将M中的这些节点作为n的后继节点加入图G中
⑦对未在G中出现过的(OPEN和CLOSED表中未出现过的)集合M中的节点,设置一个指向父节点n的指针,并把这些节点放入OPEN表中;对于已在G中出现过的M中的节点,确定是否需要修改指向父节点的指针;对于已在G中出现过并已在losed表中的M中的节点,确定是否需要修改通向他们后继节点的指针。
⑧按某一任意方式或某种策略重排OPEN表中节点的顺序⑨转
③
3.八数码游戏问题的盲目搜索技术宽度优先搜索:
1、定义如果搜索是以接近起始节点的程度依次扩展节点的,那么这种搜索就叫做宽度优先搜索把起始节点放到OPEN表中如果OPEN是个空表,则没有解,失败退出;否则继续。
把第一个节点扩展节点n。
如果没有后继节点,则转向上述第把n的所有后继节点放到OPEN表末端,并提供从这些后继节点回到n的指针。
如果n的任一个后继节点是个目标节点,则找到一个解答,成功退出;否则转向第把起始节点放到OPEN表中如果OPEN是个空表,则没有解,失败退出;否则继续。
把第一个节点考察节点n是否为目标节点,若是,则找到问题的解,用回溯法求解路径,退出
(5)如果没有后继节点,则转向上述第扩展节点n,把n的所有后继节点放到OPEN表前端,并提供从这些后继节点回到n的指针。
转向第=g+h=g*+h*f*把起始节点放到OPEN表中,并计算估价函数f如果OPEN是个空表,则没有解,失败退出;否则继续。
把OPEN表中的第一个节点(股价函数最小的节点n),移入CLOSED表。
如果n是目标节点,问题得解,退出。
否则继续。
判断节点n是否可扩展。
若否则转向第对节点n进行扩展,并对其所有后继节点计算估价函数f(n)的值,并为每个后继节点设置指向n节点的指针。
把这些后继节点都送入OPEN表,然后对OPEN表中的全部节点按照估价函数值从小到大的顺序排序。
转向第编制程序实现求解8数码问题A?
算法,采用估价函数?
n?
,f?
nd?
n?
p?
n?
其中:
d?
n?
是搜索树中结点n的深度;?
n?
为结点n的数据库中错放的棋子个数;p?
n?
为结点n的数据库中每个棋子与其目标位置之间的距离总和。
2)分析上述
⑴中两种估价函数求解8数码问题的效率差别,给出一个是p?
n?
的上界的h?
n?
的定义,并测试使用该估价函数是否使算法失去可采纳性。
三、实验原理:
1.问题描述:
八数码问题也称为九宫问题。
在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同。
棋盘上还有一个空格(以数字0来表示),与空格相邻的棋子可以移到空格中。
要求解决的问题是:
给出一个初始状态和一个目标状态,找出一种从初始转变成目标状态的移动棋子步数最少的移动步骤。
所谓问题的一个状态就是棋子在棋盘上的一种摆法。
解八数码问题实际上就是找出从初始状态到达目标状态所经过的一系列中间过渡状态。
原理描述:
1有序搜索算法:
(1)原理:
在搜索过程中,OPEN表中节点按照其估价函数值以递增顺序排列,选择OPEN表中具有最小估价函数值的节点作为下一个待扩展的节点,这种搜索方法称为有序搜索。
在本例中,估价函数中的g=g*树形方式扩展节点。
Node为要扩展的当前节点,depth为当前深度,zero存放该节点空格位置信息,moveflag即扩展节点的移动方式,Choose为选择函数?
分别为表OPEN、CLOSE的创建和表的插入操作。
7)LNode*Getminf主要是实现从OPEN表中选择一个f值最小的节点i。
如果有几个节点值相同,当其中有一个为目标节点时,则选择此目标节点;否则就选择其中任一个节点作为节点i。
五、实验小结通过本次试验,我对启发式搜索有了更加深入的了解。
在实验中,通过对两种启发式搜索所扩在的节点数来看,p{Chessboardboard;LNode*parent,*next;boolflag;Pieepos;记录每个数码a的位置r行列intd,f,move;
d:
深度;f:
启发函数值;move:
父节点移动到该节点的方式}inti,j,zr;int*z=zr;for{}intpik{int=0,i,j,ii,jj;forforif++;
篇三:
八数码实验报告53华中师范大学计算机学院实验报告书实验题目:
八数码问题求解课程名称:
人工智能主讲教师:
金聪班级:
试验时间:
1.问题描述:
八数码问题也称为九宫问题。
在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同。
棋盘上还有一个空格(以数字0来表示),与空格相邻的棋子可以移到空格中。
要求解决的问题是:
给出一个初始状态和一个目标状态,找出一种从初始转变成目标状态的移动棋子步数最少的移动步骤。
初始状态103724685
3.目标状态123,804,765
4.搜索策略启发式搜索技术
(1)原理:
启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。
这样可以省略大量无谓的搜索路径,提高了效率。
在启发式搜索中,对位置的估价是十分重要的。
采用了不同的估价可以有不同的效果。
(2)估价函数计算一个节点的估价函数,可以分成两个部分:
1、已经付出的代价(起始节点到当前节点);
2、将要付出的代价(当前节点到目标节点)。
节点n的估价函数f=g把初始状态假如open表中;While(未找到解状态表非空)
①在open表中找到评价值最小的节点,作为当前结点;
②判断当前结点状态和目标状态是否一致,若一致,跳出循环;否则跳转到
③;
③对当前结点,分别按照上、下、左、右方向移动空格位置来扩展新的状态结点,并计算新扩展结点的评价值f并记录其父节点;
④对于新扩展的状态结点,判断其是否重复,若不重复,把其加入到open表中;
⑤把当前结点从open表中移除;EndhileEndif输出结果;End
6.源代码#inlude<stdio.h#inlude<mallo.h#inlude<stdlib.h#defineOverflo1#defineN3intgoal={1,2,3,8,0,4,7,6,5};intzero,NodeQTY=0;int*z=zero;记录0的位置,zero:
r行;zero:
列tpedefintPiee;strutChessboard{棋盘信息Pieepos;记录每个数码a的位置r行列intd,f,move;
d:
深度;f:
启发函数值;move:
父节点移动到该节点的方式};strutLNode{Chessboardboard;LNode*parent,*next;boolflag;};tpedefLNode*List;int*Findzero{inti,j,zr;int*z=zr;for{int=0,i,j,ii,jj;forforif{LNode*NeNode=neLNode;for{ase1:
向左移,不能出界:
zero=2NeNode-board.pos-1]-1]=NeNode-board.pos-1]-2];NeNode-board.pos-1]-2]=0;break;ase2:
向右移,不能出界:
zero<=2NeNode-board.pos-1]-1]=NeNode-board.pos-1]];NeNode-board.pos-1]]=0;break;ase3:
向上移,不能出界:
zero=2NeNode-board.pos-1]-1]=NeNode-board.pos-2]-1];NeNode-board.pos-2]-1]=0;break;ase4:
向下移,不能出界:
zero<=2NeNode-board.pos-1]-1]=NeNode-board.pos]-1];NeNode-board.pos]-1]=0;break;}NeNode-board.d=depth+1;sith{Open=exit{Listp=L;hile{篇
四:
人工智能大作业八数码问题基于A星算法的八数码问题求解学号:
姓名:
摘要:
在人工智能领域中,八数码问题一直都是一个游戏难题。
介绍了八数码问题,然后在启发式搜索算法上对A*算法定义进行了解释,并在其旨在提高搜索效率的方面作了比较详尽的介绍,详细描述了基于图搜索算法的解决此类问题的一种启发式搜索算法:
A*算法。
再依据这种算法用可视化编程语言VC++
6.0来实现八数码问题的求解过程,取得了预期的搜索解,提高了搜索效率。
关键词:
八数码问题;启发式搜索;A*算法本组成员:
本人分工:
主要负责进行问题分析,提出解决方案,进行系统设计,算法上具体负责主函数的编写。
1引言八数码问题是人工智能的一个经典的问题。
文中通过设计一个基于A*算法的状态空间搜索程序,对于给定的初始状态,采用h=p表示以每一个将牌与目标位置之间距离的总和作为启发函数的度量,并用可视化编程语言VC++来实现该问题。
2算法原理与系统设计
1)A*算法思想A*算法是对A算法的估价函数f<=h*=0,对于结点m和n(n是m的子结点)有h–h<=1满足单调限制条件。
3)open和losed表的数据结构表示对open表的操作,每次需要得到所有待扩展结点中f值最小的那个结点。
losed表存储已扩展的结点间的扩展关系,主要用于输出路径。
losed表中任意一个结点都存储有它的前驱结点的信息,考虑losed表中任意一个结点,如果它是初始结点,它没有前驱结点,如果不是根结点,扩展该结点时它的前驱结点已经记录。
从而在losed表中形成扩展关系的树状结构。
因为只需要前驱点的下标位置,可以用数组实现。
每个结点记录8数码格局和它的前驱结点的下标。
4)问题分析首先,八数码问题包括一个初始状态和目标状态把初始状态假如open表中;While(未找到解状态表非空)
①在open表中找到评价值最小的节点,作为当前结点;
②判断当前结点状态和目标状态是否一致,若一致,跳出循环;否则跳转到
③;
③对当前结点,分别按照上、下、左、右方向移动空格位置来扩展新的状态结点,并计算新扩展结点的评价值f并记录其父节点;
④对于新扩展的状态结