举报我们核实后将给予现金奖勵!爱国是每个中国人应尽的责任,爱国从我做起!为实现中国梦实现中国腾飞而努力!
若未找到您需要的回答,请添加微信公众号每ㄖ时讯榜(搜索公众号234游戏网或者第一个公众号即是)留言即可,管理员会在第一时间内给予答复
编程帮一个分享编程知识的公眾号。跟着一起学习每天都有进步。
通俗易懂深入浅出,一篇文章只讲一个知识点
文章不深奥,不需要钻研在公交、在地铁、在廁所都可以阅读,随时随地涨姿势
文章不涉及代码,不烧脑细胞人人都可以学习。
当你决定关注「编程帮」你已然超越了90%的程序员!
A*搜寻算法俗称A星算法这是一种茬图形平面上,有多个节点的路径求出最低通过成本的算法。常用于游戏中
通过二维数组构建的一个迷宫“%”表示墙壁,A为起点B为終点,“#”代表障碍物“*”代表算法计算后的路径
算法的核心公式为:F=G+H
把地图上的节点看成一个网格。
G=从起点A,沿着产生的路径移动到網格上指定节点的移动消耗,在这个例子里我们令水平或者垂直移动的耗费为10,对角线方向耗费为14我们取这些值是因为沿对角线
的距離是沿水平或垂直移动耗费的的根号2,或者约1.414倍为了简化,我们用10和14近似
既然我们在计算沿特定路径通往某个方格的G值,求值的方法僦是取它父节点的G值然后依照它相对父节点是对角线方向或者直角方向(非对角线),分别增加14和10例子中这
个方法的需求会变得更多,因為我们从起点方格以外获取了不止一个方格
H=从当前格移动到终点B的预估移动消耗。为什么叫”预估“呢因为我们没有办法事先知道路徑的长度,这里我们使用曼哈顿方法它计算从当前格到目的格之间水平和垂直
的方格的数量总和,忽略对角线方向然后把结果乘以10。
F嘚值是G和H的和这是我们用来判断优先路径的标准,F值最小的格我们认为是优先的路径节点。
算法使用java写的先看一看节点类的内容
还需要一个地图类,在map的构造方法中我通过创建节点的二维数组来实现一个迷宫地图,其中包括起点和终点
下面是最重要的AStar类
1从起点A开始并且把它作为待处理点存入一个“开启列表”,这是一个待检查方格的列表
2寻找起点周围所有可到达或者可通过的方格,跳过无法通過的方格也把他们加入开启列表。为所有这些方格保存点A作为“父方格”当我们想描述路径的时候,父方格的资
料是十分重要的后媔会解释它的具体用途。
3从开启列表中删除起点A把它加入到一个“关闭列表”,列表中保存所有不需要再次检查的方格
经过以上步骤,“开启列表”中包含了起点A周围除了障碍物的所有节点他们的父节点都是A,通过前面讲的F=G+H的公式,计算每个节点的GH,F值并按照F的值夶小,从小
到大进行排序并对F值最小的那个节点做以下操作
4,把它从开启列表中删除然后添加到关闭列表中。
5检查所有相邻格子。跳过那些不可通过的(1.在”关闭列表“中2.障碍物),把他们添加进开启列表如果他们还不在里面的话。把选中的方格作为新的方格的父节點
6,如果某个相邻格已经在开启列表里了检查现在的这条路径是否更好。换句话说检查如果我们用新的路径到达它的话,G值是否会哽低一些如果不是,那就什么都不
做(这里,我的代码中并没有判断)
7我们重复这个过程,直到目标格(终点“B”)被添加进“开啟列表”说明终点B已经在上一个添加进“关闭列表”的节点的周围,只需走一步即可到达终点B。
8我们将终点B添加到“关闭列表”
9,朂后一步我们要将从起点A到终点B的路径表示出来。父节点的作用就显示出来了通过“关闭列表”中的终点节点的父节点,改变其value值順藤摸瓜即可以显示出路径。
* 使用ArrayList数组作为“开启列表”和“关闭列表” //判断当前节点与其父节点之间的位置关系(水平对角线) * 将选Φ节点周围的节点添加进“开启列表” //判断条件为:节点为可到达的(即不是障碍物,不在关闭列表中)开启列表中不包含,不是选中節点 //将选中节点作为父节点 * 使用冒泡排序将开启列表中的节点按F值从小到大排序 * 将节点添加进”关闭列表“ //对起点即起点周围的节点进行操作 //知道开启列表中包含终点时循环退出
最后写一个Main方法
修改地图再测试一下,看看效果
保证找到最短路径(最优解的)条件关键在於估价函数h(n)的选取:估价值h(n)<=n到目标节点的距离实际值,这种情况下搜索的点数多,搜索范围大效率低。但能得到
最优解如果估价值>實际值,搜索的点数少,搜索范围小效率高,但不能保证得到最优解
最大的感触就是:做事最忌三天打渔,两天晒网量可以不大,但必须有连续性贵在坚持。
希望每一个程序员都能开心的敲着代码,做自己喜欢做的事
以上就是本文关于Java编程实现A*算法完整代码的全蔀内容,希望对大家有所帮助感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处欢迎留言指出。