人工智能算法实现.docx
人工智能算法实现:1A*算法c语言分步阅读A*算法,A* (A-Star)算法是一种静态路网中求解最短路最有效的方法。估价值 与实际值越接近,估价函数取得就越好。A*1(A-Star)算法是一种静态路网中求解最短路最有效的方法。公式表示为:f(n)=g(n)+h(n),其中f(n)是从初始点经由节点n到目标点的估价函数,g(n)是在状态空间中从初始节点到n节点的实际代价,h(n)是从n到目标节点最佳路径的估计代价。保证找到最短路径(最优解的)条件,关键在于估价函数h(n)的选取:估价值h(n)<= n到目标节点的距离实际值,这种情况下,搜索的点数多,搜索 范围大,效率低。但能得到最优解。如果估价值实际值,搜索的点数少,搜索范围小,效率高,但不能保证得到最 优解。工具/原料DEVC+或 VC 6.0方法/步骤1.估价值与实际值越接近,估价函数取得就越好例如对于几何路网来说,可以取两节点间欧几理德距离(直线距离)做为估价 值,即 f=g(n)+sqrt(dx-nx)*(dx-nx)+(dy-ny)*(dy-ny);这样估价函数 f 在 g值一定的情况下,会或多或少的受估价值h的制约,节点距目标点近,h值小,f值相对就小,能保证最短路的搜索向终点的方向进行。明显优于Dijkstra 算法的毫无方向的向四周搜索。conditions of heuristicOptimistic (must be less than or equal to the real cost)As close to the real cost as possible详细内容:创建两个表,OPEN表保存所有己生成而未考察的节点,CLOSED表中记录已访问过的节点。算起点的估价值;将起点放入OPEN表;Fi'ri'nnrninBnRDO冒zcl-lr-l-lrlnr-l-lrm 钢IrlooJLJoxoILlE 3DII .irrrr厂r忙rlm警.QQQQCX 警r-jnnnnolisbbbwcbolll'.As .als .M.lsni .日-十- J -T>-J - T-J - T-J - nDr-DCDCDD 匚口匚 口匚口匚匚?口?口 RAAAnnnnnnnnRscnfiDa 口.Brln型口曰口却苔留口cloDrr口卷片毫 RRRR-nn-nnnnnn-nM.PRRR g.pp.QPi.0*lclslel局ICIEI剑?zcowsq疤留¥».0pwrlQd3ol!.Ja藉 JlulrElulrlDlnln* 片片苗InEHlrirlmlclr-l2.A star算法在静态路网中的应用,以在地图中找从开始点s到e点的最短行走路径为例:首先定义数据结构#define MAPMAXSIZE 100 地图面积最大为 100x100#define MAXINT 8192 /定义一个最大整数,地图上任意两点距离不会超过 它#define STACKSIZE 65536 /保存搜索节点的堆栈大小#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)/树结构,比较特殊,是从叶节点向根节点反向链接typedef struct node *TREE;struct node int h;int tile;TREE father;typedef struct node2 *LINK;struct node2 TREE node;int f;LINK next;LINK queue; /保存没有处理的行走方法的节点TREE stackSTACKSIZE; /保存已经处理过的节点(搜索完后释放)int stacktop;char map6='x','x','x','x','x','x','x','e',' ','',' ','x',乂乂 ','x',' ','x',乂乂 ','',' ','x','x','x','x','x','s','x','x','x','x','x','x','x' ;地图数据int dis_mapMAPMAXSIZEMAPMAXSIZE;/ 保存搜索路径时,中间目标地最优解int map_w,map_h;/ 地图宽和高int start_x,start_y,end_x,end_y; 地点,终点坐标/路径寻找主函数void findpath(int *path)/printf("%d,%d,%d,%d",start_x,start_y,end_x,end_y);TREE root;int i,j;stacktop=0;for (i=0;i<map_h;i+)for (j=0;j<map_w;j+)dis_mapij = MAXINT;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) *path=-1;return;x=tile_x(root->tile);y=tile_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);/ 尝试向右移动if (child!=0)pop_stack();/如果四个方向均不能移动,释放这个死节点/回溯树,将求出的最佳路径保存在path中for (i=0;root;i+) pathi = root->tile;root=root->father;/printf("pathis %d",pathi);pathi = -1;freetree();/估价函数,估价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 (mapyx ='x') return 1; / 如果(x,y)处是障碍,失败while (p) if (x=tile_x(p->tile) && y=tile_y(p->tile) return 1; / 如果(x,y)曾经经过,失败p=p->father;h=father->h + 1;if (h>=dis_mapyx) return 1;/如果曾经有更好的方案移动到(x,y)失败dis_mapyx = 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;YTi-ifi d t15以m吟it di -vaa .I? Itf f- h H*iPi.-c ; i=W Id LB.t TJE'X i* "心, hf w 寸件- =s wees i" . j - ygaLQsy ie&3 -.皂口刖 p ri nL paUi :心加¥:irEJXM5 ItiLLI :B IJLnTUEt I : GLE:X |1 ; 1*11 3par ! r-4!=iB点任意键进行运行找静态路网4.3. *是如始点int mj n()g-ezch-axO j ysEfeHi ("pause " retnrn 0;LXMKW LTHint irjja-ysEejn ("c=l±w| ;for (i«0; i<jna.r_h.; i*1 '芥Y(li1+1Jf* (5*CjWIf (IMP ill 31 3print-f Hr-*;Ttt中耳¥ #徉$否琮 «-*!/ fstlHt f ("a" stitle pTipkt± ("m _. _. _. lat p4ThMAXI NET * re*c£nijau (J i shcwTO-p Q ? 51Mp(2Q&0 | * ridpant pastil;印函数打印出来代码如下5. 说明:找到路后会存到一个数组中去,我们为了显示这个过程可以运用打void printpath(int *path)int i;/printf("-44444444444444");for (i=0;pathi>=0;i+) gotoxy(tile_x(pathi) + 1,tile_y(pathi) + 1);printf("-");Sleep(2000); printf("n");printf("n");printf("走迷宫完成”);6.整个程序的代码如下:#include<windows.h> #include"stdio.h” #include<conio.h> #include"assert.h” #include"stdlib.h” #define MAPMAXSIZE 100 地图面积最大为 100x100 #define MAXINT 8192 /定义一个最大整数,地图上任意两点距离不会超过#define STACKSIZE 65536 /保存搜索节点的堆栈大小 #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) /树结构,比较特殊,是从叶节点向根节点反向链接 typedef struct node *TREE;struct/*/node int h;int tile;TREE father;typedefstruct/*/node2*LINK;struct node2 TREE node;intf;/*/LINK next;LINK queue; /保存没有处理的行走方法的节点TREE stackSTACKSIZE; /保存已经处理过的节点(搜索完后释放)int stacktop;char map6='x','x','x','x','x','x','x','e',' ','',' ','x',乂乂 ','x',' ','x',乂乂 ','',' ','x','x','x','x','x','s','x','x','x','x','x','x','x' ;地图数据intdis_map/*designdeby*/MapmaXSIZEMAPMAXSIZE;/ 保存搜索路径时,中间目标地最优解int map_w,map_h;/ 地图宽和高int start_x,start_y,end_x,end_y; 地点,终点坐标void gotoxy(int x ,int y)HANDLE a;COORD zb;zb.X =x-1;zb.Y =y-1;a= GetStdHandle(STD_OUTPUT_HANDLE/*designde by*枫SetConsoleCursorPosition(a,zb);/初始化队列void init_queue()queue=(LINK)malloc(sizeof(*queue);queue->node=NULL;queue->f=-1;queue->next=(LINK)/*designdeby*/malloc(sizeof(*queue);queue->next->f=MAXINT;queue->next->node=NULL;queue->next->next=NULL; /待处理节点入队列,依靠对目的地估价距离插入排序void enter_queue(TREE node,int f)LINK p=queue,father,q;while(f>p->f) father=p;p=p->next/*/;assert(p);q = (LINK)malloc(sizeof(*q);assert(queue);q->f=f,q->node=node,q->next=p;father->next=q;/将离目的地估计最近的方案出队列TREE get_from_queue()TREE bestchoice=queue->next->node;LINK next=queue->next->next;/*/free(queue->next);queue->next=next;stackstacktop+ = bestchoice;assert(stacktop<STACKSIZE);*/释放栈顶节点void pop_stack()free(stack-stacktop);/释放申请过的所有节点void freetree()int i;LINK p;for (i=0;i<stacktop;i+)free(stack);while/*/(queue)p=queue;free(p->node);queue=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/*designde by */ x,int y,TREE father)TREE p=father;int h;if (mapyx ='x') return 1; / 如果(x,y)处是障碍,失败while (p) /*designde by */if (x=tile_x(p->tile) &&y=tile_y(p->tile) return 1; /如果(x,y)曾经经过,失败p=p->father;h=father->h + 1;if (h>=dis_mapyx) return 1;/如果曾经有更好的方案移动到(x,y)失败dis_mapyx = h;/记录这次到(x,y)的距离为历史最佳距离