本文目的是对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. }

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

后记

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

转载于:https://blog.51cto.com/11302972/1749419

A*寻路算法所生成的路径相关推荐

  1. A* 寻路算法,matplotlib地图生成

    A* 寻路算法 地图生成: point.py # point.pyimport sysclass Point:def __init__(self, x, y):self.x = xself.y = y ...

  2. 实用高效的寻路算法——A*寻路算法的实现及优化思路

    前言:寻路是游戏比较重要的一个组成部分.因为不仅AI还有很多地方(例如RTS游戏里操控人物点到地图某个点,然后人物自动寻路走过去)都需要用到自动寻路的功能. 本文将介绍一个经常被使用且效率理想的寻路方 ...

  3. 最快速的寻路算法 Jump Point Search

    作者:runzhiwang,腾讯 TEG 后台开发工程师 本文介绍一种跳点搜索算法 JPS 以及其四个优化算法,其寻路速度最快可是 A*算法的 273 倍.文中的 JPS-Bit 和 JPS-BitP ...

  4. 游戏中常用的寻路算法(5)预先计算好的路径的所用空间

    有时候,影响计算寻路路径的不是时间,而是计算路径所需的上百个单元格所占的空间.寻路是需要内存来运行寻路算法,还需要额外内存来存储寻到的路径.运行寻路算法(A*,开集或闭集)所需的临时空间经常会比存储这 ...

  5. 关于寻路算法的一些思考(6):预先计算好的路径的所用空间

    有时候,影响计算寻路路径的不是时间,而是计算路径所需的上百个单元格所占的空间.寻路是需要内存来运行寻路算法,还需要额外内存来存储寻到的路径.运行寻路算法(A*,开集或闭集)所需的临时空间经常会比存储这 ...

  6. c语言a 寻路算法,JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例

    本文实例讲述了JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法.分享给大家供大家参考,具体如下: 完整实例代码如下: A*寻路算法 #stage { border: 1px solid lig ...

  7. 迷宫生成算法和迷宫寻路算法

    迷宫生成算法和迷宫寻路算法 大学二年级的时候,作为对栈这个数据结构的复习,我制作了一个迷宫生成算法的小程序,当时反响十分好,过了几天我又用自己已经学的DirectX技术制作了DirectX版的程序.这 ...

  8. A*寻路算法之解决路径多拐点问题

    1.问题描述 最近公司正在开发的游戏涉及到了寻路算法,然后我从网上找了一份A*算法代码,整理了一下写了一个A*算法基础实现.然而,在真正实用时A*寻路时,却发现了几个问题: 基础实现版的A*寻路算法在 ...

  9. 5 X 5 方阵引出的寻路算法 之 路径遍历(完结)

      此篇文章源自对一个有趣问题的思考,在我的另一篇博文<一个有趣的 5 X 5 方阵一笔画问题>中有详细介绍.在已知其结论的情况下,作为程序员的我,还是想利用该问题当做出发点,写一个可以遍 ...

最新文章

  1. 奇虎360正式开源其深度学习调度平台,支持TensorFlow、MXNet等框架
  2. 怎么安装python3-如何装python3
  3. 窥探try ... catch与__try ... __except的区别
  4. ML之MaL: 流形学习MaL的概念认知、算法分类、案例应用、代码实现之详细攻略
  5. php 图片合成,PHP中多张图片合成一张图片例子
  6. linux下ftp配置文件详解
  7. hihoCoder-1097-最小生成树一·Prim算法 (最小生成树)
  8. Spring Boot和Dubbo整合
  9. tx2 ubuntu 修改屏幕分辨率
  10. Java 发送邮件工具类(多个收件人,多个抄送人)
  11. 翻译一定要知道的一些软件和工具
  12. 今日头条笔试面试大全
  13. 怎样用计算机粉碎文件夹,电脑粉碎文件用什么软件好,怎么彻底粉碎电脑文件...
  14. 如何查看当前位置显存使用情况
  15. LTE/LTE-Advanced 第2章 网络架构
  16. 烤地瓜(PYTHON 学习类和对象)
  17. IDEA代码放大缩小快捷键设置、注释、标识符以及关键字。
  18. 获取Word2vec训练得到的所有词与词向量
  19. 标准盒模型怪异盒模型
  20. Tomorrow never knows?(C程序设计进阶第2周)

热门文章

  1. 把cmakelist转化为Qt Pro文件
  2. 图像局部显著性—点特征(SiftGPU)
  3. AI:***一文读懂ML,DB/NLP/算法全有了……
  4. java postdata_java发送post请求,使用multipart form-data的方式传递参数,可实现服务器间文件上传功能...
  5. [09-01]JavaScript 基础语法
  6. .NET多线程编程(7)——C#多线程编程传递参数解决方案
  7. INPUT[type=file]的change事件不触发问题
  8. Android---- 获取当前应用的版本号和当前android系统的版本号
  9. ⑨④-如果不发展就可能面临生存窘境
  10. tez安装官方文档整理+翻译