我曾看过一些有关A*算法的程序,不过写得比较简洁、易懂的还是风云写的A*算法教学实例,但是这个算法并没有进行优化,该程序要用到实际应用中,还会有一定的限制, 所以我对该算法进行了改进,并加上更详细的算法说明,使其具有更好的教学作用和实用价值。开始前我先给出A*算法的基本思路:
问题:求出2D的迷宫中起始点S到目标点E的最短路径?
算法:
findpath()
{
把S点加入树根(各点所在的树的高度表示从S点到该点所走过的步数);
把S点加入排序队列(按该点到E点的距离排序+走过的步数从小到大排序);
1、排序队列sort_queue中距离最小的第一个点出列,并保存入store_queue中
2、从出列的点出发,分别向4个(或8个)方向中的一个各走出一步
3、并估算第2步所走到位置到目标点的距离,并把该位置加入树,最后把该点按距离从小到大排序后并放入队列
中(由trytile函数实现)
4、如果该点从四个方向上都不能移动,则把该点从store_queue中删除
5、回到第一点,直到找到E点则结束
从目标点回溯树,直到树根则可以找到最佳路径,并保存在path[]中
}
文末附带的程序参考了风云的最短路径代码,并加以改进和优化:
把原来用于存放已处理节点的堆栈改为队列(store_queue),这样在从sort_queue队列出列时可直接放入
store_queue中。
解除了地图大小的限制(如果有64K内存限制时,地图大小只能是180x180)。
删除了原程序中的一些冗余,见程序中的注释。
程序继续使用dis_map数组保存各点历史历史最佳距离,也包含了某点是否已经经过的信息,虽然这样做可能会比使用链表多用一些内存,但是在搜索时可以节省不时间。
程序更具有实用性,可直接或修改后运用于你的程序中,但请你使用该代码后 应该返回一些信息给我,如算法的改进或使用于什么程序等。 本程序可以用Borland C++或DJGPP编译,并附带有一个数据文件,保存有地图的数据。最后值得一提的是,该地图文件格式与风云的源代码的地图格式不一样。
◆◆
评论读取中....
请登录后再发表评论!
◆◆
修改失败,请稍后尝试