人工智能---实验题目.doc

上传人:s9****2 文档编号:562791764 上传时间:2023-11-04 格式:DOC 页数:21 大小:147.01KB
返回 下载 相关 举报
人工智能---实验题目.doc_第1页
第1页 / 共21页
人工智能---实验题目.doc_第2页
第2页 / 共21页
人工智能---实验题目.doc_第3页
第3页 / 共21页
人工智能---实验题目.doc_第4页
第4页 / 共21页
人工智能---实验题目.doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《人工智能---实验题目.doc》由会员分享,可在线阅读,更多相关《人工智能---实验题目.doc(21页珍藏版)》请在金锄头文库上搜索。

1、人工智能实验题目实验一 图的宽度优先搜索算法实验一、实验目的:熟悉和掌握盲目式搜索的定义和图的搜索算法过程,并利用图的宽度优先搜索算法求解N数码难题,理解求解流程和搜索顺序。二、实验原理:图的宽度优先搜索是一种盲目搜索算法,其特点在于每次把扩展节点过程中产生的新节点插入Open表中的尾部,扩展节点时总是选择Open表中的头节点作为扩展节点。三、实验条件:1 N数码难题演示程序。 (http:/ VC 6.0或Java。三、实验内容:1分别以8数码和15数码为例实际求解图的宽度优先搜索算法。2 画出图的宽度优先搜索算法求解框图。3 分析图的宽度优先搜索算法的特点。四、实验步骤:1 开始演示。进入

2、N数码难题演示程序,可选8数码或者15数码,点击“选择数码”按钮确定。第一次启动后,点击两次“缺省”或者“随机”按钮,才会出现图片。2 点击“缺省棋局”,会产生一个固定的初始节点。点击“随机生成”,会产生任意排列的初始节点。3 算法执行。点击“连续执行”则程序自动搜索求解,并演示每一步结果;点击“单步运行”则每次执行一步求解流程。“运行速度”可自由调节。4 观察运行过程和搜索顺序,理解启发式搜索的原理。在下拉框中选择演示“15数码难题”,点击“选择数码”确定选择;运行15数码难题演示实例。5 算法流程的任一时刻的相关状态,以算法流程高亮、open表、close表、节点静态图、当前扩展节点移动图

3、等5种形式在按钮上方同步显示,便于深入学习理解图的宽度优先搜索算法。6 根据程序运行过程画出图的宽度优先搜索算法框图。五、实验报告要求:1图的宽度优先搜索算法流程图和算法框图。2 根据图的宽度优先搜索算法分析盲目式搜索的特点。实验二 A*算法实验一、实验目的:熟悉和掌握启发式搜索的定义、估价函数和算法过程,并利用A*算法求解N数码难题,理解求解流程和搜索顺序。二、实验原理:A*算法是一种有序搜索算法,其特点在于对估价函数的定义上。对于一般的有序搜索,总是选择f值最小的节点作为扩展节点。因此,f是根据需要找到一条最小代价路径的观点来估算节点的,所以,可考虑每个节点n的估价函数值为两个分量:从起始

4、节点到节点n的代价以及从节点n到达目标节点的代价。三、实验条件:1 N数码难题演示程序。3 VC 6.0或Java。三、实验内容:1 分别以8数码和15数码为例实际求解A*算法。2 画出A*算法求解框图。3 分析估价函数对搜索算法的影响。4 分析A*算法的特点。四、实验步骤:1 开始演示。进入N数码难题演示程序,可选8数码或者15数码,点击“选择数码”按钮确定。第一次启动后,点击两次“缺省”或者“随机”按钮,才会出现图片。2 点击“缺省棋局”,会产生一个固定的初始节点。点击“随机生成”,会产生任意排列的初始节点。3 算法执行。点击“连续执行”则程序自动搜索求解,并演示每一步结果;点击“单步运行

5、”则每次执行一步求解流程。“运行速度”可自由调节。4 观察运行过程和搜索顺序,理解启发式搜索的原理。在下拉框中选择演示“15数码难题”,点击“选择数码”确定选择;运行15数码难题演示实例。5 算法流程的任一时刻的相关状态,以算法流程高亮、open表、close表、节点静态图、当前扩展节点移动图等5种形式在按钮上方同步显示,便于深入学习理解A*算法。6 根据程序运行过程画出A*算法框图。五、实验报告要求:1 A*算法流程图和算法框图。2 试分析估价函数的值对搜索算法速度的影响。3 根据A*算法分析启发式搜索的特点。16一、题目说明:(九宫问题)在一个的九宫中有这个数及一个空格随机的摆放在其中的格

6、子里,如图所示。现在要求实现这个问题:将该九宫格调整为如图右图所示的形式。调整的规则是:每次只能将与空格(上、下、或左、右)相邻的一个数字平移到空格中。试编程实现这一问题的求解。(图)二、题目分析:九宫问题是人工智能中的经典难题之一,问题是在方格棋盘中,放格数,剩下的没有放到的为空,每次移动只能是和相邻的空格交换数。程序自动产生问题的初始状态,通过一系列交换动作将其转换成目标排列(如下图到图的转换)。 (图)(图)九宫问题中,程序产生的随机排列转换成目标共有两种可能,而且这两种不可能同时成立,也就是奇数排列和偶数排列。我们可以把一个随机排列的数组从左到右从上到下用一个一维数组表示,如上图我们就

7、可以表示成,其中代表空格。在这个数组中我们首先计算它能够重排列出来的结果,公式就是:(),其中()就是一个数他前面比这个数小的数的个数,为奇数和偶数个有一种解法。那么上面的数组我们就可以解出它的结果。();();();();();();();();是偶数,所以他的重排列就是如图的结果,如果加起来的结果是奇数重排的结果就是如图最右边的排法。三、算法分析九宫问题的求解方法就是交换空格()位置,直至到达目标位置为止。图形表示就是:(图)要想得到最优的就需要使用广度优先搜索,九宫的所以排列有!种,也就是种排法,数据量是非常大的,我使用的广度搜索,需要记住每一个结点的排列形式,要是用数组记录的话会占用很

8、多的内存,我们把数据进行适当的压缩。使用形式保存,压缩形式是每个数字用位表示,这样就是个字节,由于的二进制表示形式,不能用位表示,我使用了一个小技巧就是将表示位,然后用多出来的个字表示所在的位置,就可以用表示了。用移位和或操作将数据逐个移入,比乘法速度要快点。定义了几个结果来存储遍历到了结果和搜索完成后保存最优路径。类结构如下:class CNineGirdpublic:struct PlaceList DWORD Place;PlaceList* Left;PlaceList* Right; ;struct ScanbufDWORD Place;int ScanID;struct PathL

9、istunsigned char Path9;private:PlaceList *m_pPlaceList;Scanbuf *m_pScanbuf;RECT m_rResetButton;RECT m_rAutoButton;public:int m_iPathsize;clock_t m_iTime;UINT m_iStepCount;unsigned char m_iTargetChess9;unsigned char m_iChess9;HWND m_hClientWin;PathList *m_pPathList;bool m_bAutoRun;private:inline bool

10、 AddTree(DWORD place , PlaceList*& parent);void FreeTree(PlaceList*& parent);inline void ArrayToDword(unsigned char *array , DWORD & data);inline void DwordToArray(DWORD data , unsigned char *array);inline bool MoveChess(unsigned char *array , int way);bool EstimateUncoil(unsigned char *array);void

11、GetPath(UINT depth);public:void MoveChess(int way);bool ComputeFeel();void ActiveShaw(HWND hView);void DrawGird(HDC hDC , RECT clientrect);void DrawChess(HDC hDC , RECT clientrect);void Reset();void OnButton(POINT pnt , HWND hView);public:CNineGird();CNineGird();计算随机随机数组使用了vector模板用random_shuffle(,)

12、函数来打乱数组数据,并计算目标结果是什么。代码:void CNineGird:Reset()if(m_bAutoRun) return;vector vs;int i;for (i = 1 ; i 9 ; i +)vs.push_back(i);vs.push_back(0);random_shuffle(vs.begin(), vs.end(); random_shuffle(vs.begin(), vs.end(); for ( i = 0 ; i 9 ; i +)m_iChessi = vsi;if (!EstimateUncoil(m_iChess)unsigned char arra

13、y9 = 1,2,3,8,0,4,7,6,5;memcpy(m_iTargetChess , array , 9);elseunsigned char array9 = 1,2,3,4,5,6,7,8,0;memcpy(m_iTargetChess , array , 9);m_iStepCount = 0;数据压缩函数实现:inline void CNineGird:ArrayToDword(unsigned char *array , DWORD& data)unsigned char night = 0;for ( int i = 0 ; i 9 ; i +)if (arrayi = 8)night = (unsigned char)i;break;arraynight = 0;data = 0;data = (DWORD)(DWORD)array0 29 | (DWORD)array1 26 | (DWORD)array2 23 | (DWORD)array3 20 | (DWORD)array

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号