欢迎来到天天文库
浏览记录
ID:55022460
大小:349.50 KB
页数:11页
时间:2020-04-26
《人工智能实验报告-八数码问题.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、实验一启发式搜索算法姓名:徐维坚学号:日期:2012/6/29一、实验目的:熟练掌握启发式搜索算法及其可采纳性。二、实验内容:使用启发式搜索算法求解8数码问题。1)编制程序实现求解8数码问题算法,采用估价函数,其中:是搜索树中结点的深度;为结点的数据库中错放的棋子个数;为结点的数据库中每个棋子与其目标位置之间的距离总和。2)分析上述⑴中两种估价函数求解8数码问题的效率差别,给出一个是的上界的的定义,并测试使用该估价函数是否使算法失去可采纳性。三、实验原理:1.问题描述:八数码问题也称为九宫问题。在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某
2、一数字,不同棋子上标的数字不相同。棋盘上还有一个空格(以数字0来表示),与空格相邻的棋子可以移到空格中。要求解决的问题是:给出一个初始状态和一个目标状态,找出一种从初始转变成目标状态的移动棋子步数最少的移动步骤。所谓问题的一个状态就是棋子在棋盘上的一种摆法。解八数码问题实际上就是找出从初始状态到达目标状态所经过的一系列中间过渡状态。2.原理描述:2.1有序搜索算法:(1)原理:在搜索过程中,OPEN表中节点按照其估价函数值以递增顺序排列,选择OPEN表中具有最小估价函数值的节点作为下一个待扩展的节点,这种搜索方法称为有序搜索。在本例中,估价函数中的
3、取节点深度,为节点n的状态与目标状态之间错放的个数,即函数。(2)算法描述:①把起始节点S放到OPEN表中,并计算节点S的;②如果OPEN是空表,则失败退出,无解;③从OPEN表中选择一个值最小的节点。如果有几个节点值相同,当其中有一个为目标节点时,则选择此目标节点;否则就选择其中任一个节点作为节点;④把节点从OPEN表中移出,并把它放入CLOSED的已扩展节点表中;⑤如果是个目标节点,则成功退出,求得一个解;⑥扩展节点,生成其全部后继节点。对于的每一个后继节点:计算;如果既不在OPEN表中,又不在CLOCED表中,则用估价函数把它添入OPEN表中
4、。从加一指向其父节点的指针,以便一旦找到目标节点时记住一个解答路径;如果已在OPEN表或CLOSED表中,则比较刚刚对计算过的和前面计算过的该节点在表中的值。如果新的较小,则(I)以此新值取代旧值。(II)从指向,而不是指向他的父节点。(III)如果节点在CLOSED表中,则把它移回OPEN表中。⑦转向②,即GOTO②。(3)算法流程图:2.2启发式搜索技术(1)原理启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。这样可以省略大量无谓的搜索路径,提高了效率。在启发式搜索中,对位置的估价是十分
5、重要的。采用了不同的估价可以有不同的效果。(2)估价函数计算一个节点的估价函数,可以分成两个部分:1、已经付出的代价(起始节点到当前节点);2、将要付出的代价(当前节点到目标节点)。节点n的估价函数定义为从初始节点、经过n、到达目标节点的路径的最小代价的估计值,即=+。是从初始节点到达当前节点n的实际代价;是从节点n到目标节点的最佳路径的估计代价,体现出搜索过程中采用的启发式信息(背景知识),称之为启发函数。所占的比重越大,越趋向于宽度优先或等代价搜索;反之,的比重越大,表示启发性能就越强。本实验中我们使用函数,其值是节点n与目标状态节点相比较,每
6、个错位棋牌在假设不受阻拦的情况下,移动到目标状态相应位置所需走步(移动次数)的总和。显然比更接近于,因为不仅考虑了错位因素,还考虑了错位的距离。(3)算法描述:参考有序搜索算法描述,基本相同。流程图亦参考有序算法流程图。四、实验程序及其说明:1)intgoal[N][N],structChessboard:试验中我定义goal数组为目标状态——{1,2,3,8,0,4,7,6,5}。结构体Chessboard记录棋盘信息,其中变量pos数组坐标记录每个数码a的位置,其值为数码a。d表示该棋盘的深度,f为启发函数值,move为父节点移动到该节点的方式
7、,以便在输出时告诉用户该如何移动棋子知道目标状态。2)structLNode:定义节点LNode结构体,存放该节点状态时的棋盘信息board,和指向父节点、下一节点的指针(*parent,*next),以及标记量flag——值为true时表示该节点是最佳路径上的节点。3)int*Findzero(LNode*&Node):为方便找到空格,我设计了找到该函数Findzero(*&Node),以便找到当前节点空格所在位置以利于接下来的程序执行。返回值为空格所在的行和列。4)intWrong(LNode*Node)和intpick(LNode*Node)
8、:分别为函数和。5)LNode*extend(LNode*Node,intdepth,intzero[2],intmove
此文档下载收益归作者所有