最近做到一道题,题目如下:

有 A、B 两点,中间有一堆障碍物,求出A点到B的可行的路径,写出一个 DEMO 并可用任何语言实现(要求可以任意设置 A、B 点和障碍物的位置,需要做UI)。

首先,理解一下题意,需要求出 A、B 两点的可行路线,要注意的是可以任意设置 A、B 两点位置以及障碍物的位置且需要做 UI。题目需一句话带过,但需要做不少的工作。嗯,很明显,这是一道考算法逻辑还有 UI 的题目。

现在我们将主要工作放在如何去求出 A、B 两点的可行的路径呢?

估计看到题目,很多人都会无从下手。但再认真想想,其实这道题目就类似我们日常用的导航,寻找起点和终点可行的最短路线。那么,我们可以使用搜寻算法解决这一道题目。搜寻算法有很多种,如:最佳优先搜索算法 (Best-First Search)、戴克斯特拉算法(Dijkstra)、A 搜寻算法和迭代加深 A 算法(IDA* )等等。

先来了解一下 A* 搜寻算法:

A* 算法综合了 最佳优先搜索算法 (Best-First Search) 和 戴克斯特拉算法(Dijkstra)的优点:在进行启发式搜索提高算法效率的同时,可以保证找到一条最优路径(基于评估函数) 维基百科

A* 搜寻算法的估算函数:

f(n) = g(n) + h(n)

g(n) 表示起点到任意点 n 的距离,h(n) 表示任意点 n 到目标点的距离,f(n) 则表示任意点 n 到起点以及目标点的和。f(n) 越小时,那么起点到目标点的可行路径越小。

接下来我们使用图文来说明一下我们该如何计算:

我们可以将所有格子看作一个二维数组,里面分为可行以及不可行(即障碍物)。我们将起始点标记为 A 以及目标点(终点)标记为 B,此处我们忽略可斜走的情况(因为需要做各种限制,略麻烦),本文 Open List 存放所有 A 附近可行的方格,Close List 存放已行的不需要再关注的方格。

(图一)

可见图一,起点 A 上下左右有四个方格,右边格子为障碍物,再次我们则忽略它,那么起点 A 相邻可行的格子有上左下这三个。我们设置一个 Open List 用于存放可行的方格,以及一个 Close List 用于记录已行方格。首先将起点 A 放进 Open List 中,然后搜寻起点 A 附近可行方格放到 Open List 中作记录。

从上面 A 搜寻算法的简单了解,我们可知 A 搜寻算法的估算函数是:f(n) = g(n) + h(n)

A 相邻的长方形 f(n) 越小,则 A 到达 B 的可行路径最短,因此我们需要选择最小 f(n) 的长方形行走。接下来看看我们如何去计算 f(n) 的值。

为了方便计算,我们将方格的长宽设置为 1 ,如果可斜走那么每一个的斜线为 。当然为了方便计算可使用长宽为 10,斜线为 14 的比例来计算。

(图二)

如图二,起点 A 有三块可行的方格,我们标记为粉红色,那么首先我们计算这三个方格的 g 值。起点 A 的上左下的方格分别离 A 点距离 g(n) 为 1 ,所以标记粉红色的上左下的方格 g(n) 值为 1。

那么接下来计算 h(n) 值,计算 h(n) 值时忽略障碍物,即所有方格可行的情况下计算(如果可行斜线情况下,那么在计算 h(n) 值的时候不计算斜走的情况,只计算任意点直行到终点距离)。那么可计算出起点 A 下方的方格 h(n) 等于 7,左方 h(n) 等于 9,上方 h(n) 等于 9。那么得出上左下三个方格的 f(n) 值:

起点 A 上方:f(n) = g(n) + h(n) = 1 + 9 = 10

起点 A 左方:f(n) = g(n) + h(n) = 1 + 9 = 10

起点 A 下方:f(n) = g(n) + h(n) = 1 + 7 = 8

由上面的计算可得出起点 A 下方的 f(n) 值为最小,那么我们第一步走到起点 A 下方的方格。那么将起点 A 下方的方格存到 Close List,且同时从 Open List 中移除。

(图三)

如图三,我们走了第一步后 A 点去到了起点的下方一个,那个继续去计算,由于上面起点已经存在于 Close List 以及已存在于 Open List 的格子我们不需要再关注,那么图上可看到 A 点接着可行点只有左右两点,那么计算 A 点到左边格子 g(n) 为 2,h(n) 为 8,右边格子 g(n) 为 2,h(n) 为 6。那么 A 点左边格子 f(n) 等于 10,右边格子 f(n) 等于 8,因此我们第二步走 A 点右边格子,将格子从 Open List 移除,存进 Close List(如图四)。

(图四)

以此类推,我们最终可得出的路径(如图五)。

(图五)

如图五,绿色路径为可行的最短路径,红色标志的则是已存在于 Open List 的方格。

基本原理就是如此,代码我就不一一列出来,我会放到 Github 或者看看 Jsfiddle 上面,有兴趣的可以看一下,对应方法也有对应的注释。可以看一下最终实现的 效果

动画演示各种算法地址:http://www.webhek.com/post/pathfinding.html

新手一枚,如果有什么写错的或者不好的地方,请各位大大指点探讨一下,我会不断优化提升。

哦,最近本人在找工作,期待工作地区广州、深圳、佛山,如有好工作或者内推等可以私聊一下我。

寻路之 A* 搜寻算法相关推荐

  1. 寻路的几种算法_Godot游戏开发实践之二:AI之寻路新方式

    一.前言 AI 一直是游戏开发中一个热门词汇,当然这不是人工智能的那个 AI ,而是指有着人类思想的 NPC 或者聪明的敌人等等.根据游戏的类型和复杂程度, AI 的实现可以很简单,也可以非常复杂.作 ...

  2. NavMesh寻路中的漏斗算法

    转自:https://www.cnblogs.com/pointer-smq/p/11332897.html NavMesh是广泛使用的一种寻路技术,将地图中可走的部分生成连续的多边形/三角形网格,寻 ...

  3. 游戏中常用的寻路算法(6):地图表示

    在本系列文档大部分内容中,我都假设A*用于某种网格上,其中的"节点"是一个个网格的位置,"边"是从某个网格位置出发的各个方向.然而,A*可用于任意图形,不仅仅是 ...

  4. [转]关于寻路算法的一些思考

    关于寻路算法的一些思考(1):A*算法介绍 物体的移动算法似乎显得很简单,然而寻路规划问题却十分复杂.考虑下面这个例子: 这个单位的初始位置在地图的下方,想要到达地图的顶部.如果物体所能侦测到的地方( ...

  5. 有向图 寻路算法_第2部分探索寻路图算法

    有向图 寻路算法 旅游旅客 (Traveling tourist) In the first part of the series, we constructed a knowledge graph ...

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

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

  7. 游戏寻路算法的简单实现

    提到寻路算法,大家都会想到A*算法. 在度娘找了不少代码,看了不少教程之后,尤其是这个文章中提到的总结:http://www.cppblog.com/christanxw/archive/2006/0 ...

  8. 贪吃蛇AI算法中的A star寻路算法

    A*寻路算法 在之前的贪吃蛇游戏比赛里,计算蛇吃食物路径时要用到寻路算法,于是就去了解了一下,以下是我的算法演化过程. 1.简单寻路–按图索骥 我一开始想到的方法就是最简单的:目标在哪个方位就往哪个方 ...

  9. java 寻路算法_游戏中的寻路算法解析

    游戏角色的自动寻路,已经是游戏中一个历史比较悠久的领域,较为成熟也有很多种实现.这里摘录一句后面所提的参考资料中的描述:"业内AI开发者中有一句话:"寻路已不是问题."我 ...

最新文章

  1. 云原生 Serverless Database 使用体验
  2. 如果你有15M 你会投到那些项目上上面呢?机会-可行性模型帮助你
  3. 分片表怎么建表_经验放送!后端开发实战笔记之如何设计大数据量表结构
  4. SAP 电商云 Spartacus UI 的 urlParameter 配置原理
  5. how to create BRF application via code
  6. 泰晤士高等教育亚洲大学排行榜发布:清华登顶榜首
  7. Ubuntu 16.04安装NVIDIA驱动后循环登录问题
  8. opencv 任意角度旋转图像
  9. 利用Vivado封装DCP文件基本流程
  10. 电脑系统还原怎么操作?这个方法在电脑设置里就可以还原
  11. Shell脚本监控CPU、内存和硬盘利用率
  12. 框架-数据库定义MD5加密
  13. “互联网+创新2.0”、“工业制造4.0战略”、“工业互联网
  14. STM32CUDE-STM32F407学习笔记2-按键操作
  15. win10无法装载重装系统iso文件_Win10系统如何装载和弹出ISO镜像文件?
  16. 中国电信无线网服务器,中国电信网上营业厅
  17. 2019年春晚表情包
  18. Juniper SRX操作系统软件升级
  19. win10 无法连接打印机 报0x00000520错误解决办法!
  20. 简单的方法Android的数据恢复你的Andr​​oid手机

热门文章

  1. npm 报错: npm ERR! code ERESOLVE , npm ERR! code E404
  2. python夹角余弦雷达图_P19 从三角形夹角计算看math模块
  3. jq获得当前元素id
  4. android打开相机拍照及打开相册选择照片
  5. VB数组快速排序算法
  6. 一个API方式存取日志文件的模块[VB]
  7. SSH网上商城:回首网上商城
  8. 4个Shell小技巧,帮你提高机器学习生产效率
  9. 科大讯飞回应“同传造假”:承认转写人类同传,沟通不足造成误解
  10. 他实现了AlphaGo Zero的算法,发现可能还得训练1700年 | 代码