人工智能算法实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);//尝试向左移动