java a星寻路算法_用简单直白的方式讲解A星寻路算法原理
很多游戏特别是rts,rpg类游戏,都需要用到寻路。寻路算法有深度优先搜索(DFS),广度优先搜索(BFS),A星算法等,而A星算法是一种具备启发性策略的算法,效率是几种算法中最高的,因此也成为游戏中最常用的寻路算法。
直入正题:
在游戏设计中,地图可以划分为若干大小相同的方块区域(方格),这些方格就是寻路的基本单元。
在确定了寻路的开始点,结束点的情况下,假定每个方块都有一个F值,该值代表了在当前路线下选择走该方块的代价。
而A星寻路的思路很简单:从开始点,每走一步都选择代价最小的格子走,直到达到结束点。
A星算法核心公式就是F值的计算:
F = G + H
F - 方块的总移动代价
G - 开始点到当前方块的移动代价
H - 当前方块到结束点的预估移动代价
以下详细解释这个公式,方便更好地理解它。
G值是怎么计算的?
假设现在我们在某一格子,邻近有8个格子可走,当我们往上、下、左、右这4个格子走时,移动代价为10;当往左上、左下、右上、右下这4个格子走时,移动代价为14;即走斜线的移动代价为走直线的1.4倍。
这就是G值最基本的计算方式,适用于大多数2.5Drpg页游。
基本公式:
G = 移动代价
根据游戏需要,G值的计算可以进行拓展。如加上地形因素对寻路的影响。格子地形不同,那么选择通过不同地形格子,移动代价肯定不同。同一段路,平地地形和丘陵地形,虽然都可以走,但平地地形显然更易走。
我们可以给不同地形赋予不同代价因子,来体现出G值的差异。如给平地地形设置代价因子为1,丘陵地形为2,在移动代价相同情况下,平地地形的G值更低,算法就会倾向选择G值更小的平地地形。
拓展公式:
G = 移动代价 * 代价因子
H值是如何预估出来的?
很显然,在只知道当前点,结束点,不知道这两者的路径情况下,我们无法精确地确定H值大小,所以只能进行预估。
有多种方式可以预估H值,如曼哈顿距离、欧式距离、对角线估价,最常用最简单的方法就是使用曼哈顿距离进行预估:
H = 当前方块到结束点的水平距离 + 当前方块到结束点的垂直距离
题外话:A星算法之所以被认为是具有启发策略的算法,在于其可通过预估H值,降低走弯路的可能性,更容易找到一条更短的路径。其他不具有启发策略的算法,没有做预估处理,只是穷举出所有可通行路径,然后从中挑选一条最短的路径。这也是A星算法效率更高的原因。
每个方块的G值、H值是怎么确定的呢?
G值 = 父节点的G值 + 父节点到当前点的移动代价
H值 = 当前点到结束点的曼哈顿距离
最后,A星算法还需要用到两个列表:
开放列表 - 用于记录所有可考虑选择的格子
封闭列表 - 用于记录所有不再考虑的格子
以上就是要完成A星算法所需要的东西,而算法的过程并不复杂。
A星算法伪码:
a、将开始点记录为当前点P
b、将当前点P放入封闭列表
c、搜寻点P所有邻近点,假如某邻近点既没有在开放列表或封闭列表里面,则计算出该邻近点的F值,并设父节点为P,然后将其放入开放列表
d、判断开放列表是否已经空了,如果没有说明在达到结束点前已经找完了所有可能的路径点,寻路失败,算法结束;否则继续。
e、从开放列表拿出一个F值最小的点,作为寻路路径的下一步。
f、判断该点是否为结束点,如果是,则寻路成功,算法结束;否则继续。
g、将该点设为当前点P,跳回步骤c。
后续优化
以上就是A星算法最基本的原理,明白了基本原理,用2,3百行代码写出一个可用的A星算法并不难。当然A星算法在实际应用中不仅于此,还可以对细节进行优化:
1、选择排序更快的二叉树来作为开放列表,帮助我们更快地从开放列表中取出F值最小的点;
2、对何种情况下可以走斜线路径加以判断;
3、采用布兰森汉姆算法预先判断两点是否可以直接通行,可通行就直接返回两点的直线路径,不可直接通行再采用A星算法寻路,提高寻路效率;
4、A星算法得出寻路路径后,可采用弗洛伊德算法对路径进行平滑处理,使人物走动更为自然
这里只是用语言讲解A星算法原理,并没有配图讲解整个寻路的过程,希望进一步直观理解整个过程的,推荐参考下面两个网友翻译过来的A星教程
http://www.raywenderlich.com/zh-hans/21503/a%E6%98%9F%E5%AF%BB%E8%B7%AF%E7%AE%97%E6%B3%95%E4%BB%8B%E7%BB%8D
http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx
java a星寻路算法_用简单直白的方式讲解A星寻路算法原理相关推荐
- 程序员面试算法_程序员的前20个搜索和排序算法面试问题
程序员面试算法 大家好,如果您正在准备编程工作面试或正在寻找新工作,那么您知道这不是一个容易的过程. 在您职业的任何阶段,您都必须幸运地接到电话并进行第一轮面试,但是在初学者方面,当您寻找第一份工作时 ...
- 快速近似最近邻算法_数据科学家指南,以选择最佳近似最近邻算法
快速近似最近邻算法 by Braden Riggs and George Williams (gwilliams@gsitechnology.com) Braden Riggs和George Will ...
- python 三次曲线拟合算法_这可能是史上最全的 Python 算法集(建议收藏)
导读:本文是一些机器人算法(特别是自动导航算法)的Python代码合集. 其主要特点有以下三点: 选择了在实践中广泛应用的算法: 依赖最少: 容易阅读,容易理解每个算法的基本思想. 希望阅读本文后能对 ...
- hash算法_阿里面试官:讲一下Hashmap中hash算法!
注:本文内容全部基于jdk8讲述. 相信很多人都知道,在JDK8中,HashMap的容量总是2的n次幂,那么这么设计的目的究竟是什么呢?我可不可以将默认的初始容量从16改成20呢,扩容的时候我可不可以 ...
- std中稳定排序算法_敏哥:深挖亚马逊A9算法中的广告搜索排序
大家好,我是敏哥.最近国外疫情肆虐,牵动着所有跨境电商人的心.今天美国的确诊人数已经突破了33万人,每天以3万左右的确诊数量在增加,就连老虎也未能幸免. 国外疫情肆虐,对于跨境电商人而言并不是一个很好 ...
- 差分进化算法_基于差分进化的水泥烧成系统动态优化算法
基于差分进化的水泥烧成系统动态优化算法 郝晓辰, 冀亚坤, 郑立召, 史鑫, 赵彦涛 燕山大学电气工程学院,河北 秦皇岛 066004 [摘 要]针对水泥烧成过程的资源浪费以及难以建立有效数学机理模 ...
- 只腐蚀毛刺 腐蚀算法_去毛刺更省时省力的方式方法大全!
金属加工平台 订单 | 技术 | 干货 | 社群 关注可加入机械行业群! 关注 去毛刺.倒角这些小工序往往在工作中不可小觑,今天小编总结了过去分享的一些资料,希望能给大家的工作带来帮助. 第一种:通快 ...
- javascript 设计模式_用英雄联盟的方式讲解JavaScript设计模式(二)
前言 大家好,这是第三篇作者对于设计模式的分享了,前两篇可以参考: 手写一下JavaScript的几种设计模式 (工厂模式,单例模式,适配器模式,装饰者模式,建造者模式) 用英雄联盟的方式讲解Java ...
- 用通俗易懂的方式讲解:主成分分析(PCA)算法及案例(Python 代码)
文章目录 知识汇总 加入方式 一.引入问题 二.数据降维 三.PCA基本数学原理 3.1 内积与投影 3.2 基 3.3 基变换的矩阵表示 3.4 协方差矩阵及优化目标 3.5 方差 3.6 协方差 ...
最新文章
- Python匿名函数:lamdba()函数
- 信通院2018人工智能发展白皮书技术篇重磅发布
- linux内核用什么调试,什么是开发/调试Linux内核最有效和最优雅的方式
- DB2数据库常用工具
- redhat 6.2安装telnet服务
- adb android源码分析,Android Adb 源码解析(base on Android 9.0)
- 原生JS封装ajax方法
- Web前端——JavaScript(dom文档对象模型)
- python进阶03UnboundLocalError和NameError错误
- 我们奋斗着并将持续奋斗 ----暨清华D-Lab创新基地揭牌仪式
- C++ BigEndian::FromLocal(uint_16)
- Maven项目的pom.xml配置文件格式初识
- ajax在success方法中打点不能调用
- jsp银行排队叫号系统
- javascript连接数据库
- 关于嵌入式工程师需要知道的网站
- 复变函数知识点整理1-3
- Mac Pro下终端配置Zsh(iterm2 3.3.0 + oh-my-zsh + solarized配色)
- 怎么拍照识别植物?手把手教你识别
- influxdb连续查询
热门文章
- [转] TOUGH 的系列平面广告
- 2021-07-23 小记
- Windows坐标系统
- js与c语言效率_JavaScript比c语言的性能差了多少?
- python怎么发送微信给自己_Python新手教程:Python微信定时自动给【女朋友】发送天气预报...
- mac怎么合并两个容器_Mac怎么合并文件夹?macz不容错过的苹果mac教程分享
- Halcon算子学习:get_sheet_of_light_result
- duilib中的添加自定义控件
- C++学习之路 | PTA乙级—— 1071 小赌怡情 (15 分)(精简)
- C++学习之路 | PTA乙级—— 1030 完美数列 (25 分)(精简)