优先队列BFS:对于更加普适性的情况,每次扩展都有各自不同的“代价”时,求最短路时,我们会有两个方法,一个是用一般的广搜,最坏情况下的复杂度为O(N^2)。或者是改用优先队列进行广搜,我们可以每次从队列中取出当前代价最小的状态进行扩展(该状态一定是最优的,因为队列中其他状态的当前代价都不小于它,所以以后就不可能在更新它了),沿着各条分支把到达的新状态加入优先队列。不断执行搜索,直到队列为空。在优先队列BFS中,每个状态也会被多次更新,多次进出队列,一个状态也可能以不同的代价在队列中同时存在,但每个状态从队列中取出时,就得到了从起始状态到该状态的最小代价,之后就可以直接忽略,所以优先队列每个状态只扩展一次,复杂度为O(NlogN).
双向BFS:就是从起始状态和目标状态两边轮流进行,每次各扩展一层,两个搜索相遇时,合并即可得出最小步数。
A*算法是对于BFS时,设计一个估价函数,以任意状态为输入,计算该状态到目标状态时所需要的最小代价的估值,不断取出“当前代价+未来估价”最小的状态进行扩展。相对于来说有一种更优的IDA*算法,在A*的基本思想下,以迭代加DFS的搜索框架为基础,把原来简单的深度限制加强为:若当前深度+未来估计步数>深度限制,则立即从当前分支回溯。效率比A*高,并且程序实现的难度低于A*算法。