A*算法(一)算法导言
作者:互联网
A*算法(一)算法导言
1. 问题场景
已知 起始点(start)和目标点(goal),移动一个简单的物体(object)看起来是容易的
而路径搜索是复杂的,为什么涉及到路径搜索就产生麻烦了?
考虑以下情况:
物体(unit)最初位于地图的底端并且尝试向顶部移动
物体扫描的 区域中(粉色部分) 没有任何东西显示它不能向上移动,因此它持续向上移动
在靠近顶部时,它探测到一个障碍物然后改变移动方向,然后它沿着U形障碍物找到它的红色的路径
相反的,一个路径搜索器(pathfinder)将会扫描一个 更大的区域(淡蓝色部分)
但是它能做到不让物体走向凹形障碍物,而找到一条 更短的路径(蓝色部分)
然而可以扩展一个运动算法
用于对付上图所示的障碍物或者避免制造凹形障碍
或者把凹形出口标识为危险的(只有当目的地在里面时才进去):
比起一直等到最后一刻才发现问题,而 路径搜索器 提前作出计划
不带路径搜索的运动(movement)可以在很多种情形下工作,同时可以扩展到更多的情形
但是路径搜索是一种更常用的解决更多问题的方法
2. 结点图
计算机科学教材中的路径搜索算法在数学视角的图上工作——由边联结起来的结点集合
一个基于图块(tile)拼接的游戏地图可以看成是一个图
每个图块是一个结点,并在每个图块之间画一条边
目前,会假设使用二维网格(grid)
后续,会讨论如何建立其他类型的图
许多路径搜索算法是基于任意(arbitrary)的图设计的,而不是基于网格(grid-based)的图
但可以找到一些能使用网格地图的特性的东西
3. 其他搜索算法
3.1 Dijkstra算法
Dijkstra算法 从物体所在的初始点开始,访问图中的结点
它 迭代检查 待检查结点集中的结点
并把 和该结点最靠近的尚未检查的结点 加入 待检查结点集
该结点集从初始结点向外扩展,直到到达目标结点
Dijkstra算法保证能找到一条从初始点到目标点的最短路径,只要所有的边都有一个非负的代价值
这里的“最短路径”不是指 绝对最短,因为经常会出现许多差不多短的路径
粉色的结点:初始点
紫色的结点:目标点
类菱形的有色区域(teal areas):Dijkstra算法扫描过的区域
在有色区域中,颜色最亮的是那些离 初始点 最远的
因而形成探测过程(exploration)的边境(frontier)
3.2 BFS算法
最佳优先搜索 (BFS,Best First Search)算法按照类似Dijkstra算法的流程运行
不同的是它能够评估(称为启发式的)任意结点到目标点的代价
与选择离初始点最近的结点不同的是,它选择离目标最近的结点
虽然BFS不能保证找到一条最短路径,但它比Dijkstra算法快的多
因为它用了一个启发式函数(heuristic function)快速地导向目标点
例如:
如果目标位于出发点的东方,BFS 将趋向于导向东方的路径
越黄的结点:越高的启发式值(移动到目标的代价高)
越黑的结点:越低的启发式值(移动到目标的代价低)
通过两张图片的比较,表明了与Dijkstra 算法相比,BFS运行得更快
3.3 存在障碍的情况
然而,这两个例子都仅仅是最简单的情况——地图中没有障碍物,最短路径是直线的
现在来考虑前边描述的凹型障碍物
-
Dijkstra算法运行得较慢,但确实能保证找到一条最短路径:
-
BFS算法 运行得较快,但是它找到的路径明显不是一条好的路径:
问题在于BFS是基于贪心策略的,它试图向目标移动尽管这不是正确的路径
由于它仅仅考虑到达目标的代价,而忽略了当前已花费的代价
于是尽管路径变得很长,它仍然继续走下去
3.4 取长补短
两种算法都有缺点,如果结合两者的优点岂不是爽歪歪?
1968年发明的A*算法就是把启发式方法,如BFS,和最短路径方法,如Dijsktra算法结合在一起的算法
不同的是,类似BFS的启发式方法经常给出一个近似解而不是保证最佳解
然而,尽管A* 基于无法保证最佳解的启发式方法,A* 却能保证找到一条最短路径
4. A*算法
A*算法 是 路径搜索 中最受欢迎的选择,因为它相当灵活,并且能用于多种多样的情形之中
和其它的图搜索算法一样,A* 算法潜在地 搜索图中一个很大的区域
和Dijkstra一样,A* 算法能用于 搜索最短路径
和BFS一样,A* 算法能用启发式函数 引导自己
在简单的情况中,它和BFS一样快
在凹型障碍物的例子中,A*找到一条和Dijkstra算法一样好的路径:
这是因为A* 算法把Dijkstra算法(靠近初始点的结点)和BFS算法(靠近目标点的结点)的信息块结合起来
在讨论A* 的标准术语中:
g(n):从 初始点 到任意结点n 的代价
h(n):从 结点n 到目标点 的启发式评估代价(heuristic estimated cost)
在上图中:
yellow(h):远离目标点的结点
teal(g):远离初始点的结点
当从初始点向目标点移动时,A*权衡这两者
每次进行主循环时,它检查f(n)最小的结点n,其中f(n)=g(n)+h(n)
谢谢!
标签:结点,路径,Dijkstra,BFS,算法,导言,启发式 来源: https://blog.csdn.net/qq_32618327/article/details/100071325