本文目的是对A*寻路算法所生成的路径进行一些人性化的调整,使其看起来不至于太机械化。关于A*算法的原理与实现,读者可以阅读其他资料,这里不再详细阐述。

如何写估价函数

A*寻路算法本质上是一个有方向性的广度优先搜索算法,它使用一个估价函数,来估测可能的最短路径,在每一次搜索迭代完成后,选取其邻接点中最优的一个(即,距离终点最近的一个点),作为下一次迭代的起点。如此反复,直到找到终点。下面先列出估价函数的常规写法:

设i点到起点的价值为S,到终点的估价为E,i点的总估价G等于S+E。S的值是确定的:

[cpp] view plain copy
  1. S = parent.S + 1(i点是其父节点的水平或垂直方向上的邻接点)
  2. S = parent.S + sqrt(2))(i点是其父节点斜方向上的邻接点)

E点的值需要估算。精确一点的写法:

[cpp] view plain copy
  1. 水平距离:dx = abs(ix - ex)
  2. 垂直距离:dy = abs(iy - ey)
  3. 需要斜着走过的距离:v1 = min(dx, dy) * sqrt(2)
  4. 需要直线走过的距离:v2 = max(dx, dy) - min(dx, dy)
  5. E =  v1 + v2

粗略的写法:

[cpp] view plain copy
  1. E = abs(ix - ex) + abs(iy - ey)

如何避免转向抖动

A*寻路得到的结果是最优的,但不是唯一的,这源于两点之间最近的路线可能不只一条。那么问题就产生了,两条最佳路线距离都相等的情况下,哪一条会更好?

   

(红色是障碍,白色可通行,黑色是搜索路径)

如上图所示,是A* 8方向搜索得到的两条距离相等的路线,但是左图的路线在中间位置发生了“拐弯”,要比右图的路线多一个“拐弯”。如果路线上拐弯太多,人物行走的过程中,会出现频繁转向,从而出现“抖动”现象。所以,我们判定右图路线优于左图路线。针对这一问题,我们可以通过修改估价函数,来选择“拐弯”更少的路线。

拐弯的问题,可以简化成先尽可能的向一个方向走,然后再考虑转向。进一步简化成,点越接近起点或是终点,越优先考虑。我们给E加上一个干扰值factor,

[cpp] view plain copy
  1. factor = min(abs(ix - sx), abs(ix - ex)) + min(abs(iy - sy), abs(iy - ey))
  2. factor *= 0.01

factor的值不能过大,否则会造成搜索结果不是最短距离,因此适当的给factor乘上一个缩放系数。

如何远离障碍物

A*寻路的效果是抄近道,走捷径。但对于游戏体验来说,这并不完全是件好事,放着宽阔的马路不走,非得走悬崖峭壁,一不小心就跌落万丈深渊,或者卡在岩石边上。那么,我们该如何避免这些现象呢?同样,我们可以通过修改估计函数做到。

我们给每一块可走区域都加上一个干扰值,越靠近障碍的可走区域,其干扰值越大。干扰值计算方法:

[cpp] view plain copy
  1. factor = 0
  2. for(x = -n; x <= n; ++x)
  3. {
  4. for(y = -n; y <= n; ++y)
  5. {
  6. if(isObstacle(ix + x, iy + y))
  7. {
  8. factor += n - min(abs(x), abs(y))
  9. }
  10. }
  11. }

我们甚至可以根据地表的材质来增加干扰值,比如山路和沼泽地带明显比马路的干扰值大。

后记

总之,我们可以调节估价函数来达到不同的效果。但是,也不能随意修改,不良的估价函数,会增加搜索成本。

A star算法优化二相关推荐

  1. 基于粒子群优化二维Otsu的肺CT图像分割算法

    1.内容简介 略 488-可以交流.咨询.答疑 2.内容说明 随着大气污染的加剧和环境的破坏,肺癌患者急剧增加,肺癌成为危害人 类健康最大的恶性肿瘤,因此肺癌治疗迫在眉睫.当前,肺肿瘤检查的主要方 式 ...

  2. A star算法优化一

    A*算法 求最优解 算法一直维护两个表: Open和Close 将起点S加入Open中 将所有S可到达的点(障碍物以及位于Close表中的点均看成不可达)加入到Open中.将起点从Open中删去,并加 ...

  3. Dijistra和A star算法

    Dijistra和A star算法在自动驾驶领域可用于路径的搜索,甚至在一定的场景下能用作轨迹的规划. A star算法相当于是Dijistra算法的改进,在其基础上加上了绝对距离等判断条件,从而大大 ...

  4. 「游戏」寻路算法之A Star算法原理及实现

    前言 自动寻路是在一些如MMORPG等类型游戏中常见的一种功能,其给了玩家良好的游戏体验,使得玩家在游戏过程中省去了大量游戏坐标点的记录以及长时间的键盘操作,不必记忆坐标,不必担心迷路,用最快捷的方法 ...

  5. 【Kelm分类】基于哈里斯鹰算法优化核极限学习机实现数据分类附matlab代码

    1 简介 为了提高核极限学习机(KELM)的分类正确率,采用哈里斯鹰算法(HHO)对惩罚系数,宽度参数两个参数进行优化.首先,根据乳腺良恶性肿瘤数据库训练集并利用哈里斯鹰算法优化核极限学习机;然后,通 ...

  6. c语言循环链表约瑟夫问题的时间复杂度,用单向循环链表解决约瑟夫问题算法优劣性分析.doc...

    用单向循环链表解决约瑟夫问题算法优劣性分析 用单向循环链表解决约瑟夫问题算法优劣性分析 摘要: 首先由简单问题引入约瑟夫问题,然后用单向循环链表解决约瑟夫问题,最后对模拟方法及数学方法的优劣性进行分析 ...

  7. A star算法的一些研究

    A Star算法是一智能找最短路径算法(下面简称A算法), 与 Dijkstra算法相比,A算法访问的节点比较少,因此可以缩短搜索时间.他的算法思想是: 这里有公式f 最终路径长度f = 起点到该点的 ...

  8. 【预测模型-ELM分类】基于鲸鱼算法优化核极限学习机实现数据分类附matlab代码

    1 内容介绍 极限学习机(extreme learning machine,ELM)作为一种新兴的机器学习方法,已经成为了一个热门的研究方向. ELM 随机确定单隐含层网络的输入权值和隐含层节点偏置, ...

  9. 【Kelm预测】基于哈里斯鹰算法优化核极限学习机实现数据预测matlab代码

    1 简介 工业过程常含有显著的非线性,时变等复杂特性,传统的核极限学习机有时无法充分利用数据信息,所建软测量模型预测性能较差.为了提高核极限学习机的泛化能力和预测精度,提出一种哈里斯鹰算法结合核极限学 ...

最新文章

  1. 终于能用Google的TPU跑代码了,每小时6.5美元
  2. U平方Net:深入使用嵌套的U型结构进行显著目标检测
  3. java json 转map_Java对接Omni/USDT教程「OmniTool.Java」
  4. 转:亿级Web系统的高容错性实践(好博文)
  5. django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)...
  6. hdu 4407 Sum
  7. 无法跳转 vscode_爱了爱了,这个VSCode插件将极大提高你的工mo作yu效率
  8. java扫雷随机地雷_原创扫雷(未添加随机分布地雷),想看就进来看下吧
  9. C# socket nat 映射 网络 代理 转发
  10. B-Tree及其建立过程
  11. 【测试】软件测试用例设计
  12. 【Photoshop教程】转发:Photoshop把帅哥转成超酷的阿凡达
  13. 深圳有哪些牛逼的互联网公司?看完你再跳槽!
  14. 传奇人物称号设置详细步骤
  15. linux 安装 rtl8111e / r8168 驱动
  16. 对接支付宝App支付接口详解
  17. Solr6适配自定义升级版mmseg4j
  18. keras 实现GAN(生成对抗网络)
  19. 关于NBMA网络基于RIP、HDLC、PPP,MGRE环境下实现所有PC互通
  20. 2012二级c语言上机,2012全国计算机等级考试-二级C语言-上机考试-填空题-分类总结...

热门文章

  1. 谷歌开源 Python Fire:可自动生成命令行接口
  2. 创业版上市与SAP管理软件系统的关系
  3. 从源码看ConcurrentHashMap
  4. 数据结构与算法--10.利益最大值
  5. java样式是什么_java css样式 css样式的种类 选择器 文本相关样式 背景相关样式 边框 盒子模式...
  6. git ssh拉取代码_阿里云搭建git服务器
  7. 机器学习接口和代码之 KNN
  8. 快速傅里叶变换python_FFT快速傅里叶变换的python实现过程解析
  9. Redis数据库 【总结笔记】
  10. Django 部署基础【使用 Nginx + uWSGI 的方式来部署来 Django】