资源描述:
《八数码难题的搜索求解演示》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、人工智能实验报告学院:信息科学与工程学院班级:自动化0901班学号:0909090316姓名:孙锦岗指导老师:刘丽珏日期:2011年12月20日一、实验名称、目的及内容实验名称:八数码难题的搜索求解演示实验目的:加深对图搜索策略概念的理解,掌握搜索算法。实验内容要求:以八数码难题为例演示广度优先或深度优先搜索、A算法(本实验使用的是广度优先搜索)的搜索过程,争取做到直观、清晰地演示算法。八数码难题:在3×3方格棋盘上,分别放置了标有数字1,2,3,4,5,6,7,8的八张牌,初始状态S0,目标状态如图所示,可以使用的操
2、作有:空格上移,空格左移,空格右移,空格下移。试编一程序实现这一搜索过程。二、实验原理及基本技术路线图实验原理:八数码问题中,程序产生的随机排列转换成目标共有两种可能,而且这两种不可能同时成立,也就是奇数排列和偶数排列。我们可以把一个随机排列的数组从左到右从上到下用一个数组表示,例如{8,7,1,5,2,6,3,4,0}其中0代表空格。它在奇序列位置上。在这个数组中我们首先计算它能够重排列出来的结果,公式就是:∑(F(X))=Y,其中F(X),就是一个数他前面比这个数小的数的个数,Y为奇数和偶数个有一种解法。那么上面的
3、数组我们就可以解出它的结果。数据结构:本实验使用的数据结构是队列,应用队列先进先出的特点来实现对节点的保存和扩展。首先建立一个队列,将初始结点入队,并设置队列头和尾指,然后取出队列(头指针所指)的结点进行扩展,从它扩展出子结点,并将这些结点按扩展的顺序加入队列,然后判断扩展出的新结点与队列中的结点是否重复,如果重复则,否则记录其父结点,并将它加入队列,更新队列尾指针,然后判断扩展出的结点是否是目标结点,如果是则显示路径,程序结束。否则如果队列头的结点可以扩展,直接返回第二步。否则将队列头指针指向下一结点,再返回第二步,
4、知道扩展出的结点是目标结点结束,并显示路径。算法分析:九宫问题的求解方法就是交换空格(0)位置,直至到达目标位置为止。如图所示:2831647587152634871523468715263487152346因此可知:九宫的所以排列有9!种,也就是362880种排法,数据量是非常大的,我使用广度搜索,需要记住每一个结点的排列形式,要是用数组记录的话会占用很多的内存,我们把数据进行适当的压缩。使用DWORD形式保存,压缩形式是每个数字用3位表示,这样就是3×9=27个字节,由于8的二进制表示形式1000,不能用3位表示,
5、我使用了一个小技巧就是将8表示位000,然后用多出来的5个字表示8所在的位置,就可以用DWORD表示了。用移位和或操作将数据逐个移入,比乘法速度要快点。定义了几个结果来存储遍历到了结果和搜索完成后保存最优路径。算法描述:过程BREADTH-SEARCH(1)G:=G0(G0=s),OPEN:=(s),CLOSE:=();(2)LOOP:IFOPEN=()THENEXIT(FAIL);(3)N:=FIRST(OPEN);(4)IFGOAL(n)THENEXIT(SUCCESS);(5)RENMOVE(n,OPEN),AD
6、D(n,CLOSED);(6)EXPAND(n)→{mi},G:=ADD(mi,G);(7)结点放在OPEN表的后面,使深度浅的结点可优先扩展。广度优先搜索的源代码如下:voidBfs(){queue
7、osition+derection[k];if(tmp.position<0
8、
9、tmp.position>8
10、
11、(k>1&&tmp.position/3!=node.position/3))continue;tmp.myindex=HashValue(node,k);if(0!=HashTable[tmp.myindex])continue;tmp.detail[node.position]=tmp.detail[tmp.position];//移动空格tmp.detail[tmp.position]=0;HashTa
12、ble[tmp.myindex]=node.myindex;//状态记录到hashtable中if(node.myindex==EndIndex)return;Queue.push(tmp);}}return;}实验流程图:开始输入要排序的0~8数码序列建立一个队列,将初始结点入队,并设置队列头和尾指针取出队列头(头指针所指)的结