很多年以前(其实也就3年前),听到A*寻路,我一脸懵逼,不知道是个什么玩意。直到公司有个项目需要用到A*寻路,我才开始了解它。其实网上有很多关于A*寻路的文章,有一些写的特别好,有兴趣的同学可以搜一下。弄懂了原理后,给项目写了一个最简单的A*寻路,这事也就过去了。不知道最近怎么了,想写一些文章了,所以在这里班门弄斧,有什么不足,希望大家指正。这是我的第一遍文章,请轻喷!
A*寻路的原理
这张图网上有很多,是A*经典图片
注意:如图A到B,我们不能走红色的路线,绿色是正确路径之一。为什么不能走红色路线呢?刚开始,我郁闷了好久,后来才弄明白这里的方块就是最小的移动单位(这句话很重要),也就是说这里的方块已经是最小的移动单位了,不可再拆分。红色路线其实又再次的拆分了方块,这个是不对的(具体项目都有自己的最小移动单位,这个一定要弄清楚)。
假设我们要从“绿色方块”到达“红色方块”。那么,从“绿色方块”开始,下次可移动的点有8个,即“绿色方块”周围的8个点。我们每次都需要计算周围8个方块的耗费。
(方块左下角的数值是到“父节点”parentNode的距离,用G表示;右下角的数值是到“红色方块”的距离,用H表示;左上角的数值是G与H的和,用F表示(F=G+H)。
一、首先把“绿色方块”放到一个列表里,我们称它为“开放列表”openList。
二、寻找openList中F值最小的方块,我们称之为S;
三、将S放入另一个列表里,我们称它为“关闭列表”closeList;
四、S周围的8个方块:
a)如果它在closeList中或者不可通过,忽略;
b)如果它不在openList中,将它加入openList,并且设置父节点parentNode=S;
c)如果它在openList中,则假设以S为父节点,重新计算F、G、H——如果新的F小于原来的F,
则更换父节点parentNode=S,并更新F、G、H的值;
d)重新对openList排序。
五、重复步骤四,直到停止:1、“红色方块”已经加入到openList,找到目的地;2、openList为空,没有路径可以到达目地。如果是情况1,则我们从“红色方块”开始,沿着每块的父节点parentNode直到“绿色方块”,就是我们要找的路径。
这只是最基础的算法,并没有优化什么的。至于代码,相信难不倒各位。可以上网寻找一些大神的文章,都写的很好,推荐链接:https://www.cnblogs.com/yangyxd/articles/5447889.html
好了,以上就是个人对A*的理解,有什么不对的地方,欢迎指正!