人工智能算法实现

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

人工智能算法实现:[1]A*算法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 heuristic

Optimistic (must be less than or equal to the real cost)

As close to the real cost as possible

详细内容:

创建两个表,OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。

算起点的估价值;

将起点放入OPEN表;

2. 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 stack[STACKSIZE]; // 保存已经处理过的节点(搜索完后释放)

int stacktop;

char map[][6]={{'x','x','x','x','x','x'},

{'x','e',' ',' ',' ','x'},

{'x','x',' ','x',' ','x'},

{'x','x',' ',' ',' ','x'},

{'x','x','x','x','s','x'},

{'x','x','x','x','x','x'} };//地图数据

int dis_map[MAPMAXSIZE][MAPMAXSIZE];//保存搜索路径时,中间目标地最优解

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

for (j=0;j

dis_map[i][j]=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);//尝试向左移动

相关文档
最新文档