A*搜索算法--游戏寻路

文章目录

    • 1. 算法解析
    • 2. 总结

仙剑奇侠传这类MMRPG游戏中,有人物角色 自动寻路功能。当人物处于游戏地图中某位置时,点击另一个相对较远的位置,人物就会自动地绕过障碍物走过去。这个功能是怎么实现的呢?

1. 算法解析

这是一个非常典型的搜索问题。起点是当下位置,终点是鼠标点击位置。找一条路径。路径要绕过地图中所有障碍,并且走的路不能太绕。最短路径显然是最聪明的走法,是最优解。

但是如果图非常大,那Dijkstra最短路径算法的执行耗时会很多。在真实的软件开发中,面对的是超级大的地图和海量的寻路请求,算法的执行效率太低,是无法接受的。

一般情况下,我们都不需要非得求最优解(最短路径)。在权衡路线规划质量和执行效率的情况下,只需要寻求一个次优解就足够了

  • A* 算法是对Dijkstra算法的优化和改造。

Dijkstra 算法有点类似BFS算法,它每次找到跟起点最近的顶点,往外扩展。这种往外扩展有些盲目。举一个例子。下图对应一个真实地图,每个点在地图中的位置,用一个坐标(x,y)来表示,x横坐标,y纵坐标。
在这里插入图片描述
在Dijkstra算法中,用一个优先队列,记录已经遍历的顶点以及这个顶点与起点的路径长度。顶点与起点路径长度越小,优先从优先级队列中取出来扩展,从图中举例可以看出,尽管找的是从s到t的路线,但是最先被搜索到的顶点依次是1,2,3。这个搜索方向明显“跑偏"了。

之所以“跑偏”,是因为没有考虑这个顶点到终点的距离,尽管1,2,3三个顶点离起始顶点最近,但离终点却越来越远。

如果综合更多因素,把这个顶点到终点可能还要走多远,考虑进去,综合判断哪个顶点先出队列,是不是就可以避免“跑偏”呢?

当遍历到某个顶点时,从起点走到这个顶点的路径长度是确定的,我们记作g(i)。通过这个顶点跟终点之间的直线距离,也就是欧几里得距离,来近似估计这个顶点跟终点的路径长度。我们把这个距离记作h(i),专业叫法是启发函数(heuristic function)。因为欧几里得距离公式,会涉及比较耗时的开根号计算,所以一般计算曼哈顿距离(Manhattan distance)。曼哈顿距离是两点之间横纵坐标的距离之和。只涉及加减法、符号位反转,所以更加高效。

int hManhattan(Vertex v1, Vertex v2) 
{ // Vertex 表示顶点return Math.abs(v1.x - v2.x) + Math.abs(v1.y - v2.y);
}

通过两者之和 f(i)= g(i)+ h(i),来判断哪个顶点最先出队。能有效避免“跑偏"。这里f(i)的专业叫法是估价函数(evaluation function)。

A* 算法就是对Djkstra算法的简单改造。在A*算法的代码实现中,顶点Vertex类的定义,多了x,y坐标,f(i)值。

A* 算法跟Djkstra 算法主要有3点区别:

  • 优先级队列构建的方式不同。A*算法是根据 f 值 f(i)=g(i)+h(i)来构建优先级队列,而Dijkstra 算法是根据dist值 g(i)来构建优先级队列;
  • A*算法在更新顶点dist值的时候,同步更新 f 值;
  • 循环结束的条件不一样。Dijkstra 算法是在终点出队列的时候才结束,A*算法是一旦遍历到终点就结束。

尽管A* 算法可以快速找到从起点到终点的路线,但是它并不能像Dijkstra算法那样,找到最短路线
在这里插入图片描述
Dijkstra 算法在回溯基础上,利用动态规划思想,对回溯进行剪枝,只保留起点到某个顶点的最短路径,继续往外扩展搜索。动态规划相较于回溯搜索,只是换了一个实现思路,但它实际上也考察到了所有从起点到终点的路线,所以能得到最优解。
在这里插入图片描述
A* 算法之所以不能像Dijkstra 算法那样,找到最短路径,主要原因是两者的while 循环结束条件不一样。

  • Dijkstra 算法是在终点出队列的时候才结束
  • A*算法是一旦遍历到终点就结束。

对于Dijkstra 算法来说,当终点出队列的时候,终点的 dist 值是优先级队列中所有顶点的最小值,即便再运行下去,终点的dist值也不会再被更新了。
对于A* 算法来说,一旦遍历到终点,我们就结束 while循环,这个时候,终点的dist值未必是最小值。

A* 算法利用贪心算法的思路,每次都找 f 值最小的顶点出队列,一旦搜到终点就不继续考察其他顶点和路线。所以,它没有考察所有路线,也就不能找出最短路径。

如何借助A* 算法解决游戏寻路?

游戏地图并不像现实生活中那样,存在规划非常清晰的道路,更多的是宽阔的荒野、草坪等。换一种抽象的思路,把地图分割成一个一个的小方块。在某个方块上的人物,只能往上下左右四个方向移动。把每个方块看作一个顶点。方块相邻,它们之间连两条有向边,权值都是1。套用A* 算法。

2. 总结

A* 算法属于一种启发式搜索算法(Heuristically Search Algorithm)。启发式搜索算法还有很多其他算法,比如 IDA* 算法、蚁群算法、遗传算法、模拟退火算法等。

  • 启发式搜索算法利用估价函数,避免“跑偏”,贪心地朝着最有可能到达终点的方向前进。
  • 算法找出的路线,并不是最短路线。
  • 实际软件开发中的路线规划问题,并不需要非得找最短路线。鉴于启发式搜索算法能很好地平衡路线质量和执行效率,它应用更加广泛。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里P8架构师谈:应用后端+移动端的性能优化指标,以及性能优化方法

性能优化专题 阿里P8架构师谈:MySQL数据库的索引原理、与慢SQL优化的5大原则 阿里P8架构师谈:Web前端、应用服务器、数据库SQL等性能优化总结 大型网站Web前端优化最佳实践,以及最全优化工具集锦 阿里P8架构师谈:多线程、架构、…

无主题

厦门月亮少 20191003 之前突然遇到个bug,解决好久无果,开始干点别的事情,大约四天后的今天,我打开程序想解决一下,然后,调试半天无果,妈妈突然微信和我聊天了,聊完以后往终端一瞥&a…

PyTorch Trick集锦

文 | z.defying知乎来源 | https://zhuanlan.zhihu.com/p/76459295前言本文整理了13则PyTorch使用的小窍门,包括了指定GPU编号、梯度裁剪、扩展单张图片维度等实用技巧,能够帮助工作者更高效地完成任务。1、指定GPU编号2、查看模型每层输出详情3、梯度裁…

论文浅尝 | 利用推理链进行视觉问题回答

论文笔记整理:吴杨,浙江大学计算机学院,知识图谱、NLP方向。http://papers.nips.cc/paper/7311-chain-of-reasoning-for-visual-question-answering.pdf动机在视觉问题回答中,较为复杂的问题经常需要多步骤的推理才能够回答&#…

阿里P8架构师谈:数据库、JVM、缓存、SQL等性能调优方法和原则

编辑 性能优化基本是BAT等一线互联网公司程序员必备的技能,以下为大家完整揭晓性能完整的优化方案和方法:包含web网站调优、数据库、JVM调优、架构调优等方案。 第一:Web网站调优 1、尽可能减少HTTP请求:图片合并 (cs…

知乎招聘搜索算法实习生!邀你共建知乎搜索引擎!

星标/置顶小屋,带你解锁最萌最前沿的NLP、搜索与推荐技术部门介绍搜索算法团队是知乎核心算法团队之一,负责知乎搜索框背后的各项算法工作。我们团队一直非常重视新技术在搜索场景的探索和落地,包括但不限于 NLP,排序,…

论文浅尝 | 主题感知的问答生成

Citation: XingC, Wu W, Wu Y, et al. Topic aware neural response generation[C]//Thirty-FirstAAAI Conference on Artificial Intelligence. 2017.动机人机对话在 AI 和 NLP 领域是一项具有挑战性的工作。现存的对话系统包括任务导向的对话系统和非任务导向的聊天机器人。在…

.halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

尊敬的读者: 网络安全是当今数字时代的一大挑战,各种勒索病毒如.halo病毒层出不穷,对用户和企业的数据安全构成了严重威胁。本文将介绍.halo勒索病毒,以及如何恢复被其加密的数据文件,同时提供预防措施。在面对被勒索…

阿里P8架构师谈:多线程、架构、异步消息、Redis等性能优化策略

常见性能优化策略分类 1.代码 之所以把代码放到第一位,是因为这一点最容易引起技术人员的忽视。很多技术人员拿到一个性能优化的需求以后,言必称缓存、异步、JVM等。实际上,第一步就应该是分析相关的代码,找出相应的瓶颈&#xf…

周志华教授专著《集成学习:基础与算法》上市,豆瓣满分森林书破解AI实践难题...

近年来,机器学习技术的快速发展推动了语音、自然语言处理、机器视觉等多个领域获得巨大进步,也带动了人工智能相关产业的蓬勃发展。回顾机器学习最近30 年的发展历程,各种学习方法推陈出新、不断演进。但是,在此历程中&#xff0c…

Redis常用数据类型的数据结构

文章目录1. Redis 数据库介绍2. 列表(list)3. 字典(hash)4. 集合(set)5. 有序集合(sortedset)6. 数据结构持久化7. 总结1. Redis 数据库介绍 Redis 是一种键值( Key-Val…

论文浅尝 | 使用循环神经网络的联合事件抽取

余博涛,南京大学计算机科学与技术系,硕士研究生论文连接:http://www.aclweb.org/anthology/N16-1034发表会议:NAACL-HLT 2016摘要事件抽取(event extraction)是信息抽取中一个特别具有挑战性的问题。针对该…

阿里P8架构师谈:Web前端、应用服务器、数据库SQL等性能优化总结

web前端性能优化 Web前端指网站业务逻辑之前的部分,包括: 1.浏览器加载 2.网站视图模型 3.图片服务 4.CDN服务等 主要优化手段有优化浏览器访问,使用反向代理,CDN等。 1.浏览器访问优化 (1)减少http…

动手做个DialoGPT:生成式多轮对话模型

文 | 苏剑林编 | 兔子酱前段时间刷Arixv的时候,发现清华大学开源了一个大规模的中文闲聊语料库LCCC,从开源的文件上来看,这可能是目前开源的数量最大、质量最好的闲聊语料库了,而且还包含了部分多轮对话聊天,总的来说可…

搜索引擎背后的数据结构和算法

文章目录1. 整体系统介绍2. 搜集2.1 待爬取网页链接文件:links.bin2.2 网页判重文件:bloom_filter.bin2.3 原始网页存储文件:doc_raw.bin2.4 网页链接及其编号的对应文件:doc_id.bin3. 分析3.1 抽取网页文本信息3.2 分词并创建临时…

论文浅尝 | DKN: 面向新闻推荐的深度知识感知网络

笔记整理:仲亮靓,东南大学硕士研究生,研究方向是基于知识图谱的推荐系统动机新闻文本的语言非常凝练,其中包含了很多实体和常识知识。但目前的新闻个性化推荐方法都没有利用这些外部知识,也没有使用新闻之间潜在的知识…

聊聊工业界做机器学习的里程碑

文 | 吴海波编 | YY阅读说明,本文的机器学习领域限制于互联网搜索、推荐、广告场景,仅限于个人观点。2017年,我和团队的几个核心去了趟北京,找了各大互联网公司一线实战的同学,交流各自在机器学习上的经验。这次交流让…

直通BAT JVM必考题:Minor GC、Major GC、Full GC的区别

Java面试过程,JVM属于必考题系列: 直通BAT必考题系列:深入详解JVM内存模型与JVM参数详细配置 直通BAT必考题系列:JVM的4种垃圾回收算法、垃圾回收机制与总结 直通BAT必考题系列:7种JVM垃圾收集器特点,优…

matplotlib绘制多张图、多子图、多例图

绘制多图 关键: fig plt.figure(1) 表示新建第几个图 import matplotlib.pyplot as pltfig plt.figure(1) plt_rec_loss [1,2,3,4,5,6] plt_rec_recall [4,3,6,5,8,9] plt.xlabel("epoch") plt.ylabel("loss") plt.plot(range(len(plt_re…

jieba分词并做分析

Github:结巴分词地址 https://github.com/fxsjy/jieba 几种分词方法的简单使用:一 . jieba安装、示例 pip install jieba,jieba分词的语料是基于人民日报。分词示例1 import jieba 2 3 str1 江州市长江大桥 4 word_object jieba.cut(s…