A*算法(一)算法导言

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_32618327/article/details/100071325


1. 问题场景

已知 起始点(start)和目标点(goal),移动一个简单的物体(object)看起来是容易的
而路径搜索是复杂的,为什么涉及到路径搜索就产生麻烦了?
考虑以下情况:
物体(unit)最初位于地图的底端并且尝试向顶部移动
在这里插入图片描述

物体扫描的 区域中(粉色部分) 没有任何东西显示它不能向上移动,因此它持续向上移动
在靠近顶部时,它探测到一个障碍物然后改变移动方向,然后它沿着U形障碍物找到它的红色的路径
相反的,一个路径搜索器(pathfinder)将会扫描一个 更大的区域(淡蓝色部分)
但是它能做到不让物体走向凹形障碍物,而找到一条 更短的路径(蓝色部分)

然而可以扩展一个运动算法
用于对付上图所示的障碍物或者避免制造凹形障碍
或者把凹形出口标识为危险的(只有当目的地在里面时才进去):
在这里插入图片描述
比起一直等到最后一刻才发现问题,而 路径搜索器 提前作出计划

不带路径搜索的运动(movement)可以在很多种情形下工作,同时可以扩展到更多的情形
但是路径搜索是一种更常用的解决更多问题的方法


2. 结点图

计算机科学教材中的路径搜索算法在数学视角的图上工作——由边联结起来的结点集合
一个基于图块(tile)拼接的游戏地图可以看成是一个图
每个图块是一个结点,并在每个图块之间画一条边
在这里插入图片描述
目前,会假设使用二维网格(grid
后续,会讨论如何建立其他类型的图

许多路径搜索算法是基于任意(arbitrary)的图设计的,而不是基于网格(grid-based)的图
但可以找到一些能使用网格地图的特性的东西


3. 其他搜索算法

3.1 Dijkstra算法

Dijkstra算法 从物体所在的初始点开始,访问图中的结点
它 迭代检查 待检查结点集中的结点
并把 和该结点最靠近的尚未检查的结点 加入 待检查结点集
该结点集从初始结点向外扩展,直到到达目标结点

Dijkstra算法保证能找到一条从初始点到目标点的最短路径,只要所有的边都有一个非负的代价值
这里的“最短路径”不是指 绝对最短,因为经常会出现许多差不多短的路径

Dijkstra
粉色的结点:初始点
紫色的结点:目标点
类菱形的有色区域(teal areas):Dijkstra算法扫描过的区域
在有色区域中,颜色最亮的是那些离 初始点 最远的
因而形成探测过程(exploration)的边境(frontier


3.2 BFS算法

最佳优先搜索 (BFS,Best First Search)算法按照类似Dijkstra算法的流程运行
不同的是它能够评估(称为启发式的)任意结点到目标点的代价

与选择离初始点最近的结点不同的是,它选择离目标最近的结点

虽然BFS不能保证找到一条最短路径,但它比Dijkstra算法快的多
因为它用了一个启发式函数heuristic function)快速地导向目标点
例如:
如果目标位于出发点的东方,BFS 将趋向于导向东方的路径

best-first-search
越黄的结点:越高的启发式值(移动到目标的代价高)
越黑的结点:越低的启发式值(移动到目标的代价低)
通过两张图片的比较,表明了与Dijkstra 算法相比,BFS运行得更快


3.3 存在障碍的情况

然而,这两个例子都仅仅是最简单的情况——地图中没有障碍物,最短路径是直线的
现在来考虑前边描述的凹型障碍物

  • Dijkstra算法运行得较慢,但确实能保证找到一条最短路径:
    dijkstra-trap

  • BFS算法 运行得较快,但是它找到的路径明显不是一条好的路径:
    best-first-search-trap

问题在于BFS是基于贪心策略的,它试图向目标移动尽管这不是正确的路径
由于它仅仅考虑到达目标的代价,而忽略了当前已花费的代价
于是尽管路径变得很长,它仍然继续走下去


3.4 取长补短

两种算法都有缺点,如果结合两者的优点岂不是爽歪歪?
1968年发明的A*算法就是把启发式方法,如BFS,和最短路径方法,如Dijsktra算法结合在一起的算法

不同的是,类似BFS的启发式方法经常给出一个近似解而不是保证最佳解
然而,尽管A* 基于无法保证最佳解的启发式方法,A* 却能保证找到一条最短路径


4. A*算法

A*算法路径搜索 中最受欢迎的选择,因为它相当灵活,并且能用于多种多样的情形之中

和其它的图搜索算法一样,A* 算法潜在地 搜索图中一个很大的区域
和Dijkstra一样,A* 算法能用于 搜索最短路径
和BFS一样,A* 算法能用启发式函数 引导自己

在简单的情况中,它和BFS一样快

a-star
在凹型障碍物的例子中,A*找到一条和Dijkstra算法一样好的路径:

a-star-trap
这是因为A* 算法把Dijkstra算法(靠近初始点的结点)和BFS算法(靠近目标点的结点)的信息块结合起来

在讨论A* 的标准术语中:
g ( n ) g(n) :从 初始点 到任意结点n 的代价
h ( n ) h(n) :从 结点n 到目标点 的启发式评估代价(heuristic estimated cost

在上图中:
y e l l o w ( h ) yellow(h) :远离目标点的结点
t e a l ( g ) teal(g) :远离初始点的结点

当从初始点向目标点移动时,A*权衡这两者
每次进行主循环时,它检查 f ( n ) f(n) 最小的结点n,其中 f ( n ) = g ( n ) + h ( n ) f(n) = g(n) + h(n)


参考:
《 Amit’s A star Page 》


谢谢!

猜你喜欢

转载自blog.csdn.net/qq_32618327/article/details/100071325