八数码难题的搜索求解演示
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法描述:
过程BREADTH-SEARCH
(1)G:二GO(GO二s),OPEN:=(s),CLOSE:=();
(2)LOOP:IF OPEN=()THEN EXIT(FAIL);
(3)N:=FIRST(OPEN);
(4)IF GOAL (n) THEN EXIT(SUCCESS);
(5)RENMOVE( n,OPEN),ADD( n,CLOSED);
算法分析:
九宫问题的求解方法就是交换空格(0)位置,直至到达目标 位置为止。如图所示:
因此可知:九宫的所以排列有9!种,也就是3 6 2 8 8 0种排 法,数据量是非常大的,我使用广度搜索,需要记住每一个结点的排 列形式,要是用数组记录的话会占用很多的内存,我们把数据进行适 当的压缩。使用DWORD形式保存,压缩形式是每个数字用3位表 示,这样就是3X9=27个字节,由于8的二进制表示形式100 0,不能用3位表示,我使用了一个小技巧就是将8表示位0 0 0,然后用多出来的5个字表示8所在的位置, 就可以用DWORD表示 了。用移位和或操作将数据逐个移入,比乘法速度要快点。定义了几 个结果来存储遍历到了结果和搜索完成后保存最优路径。
数据结构:
本实验使用的数据结构是队列,应用队列先进先出的特点来实 现对节点的保存和扩展。首先建立一个队列,将初始结点入队,并设 置队列头和尾指,然后取出队列(头指针所指)的结点进行扩展,从 它扩展出子结点,并将这些结点按扩展的顺序加入队列, 然后判断扩 展出的新结点与队列中的结点是否重复, 如果重复则,否则记录其父 结点,并将它加入队列,更新队列尾指针,然后判断扩展出的结点是 否是目标结点,如果是则显示路径,程序结束。否则如果队列头的结 点可以扩展,直接返回第二步。否则将队列头指针指向下一结点,再 返回第二步,知道扩展出的结点是目标结点结束,并显示路径。
[]=[];
建立一个队列,将初始结点入队,并设置队列头和尾指
验步骤
(1)运行Microsoft Visual C++软件,新建工作空间,
得文档。
(2)输入源程序代码,进行编译,调试运行
(3)运行结果,按提示要求输入1—8这八个数,进行程序测验
2.实验源程序
#in elude<>
#in elude <>
验使用的是广度优先搜索)的搜索过程,争取做到直观、清晰地演示 算法。
八数码难题:在3X3方格棋盘上,分别放置了标有数字123,4,5,6,7,8的八张牌,初始状态SO,目标状态如图所示,可以
使用的操作有:空格上移,空格左移,空格右移,空格下移。试编一 程序实现这一搜索过程。
二、实验原理及基本技术路线图
();
for(int k =0 ; k < 4; k ++ )
{
Map tmp = no de;
=+derecti on[ k];
if < 0 || > 8 || (k > 1 &&/3 != /3 ))
con ti nue;
=HashValue( node , k );
if(0 != HashTable[] ) continue;
int Endlndex;//目标,上移,下移, 左移,右移
int const derectio n[4] ={ -3 , 3 ,-1, 1 };
//可移动的四个方向
int const Factorial[9] = {40320,5040,720 , 120,24 , 6 ,
2 , 1 , 1 };
int HashTable[HashTableSize]二{0};
//hash表,其中记录的是上一个父节点对应的位置
/****八数码的输入(在这里不做任何输入检查,均认为输入数据是
正确的)***/
void in put()
{
int i,j;
int sum , count ,in dex ;
\for(i = 0 ; i < 9 ; i ++ )
(6)EXPAND(n^{mi},G:=ADD(mi,G);
(7)结点放在OPENS的后面,使深度浅的结点可优先扩展。
广度优先搜索的源代码如下:
void Bfs()
{ queue<Map> Queue;
(org);
HashTable[ ] = -1;
while( NOT ())
{
Map node =();
人工智能实验报告
学
院:
信息科学与工程学院
班
级:
自动化0901班
学
号:
06
姓
名:
孙锦岗
指导老师:
刘丽珏
日
期:
2011年12月20日
一、实验名称、目的及内容
实验名称:
八数码难题的搜索求解演示
实验目的:
加深对图搜索策略概念的理解,掌握搜索算法。
实验内容要求:
以八数码难题为例演示广度优先或深度优先搜索、A算法(本实
{
sca nf("%1d", &[ i ]);
[i ] || = i);
}
for(i = 0 ; i < 9 ; i ++ )II计算逆序
{
if( 0 == [ i ])
con ti nue;
#in elude <>
#in elude <queue>
#in elude <stack>
using n ame源自文库paee std;
#defi ne HashTableSize 362881
#defi ne NOT !
#defi ne UP 0
#defi ne DOWN 1
#defi ne LEFT 2
实验原理:
八数码问题中,程序产生的随机排列转换成目标共有两种可能,而 且这两种不可能同时成立,也就是奇数排列和偶数排列。我们可以把 一个随机排列的数组从左到右从上到下用一个数组表示,例如{8,
7,1,5,2,6,3,4,0}其中0代表空格。它在奇序列位 置上。
在这个数组中我们首先计算它能够重排列出来的结果,公式就是:E(F(X))=Y,其中F(X),就是一个数他前面比这个数小 的数的个数,Y为奇数和偶数个有一种解法。那么上面的数组我们就 可以解出它的结果。
#defi ne RIGHT 3
#defi ne Bit ehar
typedef struet maps
{
Bit detail[9];
int myindex;//记录自己节点在hash表中的位置
Bit position;//记录 空格(0)在序列中的位置
}Map,*PMap;
Map org;//初始状态
过程BREADTH-SEARCH
(1)G:二GO(GO二s),OPEN:=(s),CLOSE:=();
(2)LOOP:IF OPEN=()THEN EXIT(FAIL);
(3)N:=FIRST(OPEN);
(4)IF GOAL (n) THEN EXIT(SUCCESS);
(5)RENMOVE( n,OPEN),ADD( n,CLOSED);
算法分析:
九宫问题的求解方法就是交换空格(0)位置,直至到达目标 位置为止。如图所示:
因此可知:九宫的所以排列有9!种,也就是3 6 2 8 8 0种排 法,数据量是非常大的,我使用广度搜索,需要记住每一个结点的排 列形式,要是用数组记录的话会占用很多的内存,我们把数据进行适 当的压缩。使用DWORD形式保存,压缩形式是每个数字用3位表 示,这样就是3X9=27个字节,由于8的二进制表示形式100 0,不能用3位表示,我使用了一个小技巧就是将8表示位0 0 0,然后用多出来的5个字表示8所在的位置, 就可以用DWORD表示 了。用移位和或操作将数据逐个移入,比乘法速度要快点。定义了几 个结果来存储遍历到了结果和搜索完成后保存最优路径。
数据结构:
本实验使用的数据结构是队列,应用队列先进先出的特点来实 现对节点的保存和扩展。首先建立一个队列,将初始结点入队,并设 置队列头和尾指,然后取出队列(头指针所指)的结点进行扩展,从 它扩展出子结点,并将这些结点按扩展的顺序加入队列, 然后判断扩 展出的新结点与队列中的结点是否重复, 如果重复则,否则记录其父 结点,并将它加入队列,更新队列尾指针,然后判断扩展出的结点是 否是目标结点,如果是则显示路径,程序结束。否则如果队列头的结 点可以扩展,直接返回第二步。否则将队列头指针指向下一结点,再 返回第二步,知道扩展出的结点是目标结点结束,并显示路径。
[]=[];
建立一个队列,将初始结点入队,并设置队列头和尾指
验步骤
(1)运行Microsoft Visual C++软件,新建工作空间,
得文档。
(2)输入源程序代码,进行编译,调试运行
(3)运行结果,按提示要求输入1—8这八个数,进行程序测验
2.实验源程序
#in elude<>
#in elude <>
验使用的是广度优先搜索)的搜索过程,争取做到直观、清晰地演示 算法。
八数码难题:在3X3方格棋盘上,分别放置了标有数字123,4,5,6,7,8的八张牌,初始状态SO,目标状态如图所示,可以
使用的操作有:空格上移,空格左移,空格右移,空格下移。试编一 程序实现这一搜索过程。
二、实验原理及基本技术路线图
();
for(int k =0 ; k < 4; k ++ )
{
Map tmp = no de;
=+derecti on[ k];
if < 0 || > 8 || (k > 1 &&/3 != /3 ))
con ti nue;
=HashValue( node , k );
if(0 != HashTable[] ) continue;
int Endlndex;//目标,上移,下移, 左移,右移
int const derectio n[4] ={ -3 , 3 ,-1, 1 };
//可移动的四个方向
int const Factorial[9] = {40320,5040,720 , 120,24 , 6 ,
2 , 1 , 1 };
int HashTable[HashTableSize]二{0};
//hash表,其中记录的是上一个父节点对应的位置
/****八数码的输入(在这里不做任何输入检查,均认为输入数据是
正确的)***/
void in put()
{
int i,j;
int sum , count ,in dex ;
\for(i = 0 ; i < 9 ; i ++ )
(6)EXPAND(n^{mi},G:=ADD(mi,G);
(7)结点放在OPENS的后面,使深度浅的结点可优先扩展。
广度优先搜索的源代码如下:
void Bfs()
{ queue<Map> Queue;
(org);
HashTable[ ] = -1;
while( NOT ())
{
Map node =();
人工智能实验报告
学
院:
信息科学与工程学院
班
级:
自动化0901班
学
号:
06
姓
名:
孙锦岗
指导老师:
刘丽珏
日
期:
2011年12月20日
一、实验名称、目的及内容
实验名称:
八数码难题的搜索求解演示
实验目的:
加深对图搜索策略概念的理解,掌握搜索算法。
实验内容要求:
以八数码难题为例演示广度优先或深度优先搜索、A算法(本实
{
sca nf("%1d", &[ i ]);
[i ] || = i);
}
for(i = 0 ; i < 9 ; i ++ )II计算逆序
{
if( 0 == [ i ])
con ti nue;
#in elude <>
#in elude <queue>
#in elude <stack>
using n ame源自文库paee std;
#defi ne HashTableSize 362881
#defi ne NOT !
#defi ne UP 0
#defi ne DOWN 1
#defi ne LEFT 2
实验原理:
八数码问题中,程序产生的随机排列转换成目标共有两种可能,而 且这两种不可能同时成立,也就是奇数排列和偶数排列。我们可以把 一个随机排列的数组从左到右从上到下用一个数组表示,例如{8,
7,1,5,2,6,3,4,0}其中0代表空格。它在奇序列位 置上。
在这个数组中我们首先计算它能够重排列出来的结果,公式就是:E(F(X))=Y,其中F(X),就是一个数他前面比这个数小 的数的个数,Y为奇数和偶数个有一种解法。那么上面的数组我们就 可以解出它的结果。
#defi ne RIGHT 3
#defi ne Bit ehar
typedef struet maps
{
Bit detail[9];
int myindex;//记录自己节点在hash表中的位置
Bit position;//记录 空格(0)在序列中的位置
}Map,*PMap;
Map org;//初始状态