八数码问题求解--实验报告解析

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

八数码问题求解--实验报告解析

实验报告

一、实验问题

八数码问题求解

二、实验软件

VC6.0 编程语言或其它编程语言

三、实验目的

1. 熟悉人工智能系统中的问题求解过程;

2. 熟悉状态空间的盲目搜索和启发式搜索算法的应用;

3. 熟悉对八数码问题的建模、求解及编程语言的应用。

四、实验数据及步骤

(一、) 实验内容

八数码问题:在3×3的方格棋盘上,摆放着1到8这八个数码,有1个方格是空的,其初始状态如图1所示,要求对空格执行空格左移、空格右移、空格上移和空格下移这四个操作使得棋盘从初始状态到目标状态。

2 8

3 1 2 3

1 4 8 4

7 6 5 7 6 5

(a) 初始状态 (b) 目标状态

图 1 八数码问题示意图

(二、)基本数据结构分析和实现

1.结点状态

我采用了struct Node数据类型

typedef struct _Node{

int digit[ROW][COL];

int dist; // distance between one state and the destination一个表和目的表的距离

int dep; // the depth of node深度

// So the comment function = dist + dep.估价函数值

int index; // point to the location of parent父节点的位置

} Node; 2.发生器函数

定义的发生器函数由以下的四种操作组成:

(1)将当前状态的空格上移

Node node_up;

Assign(node_up, index);//向上扩展的节点

int dist_up = MAXDISTANCE;

(2)将当前状态的空格下移

Node node_down;

Assign(node_down, index);//向下扩展的节点

int dist_down = MAXDISTANCE;

(3)将当前状态的空格左移

Node node_left;

Assign(node_left, index);//向左扩展的节点

int dist_left = MAXDISTANCE;

(4)将当前状态的空格右移

Node node_right;

Assign(node_right, index);//向右扩展的节点

int dist_right = MAXDISTANCE;

通过定义结点状态和发生器函数,就解决了8数码问题的隐式图的生成问题。接下来就是搜索了。

3.图的搜索策略

经过分析,8数码问题中可采用的搜速策略共有:1.广度优先搜索、2.深度优先搜索、2.有界深度优先搜索、4.最好优先搜索、5.局部择优搜索,一共五种。其中,广度优先搜索法是可采纳的,有界深度优先搜索法是不完备的,最好优先和局部择优搜索法是启发式搜索法。

实验时,采用了广度(宽度)优先搜索来实现。

(三、)广度(宽度)优先搜索原理

1. 状态空间盲目搜索——宽度优先搜索

其基本思想是,从初始节点开始,向下逐层对节点进形依次扩展,并考察它是否为目标节点,再对下层节点进行扩展(或搜索)之前,必须完成对当层的所有节点的扩展。再搜索过程中,未扩展节点表OPEN中的节点排序准则是:先进入的节点排在前面,后进入的节点排在后面。其搜索过程如图(1)所示。

S

A B

C D F E

G H I

J

图2、宽度优先搜索示意图

2. 宽度优先算法如下:

步1 把初始结点S0放入OPEN表中

步2 若OPEN表为空,则搜索失败,问题无解

步3 取OPEN表中最前面的结点N放在CLOSE表中,并冠以顺序编

号n

步4 若目标结点Sg=N,则搜索成功,问题有解

步5 若N无子结点,则转步2

步6 扩展结点N,将其所有子结点配上指向N的放回指针,依次放

入OPEN表的尾部,转步2

3.宽度优先算法流程图

起始

把S放入OPEN表

Fangru

否是 OPEN是否失败为空表?

把第一个节点n,从OPEN表移

出,并把它放入CLOSED表

扩展n,把它的后继节点放入OPEN

表的末端,提供回到n的指针

否是是否有任何后继成功节点为目标节点?

图3、宽度优先算法流程图

(8数码难题用宽度优先搜索所生成的搜索树如图4。搜索树上的所有 4

节点都标记它们所对应的状态描述,每个节点旁边的数字表示节点扩展的顺序(按顺时针方向移动空格)。图中有26个节点,也就是源程序运行结果。

2 8 3

1 So 1 0 4

7 6 5

2 8

3 2 0 3 2 8 3 2 8 3

2 3 4 5 0 1 4 1 8 4 1 4 0 1 6 4

7 6 5 7 6 5 7 6 5 7 0 5

6 7 8 9 10 11 12 13

0 8 3 2 8 3 0 2 3 2 3 0 2 8 0 2 8 3 2 8 3 2 8 3

2 1 4 7 1 4 1 8 4 1 8 4 1 4

3 1

4

5 1

6 4 1 6 4

7 6 5 0 6 5 7 6 5 7 6 5 7 6 5 7 6 0 0 6 5 7 5 0

14 15 16 17 18 19 20 21

2 0

3 2 8 3 1 2 3 2 3

4 2 0 8 2 8 3 2 8 3 2 8 3

2 1 4 7 1 4 0 8 4 1 8 0 1 4

3 1

4

5 0

6 4 1 6 0

7 6 5 6 0 5 7 6 5 7 6 5 7 5 6 7 0 6 1 7 5 7 5 4

22 23 24 25 26

8 3 0 8 8 3 2 8 3 2 8 3 1 2 3

2 1 4 2 0 4 7 0 4 7 1 4 8 0 4

7 6 5 7 6 5 6 1 5 6 5 0 7 6 5

图4.八数码题宽度优先搜索树

五、实验结果及分析

上机试验时,,经多次程序调试,最后得一下结果。此结果所得节点(状态图)很多,可知宽度优先搜索的盲目性很大,当目标节点距离初始节点较远时,就会产生大量的无用节点,搜索效率低。但是,只要问题有解,用宽度优先搜索总可以找到它的解。

相关文档
最新文档