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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(A算法人工智能课程设计.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

A算法人工智能课程设计.docx

1、A算法人工智能课程设计人工智能(A*算法)05级计算机二班 姓名: 学号:20054044054一、 A*算法概述A*算法是到目前为止最快的一种计算最短路径的算法,但它一种较优算法,即它一般只能找到较优解,而非最优解,但由于其高效性,使其在实时系统、人工智能等方面应用极其广泛。 A*算法结合了启发式方法(这种方法通过充分利用图给出的信息来动态地作出决定而使搜索次数大大降低)和形式化方法(这种方法不利用图给出的信息,而仅通过数学的形式分析,如Dijkstra算法)。它通过一个估价函数(Heuristic Function)f(h)来估计图中的当前点p到终点的距离(带权值),并由此决定它的搜索方向

2、,当这条路径失败时,它会尝试其它路径。 因而我们可以发现,A*算法成功与否的关键在于估价函数的正确选择,从理论上说,一个完全正确的估价函数是可以非常迅速地得到问题的正确解答,但一般完全正确的估价函数是得不到的,因而A*算法不能保证它每次都得到正确解答。一个不理想的估价函数可能会使它工作得很慢,甚至会给出错误的解答。 为了提高解答的正确性,我们可以适当地降低估价函数的值,从而使之进行更多的搜索,但这是以降低它的速度为代价的,因而我们可以根据实际对解答的速度和正确性的要求而设计出不同的方案,使之更具弹性。二、 A*算法分析 众所周知,对图的表示可以采用数组或链表,而且这些表示法也各也优缺点,数组可

3、以方便地实现对其中某个元素的存取,但插入和删除操作却很困难,而链表则利于插入和删除,但对某个特定元素的定位却需借助于搜索。而A*算法则需要快速插入和删除所求得的最优值以及可以对当前结点以下结点的操作,因而数组或链表都显得太通用了,用来实现A*算法会使速度有所降低。要实现这些,可以通过二分树、跳转表等数据结构来实现,我采用的是简单而高效的带优先权的堆栈,经实验表明,一个1000个结点的图,插入而且移动一个排序的链表平均需500次比较和2次移动;未排序的链表平均需1000次比较和2次移动;而堆仅需10次比较和10次移动。需要指出的是,当结点数n大于10,000时,堆将不再是正确的选择,但这足已满足

4、我们一般的要求。求出2D的迷宫中起始点S到目标点E的最短路径?算法:findpath()把S点加入树根(各点所在的树的高度表示从S点到该点所走过的步数);把S点加入排序队列(按该点到E点的距离排序+走过的步数从小到大排序);1、排序队列sort_queue中距离最小的第一个点出列,并保存入store_queue中2、从出列的点出发,分别向4个(或8个)方向中的一个各走出一步3、并估算第2步所走到位置到目标点的距离,并把该位置加入树,最后把该点按距离从小到大排序后并放入队列中(由trytile函数实现)4、如果该点从四个方向上都不能移动,则把该点从store_queue中删除5、回到第一点,直到

5、找到E点则结束从目标点回溯树,直到树根则可以找到最佳路径,并保存在path中文末附带的程序参考了风云的最短路径代码,并加以改进和优化:把原来用于存放已处理节点的堆栈改为队列(store_queue),这样在从sort_queue队列出列时可直接放入store_queue中。 解除了地图大小的限制(如果有64K内存限制时,地图大小只能是180x180)。 删除了原程序中的一些冗余,见程序中的注释。 程序继续使用dis_map数组保存各点历史历史最佳距离,也包含了某点是否已经经过的信息,虽然这样做可能会比使用链表多用一些内存,但是在搜索时可以节省不时间。 程 序更具有实用性,可直接或修改后运用于你

6、的程序中,但请你使用该代码后 应该返回一些信息给我,如算法的改进或使用于什么程序等。 三、A*算法程序本程序可以用Borland C+或DJGPP编译#include #include #include #include #define tile_num(x,y) (y)*map_w+(x) /将 x,y 坐标转换为地图上块的编号#define tile_x(n) (n)%map_w) /由块编号得出 x,y 坐标#define tile_y(n) (n)/map_w)#define MAPMAXSIZE 180 /地图面积最大为 180x180,如果没有64K内存限制可以更大#define

7、MAXINT 32767/树结构, 比较特殊, 是从叶节点向根节点反向链接,方便从叶节点找到根节点typedef struct tree_node *TREE;struct tree_node int h; /节点所在的高度,表示从起始点到该节点所有的步数int tile; /该节点的位置TREE father; /该节点的上一步;/链接结构,用于保存处理过的和没有处理过的结点typedef struct link_node *LINK;struct link_node TREE node;int f;LINK next;LINK sort_queue; / 保存没有处理的行走方法的节点LIN

8、K store_queue; / 保存已经处理过的节点 (搜索完后释放)unsigned char * map; /地图数据unsigned int * dis_map; /保存搜索路径时,中间目标地最优解int map_w,map_h; /地图宽和高int start_x,start_y,end_x,end_y; /地点,终点坐标/ 初始化队列void init_queue()sort_queue=(LINK)malloc(sizeof(*sort_queue);sort_queue-node=NULL;sort_queue-f=-1;sort_queue-next=(LINK)malloc

9、(sizeof(*sort_queue);sort_queue-next-node=NULL;sort_queue-next-f=MAXINT;sort_queue-next-next=NULL;store_queue=(LINK)malloc(sizeof(*store_queue);store_queue-node=NULL;store_queue-f=-1;store_queue-next=NULL;/ 待处理节点入队列, 依靠对目的地估价距离插入排序void enter_queue(TREE node,int f)LINK p=sort_queue,father,q;while(fp-

10、f) father=p;p=p-next;assert(p);q=(LINK)malloc(sizeof(*q);assert(sort_queue);q-f=f,q-node=node,q-next=p;father-next=q;/ 将离目的地估计最近的方案出队列TREE get_from_queue()LINK bestchoice=sort_queue-next;LINK next=sort_queue-next-next;sort_queue-next=next;bestchoice-next=store_queue-next;store_queue-next=bestchoice;

11、return bestchoice-node;/ 释放栈顶节点void pop_stack()LINK s=store_queue-next;assert(s);store_queue-next=store_queue-next-next;free(s-node);free(s);/ 释放申请过的所有节点void freetree()int i;LINK p;while(store_queue)p=store_queue;free(p-node);store_queue=store_queue-next;free(p);while (sort_queue) p=sort_queue;free(

12、p-node);sort_queue=sort_queue-next;free(p);/ 估价函数,估价 x,y 到目的地的距离,估计值必须保证比实际值小int judge(int x,int y)int distance;distance=abs(end_x-x)+abs(end_y-y);return distance;/ 尝试下一步移动到 x,y 可行否int trytile(int x,int y,TREE father)TREE p=father;int h;if (maptile_num(x,y)!= ) return 1; / 如果 (x,y) 处是障碍,失败h=father-h

13、+1;if (h=dis_maptile_num(x,y) return 1; / 如果曾经有更好的方案移动到 (x,y) 失败dis_maptile_num(x,y)=h; / 记录这次到 (x,y) 的距离为历史最佳距离/ 将这步方案记入待处理队列p=(TREE)malloc(sizeof(*p);p-father=father;p-h=father-h+1;p-tile=tile_num(x,y);enter_queue(p,p-h+judge(x,y);return 0;/ 路径寻找主函数int * findpath(void)TREE root;int i,j;int * path;

14、memset(dis_map,0xff,map_h*map_w*sizeof(*dis_map); init_queue();root=(TREE)malloc(sizeof(*root);root-tile=tile_num(start_x,start_y);root-h=0;root-father=NULL;enter_queue(root,judge(start_x,start_y);for (;) int x,y,child;TREE p;root=get_from_queue();if (root=NULL) return NULL;x=tile_x(root-tile);y=til

15、e_y(root-tile);if (x=end_x & y=end_y) break; / 达到目的地成功返回child=trytile(x,y-1,root); /尝试向上移动child&=trytile(x,y+1,root); /尝试向下移动child&=trytile(x-1,y,root); /尝试向左移动child&=trytile(x+1,y,root); /尝试向右移动 if (child!=0)pop_stack(); / 如果四个方向均不能移动,释放这个死节点 path=(int*)malloc(root-h+2)*sizeof(int);assert(path);for

16、 (i=0;root;i+) pathi=root-tile;root=root-father;pathi=-1;freetree();return path;void printpath(int *path)int i;if(path=NULL) return ;for (i=0;pathi=0;i+) gotoxy(tile_x(pathi)+1,tile_y(pathi)+1);cprintf(.);int readmap()FILE *f;int i,j;f=fopen(map.dat,r);assert(f);fscanf(f,%d,%dn,&map_w,&map_h);map=ma

17、lloc(map_w*map_h+1);assert(map);for(i=0;i fgets(map+tile_num(0,i),map_w+2,f);fclose(f);start_x=-1,end_x=-1;for (i=0;i for (j=0;j if (maptile_num(j,i)=s) maptile_num(j,i)= ,start_x=j,start_y=i;if (maptile_num(j,i)=e) maptile_num(j,i)= ,end_x=j,end_y=i;assert(start_x=0 & end_x=0);dis_map=malloc(map_w*

18、map_h*sizeof(*dis_map);assert(dis_map);return 0;void showmap()int i,j;clrscr();for (i=0;i gotoxy(1,i+1);for (j=0;j if (maptile_num(j,i)!= ) cprintf(O);else cprintf( );gotoxy(start_x+1,start_y+1);cprintf(s);gotoxy(end_x+1,end_y+1);cprintf(e);int main()int * path;readmap();showmap();getch();path=findpath();printpath(path);if(dis_map) free(dis_map);if(path) free(path);if(map) free(map);getch();return 0;四、运行结果五、心得 本次大作业自己努力做了前面的分析,虽然程序简单,在一开始运行的时候找不到主函数,经过认真的改正,终于发现了问题,自己的编程技巧不是很好,借鉴了资料和同学们的意见终于可以能够运行,并的出结果,在次人工智能大作业中学到了很多的专业知识,也知道人工只能也是一门很重要的课程。

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2