再强的算法也找不到来时的路 —— A Star寻路算法


theme: channing-cyan

cover (1).png

一、前言

再强的算法也找不到来时的路, A Star寻路算法,助我穿越迷雾。

节点展开,扩展出路径的分支, 启发式评估,指引前行的方向。

从起点出发,逐步向目标前进, 估计最优路径,绕过障碍遥遥蓝天。

每一步决策,都基于代价和启发式, 在格子之间,我漫步寻找前程。

路途崎岖,坎坷而又不平坦, 我依靠A Star,寻得最短的路径线。

虽然不能回到最初的出发地, 但我已找到,通往目标的门径。

在未知的领域,A Star指引方向, 虽不能穿越时空,却为我引来光亮。

效果图如下: 在这里插入图片描述

二、什么是A Start

A*搜索算法是求出在一个二维平面中从起点到终点最低运算代价的算法,它可以算出A点B点的最短距离,也就是最优路径。常见的应有主要是在游戏中,人物的自动寻路;机器人探路;交通路线导航等。

三、原理和流程

2.1 前提

在讲述A Star算法之前,需要声明下列这些属性:

(1)从起点开始扩散的节点;

(2)最短距离计算公式:F = G + H;

(3)欧几里得距离计算公式:p = $\sqrt (x2 - x1)^2+(y2 - y1)^2$(其实就是勾股定理);

(4)OPENLIST 和 CLOSELIST;

上面的属性和公式不懂没关系,下面我会对他们一一进行详细介绍。非常简单!

2.1.1 从起点开始扩散的节点

我们在HTML页面上使用横和 竖画出来的格子。所谓扩散就是以 起点 为基点向四个放向进行扩散,这些扩展的节点就是可以走的“路”。如下图所示黄色的方格就是扩散的点: 在这里插入图片描述

A Star有四个方向八个方向的扩散。扩展四个方向的节点就是目前我们所说的;八个方向是还包含了,上左、上右、下左、下右四个方向的节点。我们通篇使用的是四个方向的扩展。

2.1.2 最短距离计算公式:F = G + H

如何在扩散的节点中找到最优也就是 最短 的一条路呢?就需要用到这个公式$:$ $$ F=G+H $$ 那么这个公式里面的属性都代表什么意识呢?下面我们就说明一下:

(1)G: 表示从起点到扩散的四个节点的距离,换句话说就是从起点到扩散的四个节点需要移动的格子。G的值可以使用欧几里得距离计算公式进行计算。 如下图: 在这里插入图片描述

(2)H:

表示从起点开始,到终点需要移动的格子(注意:忽略障碍物,可以从障碍物中穿过去),这个距离需要通过 欧几里得距离计算公式 公式算出来。当然你没必要一定要使用欧几里得距离计算公式,你还可以单纯的将起点终点的x报坐标差值和y坐标差值进行相加即可。 如下图: 在这里插入图片描述 (3)F: $ F = G + H $

在扩散节点中F的值最小的就是我们需要走的节点。也就是最短的路径。

2.1.3 欧几里得距离计算公式

这个公式是用来计算HG的。公式: $$ p = \sqrt(x2 - x1)^2+(y2 - y1)^2 $$ 其实就是终点的x坐标减去起点的x坐标的平方 + 终点的y坐标减去起点的y坐标的平方 开根号,这不就是勾股定理嘛。

2.1.4 OPENLIST 和 CLOSELIST

OPENLISTCLOSELIST代表两个“容器”(“容器”在代码中就是两个集合,使用List集合或者数组声明都可以)。这个两个“容器”存放的内容和作用如下:

(1)OPENLIST 用于存储扩散的节点。刚开始由起点开始向四个方向扩散的节点就需要放到OPENLIST集合中(如果扩散的节点是障碍物或者是在CLOSELIST中已经存在则不放入)。OPENLIST是主要遍历的集合,计算F值的节点都是来自这个集合。

(2)CLOSELIST 用于存储起点障碍物节点走过的点。在扩散节点的时候,需要到CLOSELIST集合中去检查,如果扩散的节点D已经在CLOSELIST集合中了(根据坐标进行判断),或者是D节点是障碍物那么就跳过此节点。走过的点也需要放到CLOSELIST中去。 走过的点如下图所示: 在这里插入图片描述

2.2 流程

2.2.1 第一步:扩散

从起点开始向上下左右扩散四个节点。假如起点的坐标为(x:3,y:2),那么四个节点为:上(x:2,y:2)、下(x:4,y:2)、左(x:3,y:1)、右(x:3,y:3)

2.2.2 第二步:检查节点

遍历CLOSELIST集合,判断扩散的这四个节点是否存在于CLOSELIST或者OPENLIST中,如果不存在放到OPENLIST中,反之跳过该节点。如果该节点是障碍物也需要跳过。

2.2.3 第三步:计算F的值

遍历OPENLIST集合,并计算集合中节点的F的值,找出F值为最小的节点(距离最近)minNode,这个节点就是要走的节点。然后把除了mindNode之外的其它扩散的节点放入到CLOSELIST中。

2.2.4 第四步:改变起点的位置

通过第三步我们找到了F值最小的一个节点minNode,那么就把起点等于minNode。然后继续进行扩散重复上面的四个步骤,直至在扩散的节点中包含终点我们走过的节点就是最短路径。

3.A Star算法代码实现

jcode

Java代码我就不放出来了,如果想要的可以评论区留言。下面是用JS写的。写的不好的地方大家指出,我会即时更正!

HTML:

```html

寻路02

JS:

```javascript

`` 上面代码有个**BUG**留给大家了,在随机生成障碍物时会出现死路`,就是在起点周围全部都是障碍物导致无法寻路到终点,那么怎么办呢?我上篇文章中写到 洪水填充算法 —— 密恐可以解决,留给大家思考啦~

4. 结语

A Star扩散四个方向的算法就这些。如果有时间可以把扩散八个方向的总结一下。写这篇文章我想向大家提供的是A Star算法的过程与实现的思路,但是如果想要真正运用还需要考虑很多东西,要贴合自己的场景。上面的代码还有问题。希望大家指出来,我会及时更正。还有什么不懂的可以在评论区讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是江迪呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值