ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:118.09KB ,
资源ID:8158391      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8158391.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(八数码问题求解 实验报告讲解.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

八数码问题求解 实验报告讲解.docx

1、八数码问题求解 实验报告讲解 实 验 报 告 一、实验问题 八数码问题求解 二、实验软件 VC6.0 编程语言或其它编程语言 三、实验目的 1. 熟悉人工智能系统中的问题求解过程; 2. 熟悉状态空间的盲目搜索和启发式搜索算法的应用; 3. 熟悉对八数码问题的建模、求解及编程语言的应用。 四、实验数据及步骤 (一、) 实验内容 八数码问题:在33的方格棋盘上,摆放着1到8这八个数码,有1个方格是空的,其初始状态如图1所示,要求对空格执行空格左移、空格右移、空格上移和空格下移这四个操作使得棋盘从初始状态到目标状态。 2 8 3 1 2 3 1 4 8 4 7 6 5 7 6 5 (a) 初始状态

2、 (b) 目标状态 图 1 八数码问题示意图 (二、)基本数据结构分析和实现 1.结点状态 我采用了struct Node数据类型 typedef struct _Node int digitROWCOL; 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父节点的位置

3、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 = MAXDIS

4、TANCE; (4)将当前状态的空格右移 Node node_right; Assign(node_right, index);/向右扩展的节点 int dist_right = MAXDISTANCE; 通过定义结点状态和发生器函数,就解决了8数码问题的隐式图的生成问题。接下来就是搜索了。 3.图的搜索策略 经过分析,8数码问题中可采用的搜速策略共有:1.广度优先搜索、2.深度优先搜索、2.有界深度优先搜索、4.最好优先搜索、5.局部择优搜索,一共五种。其中,广度优先搜索法是可采纳的,有界深度优先搜索法是不完备的,最好优先和局部择优搜索法是启发式搜索法。 实验时,采用了广度(宽度)优先搜索来

5、实现。 (三、)广度(宽度)优先搜索原理 1. 状态空间盲目搜索宽度优先搜索 其基本思想是,从初始节点开始,向下逐层对节点进形依次扩展,并考察它是否为目标节点,再对下层节点进行扩展(或搜索)之前,必须完成对当层的所有节点的扩展。再搜索过程中,未扩展节点表OPEN中的节点排序准则是: )所示。1先进入的节点排在前面,后进入的节点排在后面。其搜索过程如图( S AB CFD E GIH J 2、宽度优先搜索示意图 图 2. 宽度优先算法如下: 表中S0放入OPEN 步1 把初始结点 表为空,则搜索失败,问题无解若OPEN 步2 表中,并冠以顺序编CLOSEN放在3 取OPEN表中最前面的结点步 n

6、 号 Sg=N,则搜索成功,问题有解 步4 若目标结点2 N无子结点,则转步步5 若 的放回指针,依次放N扩展结点N,将其所有子结点配上指向 步6 2 表的尾部,转步入OPEN 3.宽度优先算法流程图 起始 把S放入OPEN表 否 是 是否OPEN 失败 ? 为空表 表OPE把第一个节n从并把它放CLOSE出 OPEN把它的后继节点放扩n,的指提供回表的末端 否成?节点为目标节点 、宽度优先算法流程图图3 搜索树上的所有。数码难题用宽度优先搜索所生成的搜索树如图4 48 节点都标记它们所对应的状态描述,每个节点旁边的数字表示节点扩展的顺序 个节点,也就是源程序运行结果。图中有26(按顺时针方向

7、移动空格) 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 1 6 4 1 8 4 1 4 0 0 1 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

8、 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 5 4 1 7 5 7 0 6 7 5 6 7 6 5 7 6 5 6 0 5 7 6 5 23242522 26 8 3 08 8 32 8 32 8 31 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.八数码题宽度优先搜索树 五、实验结果及分析 上机试验时,,经多次程序调试,最后得一下结果。此结果所得节点(状态图)很

9、多 ,可知宽度优先搜索的盲目性很大,当目标节点距离初始节点较远时,就会产生大量的无用节点,搜索效率低。但是,只要问题有解,用宽度优先搜索总可以找到它的解。 图5.程序运行结果 六、结论 人工智能搜索可分为盲目搜索和启发式搜索。盲目搜索算法有宽度优先算法、深度优先算法(有界深度优先算法),启发式搜索算法有A算法、A*算法。本实验采用的是宽度优先(广度优先)算法,这种算法是按预定的控制策略进行,在搜素的过程中所获得的信息不用来改进控制策略。由于搜索总是按预定的路线进行,没有考虑问题本身的特性,这种缺乏问题求解的针对性,需要进行全方位的搜索,而没有选择最优的搜索路径。所以图4宽度优先搜索树及程序运行

10、结果图5得到的节点(状态图)很多,而解路径为1-3-8-16-26,其它节点是没有用的节点,搜索效率很低。通过这次实验更加熟悉状态空间的宽度优先搜索、深度优先搜索和启发式搜索算法及计算机语言对常用数据结构如链表、队列等的描述应用。学到了不少知识。 七、源程序及注释 #include #include #include using namespace std; const int ROW = 3;/行数 const int COL = 3;/列数 const int MAXDISTANCE = 10000;/最多可以有的表的数目 const int MAXNUM = 10000; typedef

11、 struct _Node int digitROWCOL; 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; Node src, dest;/ 父节表 目的表 vector node_v; / store the nodes存储节点 bool

12、isEmptyOfOPEN() /open表是否为空 for (int i = 0; i node_v.size(); i+) if (node_vi.dist != MAXNUM) return false; return true; bool isEqual(int index, int digitCOL) /判断这个最优的节点是否和目的节点一样 for (int i = 0; i ROW; i+) for (int j = 0; j COL; j+) if (node_vindex.digitij != digitij) return false; return true; ostrea

13、m& operator(ostream& os, Node& node) for (int i = 0; i ROW; i+) for (int j = 0; j COL; j+) os node.digitij ; os endl; return os; void PrintSteps(int index, vector& rstep_v)/输出每一个遍历的节点 深度遍历 rstep_v.push_back(node_vindex); index = node_vindex.index; while (index != 0) rstep_v.push_back(node_vindex); i

14、ndex = node_vindex.index; for (int i = rstep_v.size() - 1; i = 0; i-)/输出每一步的探索过程 cout Step rstep_v.size() - i endl rstep_vi endl; void Swap(int& a, int& b) int t; t = a; a = b; b = t; void Assign(Node& node, int index) for (int i = 0; i ROW; i+) for (int j = 0; j COL; j+) node.digitij = node_vindex.

15、digitij; int GetMinNode() /找到最小的节点的位置 即最优节点 int dist = MAXNUM; int loc; / the location of minimize node for (int i = 0; i node_v.size(); i+) if (node_vi.dist = MAXNUM) continue; else if (node_vi.dist + node_vi.dep) dist) loc = i; dist = node_vi.dist + node_vi.dep; return loc; bool isExpandable(Node&

16、 node) for (int i = 0; i node_v.size(); i+) if (isEqual(i, node.digit) return false; return true; int Distance(Node& node, int digitCOL) int distance = 0; bool flag = false; for(int i = 0; i ROW; i+) for (int j = 0; j COL; j+) for (int k = 0; k ROW; k+) for (int l = 0; l COL; l+) if (node.digitij =

17、digitkl) distance += abs(i - k) + abs(j - l); flag = true; break; else flag = false; if (flag) break; return distance; int MinDistance(int a, int b) return (a b ? a : b); void ProcessNode(int index) int x, y; bool flag; for (int i = 0; i ROW; i+) for (int j = 0; j 0) Swap(node_up.digitxy, node_up.di

18、gitx - 1y); if (isExpandable(node_up) dist_up = Distance(node_up, dest.digit); node_up.index = index; node_up.dist = dist_up; node_up.dep = node_vindex.dep + 1; node_v.push_back(node_up); Node node_down; Assign(node_down, index);/向下扩展的节点 int dist_down = MAXDISTANCE; if (x 0) Swap(node_left.digitxy,

19、node_left.digitxy - 1); if (isExpandable(node_left) dist_left = Distance(node_left, dest.digit); node_left.index = index; node_left.dist = dist_left; node_left.dep = node_vindex.dep + 1; node_v.push_back(node_left); Node node_right; Assign(node_right, index);/向右扩展的节点 int dist_right = MAXDISTANCE; if

20、 (y 2) Swap(node_right.digitxy, node_right.digitxy + 1); if (isExpandable(node_right) dist_right = Distance(node_right, dest.digit); node_right.index = index; node_right.dist = dist_right; node_right.dep = node_vindex.dep + 1; node_v.push_back(node_right); node_vindex.dist = MAXNUM; int main() / 主函数

21、 int number; cout Input source: endl; for (int i = 0; i ROW; i+)/输入初始的表 for (int j = 0; j number; src.digitij = number; src.index = 0; src.dep = 1; cout Input destination: endl;/输入目的表 for (int m = 0; m ROW; m+) for (int n = 0; n number; dest.digitmn = number; node_v.push_back(src);/在容器的尾部加一个数据 cout

22、Search. endl; clock_t start = clock(); while (1) if (isEmptyOfOPEN() cout Cannt solve this statement! endl; return -1; else int loc; / the location of the minimize node最优节点的位置 loc = GetMinNode(); if(isEqual(loc, dest.digit) vector rstep_v; cout Source: endl; cout src endl; PrintSteps(loc, rstep_v); cout Successful! endl; cout Using (clock() - start) / CLOCKS_PER_SEC seconds. endl; break; else ProcessNode(loc); return 0; :)对行和列数进行修改(十五数码问题的截图

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1