八数码难题的搜索求解演示.docVIP

  • 17
  • 0
  • 约7.89千字
  • 约 19页
  • 2015-10-16 发布于江苏
  • 举报
八数码难题的搜索求解演示.doc

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

文档评论(0)

1亿VIP精品文档

相关文档