更新时间:2022-08-25 16:36
双向搜索算法是一种图的遍历算法,用于在有向图中搜索从一个顶点到另一个顶点的最短路径。算法同时运行两个搜索:一个从初始状态正向搜索,另一个从目标状态反向搜索,当两者在中间汇合时搜索停止。双向搜索的启发式函数可以定义为:正向搜索为到目标节点的距离,反向搜索为到初始节点的距离。
搜索是从初始状态开始寻找问题的一组可能解,并最终求得满意解的过程。双向搜索,在问题树中分别从初始状态和目标结点双向搜索,寻找最佳求解路线。在很多情况下该算法更快,假设搜索一棵分支因子b的树,初始节点到目标节点的距离为d,该算法的正向和反向搜索复杂度都是O() (大O符号),两者相加后远远小于普通的单项搜索算法(复杂度为O())。Ira Pohl (1971)第一个设计并实现了双向启发式搜索算法。Andrew Goldberg和其他人解释了双向搜索版的戴克斯特拉算法的正确完结条件。
单向搜索,在问题树中从初始状态出发向目标单方向搜索。广度优先搜索,按“最早产生的结点优先扩展”的原则来定义估计函数,即对问题树中的结点按层搜索。深度优先搜索,按“最晚产生的结点优先扩展”的原则来定义估计函数,即对问题树中的结点按一个分枝向下搜索,如无目标结点则返回并沿另一分枝搜索,直至找到目标结点为止。最佳优先搜索,根据估计函数对未扩展的结点全部进行估计,从中选出最佳结点扩展。
A*搜索算法,俗称A星算法。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中的NPC的移动计算,或网络游戏的BOT的移动计算上。
该算法综合了Best-First Search和Dijkstra算法的优点:在进行启发式搜索提高算法效率的同时,可以保证找到一条最优路径(基于评估函数)。
在此算法中,如果以 表示从起点到任意顶点 的实际距离,表示任意顶点 到目标顶点的估算距离(根据所采用的评估函数的不同而变化),那么A*算法的估算函数为:
这个公式遵循以下特性:
如果为0,即只计算任意顶点到目标的评估函数,而不计算起点到顶点 的距离,则算法转化为使用贪心策略的Best-First Search,速度最快,但可能得不出最优解;
如果 不高于顶点到目标顶点的实际距离,则一定可以求出最优解,而且 越小,需要计算的节点越多,算法效率越低,常见的评估函数有——欧几里得距离、曼哈顿距离、切比雪夫距离;
如果为0,即只需求出起点到任意顶点的最短路径 ,而不计算任何评估函数 ,则转化为单源最短路径问题,即Dijkstra算法,此时需要计算最多的定点;
算法中需要注意几点:路径中只有起始点没有其他任何点的时候,此时,起始节点和终止节点是同一点,最优路径为零。将节点定位起始节点用的时候这个点需耍被拿出表外,不能进行重复计算。
戴克斯特拉算法(Dijkstra's algorithm)由荷兰计算机科学家艾兹赫尔·戴克斯特拉在1956年提出。戴克斯特拉算法使用了广度优先搜索解决赋权有向图的单源最短路径问题。该算法存在很多变体;戴克斯特拉的原始版本找到两个顶点之间的最短路径,但是更常见的变体固定了一个顶点作为源节点然后找到该顶点到图中所有其它节点的最短路径,产生一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。举例来说,如果图中的顶点表示城市,而边上的权重表示城市间开车行经的距离,该算法可以用来找到两个城市之间的最短路径。
该算法的输入包含了一个有权重的有向图 G,以及G中的一个来源顶点 S。我们以 V 表示 G 中所有顶点的集合。每一个图中的边,都是两个顶点所形成的有序元素对。(u, v) 表示从顶点 u 到 v 有路径相连。我们以 E 表示G中所有边的集合,而边的权重则由权重函数 w: E → [0, ∞] 定义。因此,w(u, v) 就是从顶点 u 到顶点 v 的非负权重(weight)。边的权重可以想像成两个顶点之间的距离。任两点间路径的权重,就是该路径上所有边的权重总和。已知 V 中有顶点 s 及 t,Dijkstra 算法可以找到 s 到 t 的最低权重路径(例如,最短路径)。这个算法也可以在一个图中,找到从一个顶点 s 到任何其他顶点的最短路径。
最初的戴克斯特拉算法不采用最小优先级队列,时间复杂度是(其中 为图的顶点个数)。通过斐波那契堆实现的戴克斯特拉算法时间复杂度是(其中 是边数) (Fredman & Tarjan 1984)。对于不含负权的有向图,这是已知的最快的单源最短路径算法。
用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。算法具体的形式包括: