------ 本文是学习算法的笔记,《数据结构与算法之美》,极客时间的课程 ------
在魔兽世界之类的游戏中,有一个非常重要的功能,那就是人物角色自动寻路。当人物处于游戏地图中的某个位置的时候,我们用鼠标点击另外一个相对较远的位置,人物就会自动地绕过障碍物走过去。你有没有想过,这个功能是怎么实现的呢?
算法解析
实际上,这是一个非常典型的搜索问题。人物的起点就是他当下的位置,终点就是鼠标点击的位置。我们需要在地图中,找一条从起点到终点的路径。这条路径要绕过地图中所有障碍物,并且看起来要是一种非常聪明的走法。所谓“聪明”,笼统地解释就是,走的路不能太绕。理论上讲,最短路径显然是最聪明的走法,是这个问题的最优解。
不过,在地图软件如何计算出最优路径,我们也讲过,如果图非常大,那Dijkstra最短路径算法的执行耗时会很多。在真实的软件开发中,我们面对的是超级大的地图和海量寻路请求,算法的执行效率太低,这显然是无法接受的。
实际上,像出行路线规划,游戏寻路,这些真实软件开发中的问题,一般情况下,我闪都不需要非得求最优解(也就是最短路径)。在权衡路线规划质量和执行效率的情况下,我们只需要寻求一个次优解就足够了。那如何快速找出一条接近于最短路线的次优路线呢?
这就是我们今天要学习的 A 算法*。实际上,A* 算法是对Dijkstra算法的优化和改造。如何将Dijkstra算法改造成A* 算法呢?
Dijkstra算法有点儿类似BFS算法,它每次找到跟起点最近的顶点,往外扩展。这种往外扩展的,其实有些盲目。为什么这么说呢?举个例子来解释下。下面这个图对应一个真实的地图,每个顶点在地图中的位置,我们用一个二维坐标(x , y)来表示,其中,x表示横坐标,y表示纵坐标。