人工智能实验报告八数码(共11页).doc
《人工智能实验报告八数码(共11页).doc》由会员分享,可在线阅读,更多相关《人工智能实验报告八数码(共11页).doc(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上人工智能实验一题目实验一 启发式搜索算法1. 实验内容:使用启发式搜索算法求解8数码问题。 编制程序实现求解8数码问题算法,采用估价函数,其中:是搜索树中结点的深度;为结点的数据库中错放的棋子个数;为结点的数据库中每个棋子与其目标位置之间的距离总和。 分析上述中两种估价函数求解8数码问题的效率差别,给出一个是的上界的的定义,并测试使用该估价函数是否使算法失去可采纳性。2. 实验目的熟练掌握启发式搜索算法及其可采纳性。3.数据结构与算法设计该搜索为一个搜索树。为了简化问题,搜索树节点设计如下:typedef struct Node/棋盘/节点结构体 int data9;
2、double f,g;struct Node * parent; /父节点Node,*Lnode;int data9; 数码数组:记录棋局数码摆放状态。struct Chess * Parent; 父节点:指向父亲节点。下一步可以通过启发搜索算法构造搜索树。1、局部搜索树样例:2、搜索过程 搜索采用广度搜索方式,利用待处理队列辅助,逐层搜索(跳过劣质节点)。搜索过程如下: (1)、把原棋盘压入队列; (2)、从棋盘取出一个节点; (3)、判断棋盘估价值,为零则表示搜索完成,退出搜索; (4)、扩展子节点,即从上下左右四个方向移动棋盘,生成相应子棋盘;(5)、对子节点作评估,是否为优越节点(子节
3、点估价值小于或等于父节点则为优越节点),是则把子棋盘压入队列,否则抛弃; (5)、跳到步骤(2);3、算法的评价完全能解决简单的八数码问题,但对于复杂的八数码问题还是无能为力。现存在的一些优缺点。1、可以改变数码规模(N),来扩展成N*N的棋盘,即扩展为N数码问题的求解过程。2、 内存泄漏。由于采用倒链表的搜索树结构,简化了数据结构,但有部分被抛弃节点的内存没有很好的处理,所以会造成内存泄漏;3、 采用了屏蔽方向,有效防止往回搜索(节点的回推),但没能有效防止循环搜索,所以不能应用于复杂度较大的八数码问题;源码:#include #include #include typedef struct
4、 Node/节点结构体 int data9;double f,g;struct Node * parent;Node,*Lnode;typedef struct Stack/OPEN CLOSED 表结构体Node * npoint;struct Stack * next;Stack,* Lstack;Node * Minf(Lstack * Open)/选取OPEN表上f值最小的节点,返回该节点地址Lstack temp = (*Open)-next,min = (*Open)-next,minp = (*Open);Node * minx; while(temp-next != NULL)
5、if(temp-next -npoint-f) npoint-f)min = temp-next;minp = temp;temp = temp-next;minx = min-npoint;temp = minp-next;minp-next = minp-next-next;free(temp);return minx;int Canslove(Node * suc, Node * goal)/判断是否可解int a = 0,b = 0,i,j;for(i = 1; i 9;i+)for(j = 0;j datai suc-dataj) & suc-dataj != 0)a+;if(goa
6、l-datai goal-dataj) & goal-dataj != 0)b+;if(a%2 = b%2)return 1;else return 0;int Equal(Node * suc,Node * goal)/判断节点是否相等,相等,不相等for(int i = 0; i datai != goal-datai)return 0; return 1;Node * Belong(Node * suc,Lstack * list)/判断节点是否属于OPEN表或CLOSED表,是则返回节点地址,否则返回空地址Lstack temp = (*list) - next ;if(temp =
7、NULL)return NULL;while(temp != NULL)if(Equal(suc,temp-npoint)return temp - npoint;temp = temp-next;return NULL;void Putinto(Node * suc,Lstack * list)/把节点放入OPEN 或CLOSED 表中 Stack * temp;temp =(Stack *) malloc(sizeof(Stack);temp-npoint = suc;temp-next = (*list)-next;(*list)-next = temp;/计算f值部分-开始/doubl
8、e Fvalue(Node suc, Node goal, int m)/计算f值switch(m)case 1:int error(Node,Node);int w=0;w=error(suc,goal);return w+suc.g; case 2:double Distance(Node,Node,int);double p = 0;for(int i = 1; i = 8; i+)p = p + Distance(suc, goal, i);return p + suc.g; /f = h + g; default:break; int error(Node suc,Node goal
9、)/计算错位个数int w,i;w=0;for(i=0;i9;i+)if(suc.datai!=goal.datai)w+;return w;double Distance(Node suc, Node goal, int i)/计算方格的错位距离int k,h1,h2;for(k = 0; k g) g)temp-parent = (*suc)-parent;temp-g = (*suc)-g;temp-f = (*suc)-f; flag = 1;elsePutinto(* suc, Open);(*suc)-f = Fvalue(*suc, goal, m);return flag; i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人工智能 实验 报告 数码 11
限制150内