所谓Informed Search,就是带有智慧决策的搜索,就像它的名字一样,它是informed,消息灵通的,它能根据最新情况而重新选择搜索。Informed Search也可以叫Heuristic Search,启发式搜索。正如上一篇提到的机器人、汽车导航、打魔兽,这些都是运用了Heuristic的搜索。
何为Heuristic?Heuristic应该算一条引导你进入最佳选择的规则,它决定了状态空间中一个状态的质量,引导你每次都选择质量最好(或较好)的状态,一步步走向最佳方案。
Heuristic就是一种度量,它通过一个估价函数来表示。
f(n) = g(n) + h(n)
其中h(n)就是heuristic函数,g(n)是cost估算函数。g(n)表示从初始节点到当前节点所需的开销(例如可以用路径的长度/权来表示),而h(n)表示从当前节点到目标节点还剩的差距(有多种表示方法,比如可以用当前状态与目标状态Conflicts的个数来表示),g(n)和h(n)两者共同决定了f(n),即一个状态的质量/估价。有时为了区分g(n)和h(n)的权重,也可以在前面加上常系数,即表示为
f(n)=α*g(n) +β*h(n)
下面来介绍几种Informed Search算法
1. Best-First Search(BEST-FS)
这个应该算Informed Search中最基本的方法,基本思想如下
有一个OPEN List和一个CLOSED List,CLOSED List就是一个普通的队列,里面存放所有访问过的节点(也就是说这些节点不会被再次访问了),而OPEN List是一个优先队列,里面存放所有已访问过的节点的后继节点(即待访问的节点),OPEN List根据节点的f(n)值调整为最小堆。
(1)将初始节点插入OPEN List中
当OPEN List非空时
(2)从OPEN List出堆,放入CLOSED List中,如果该节点即为目标节点则算法结束(backtracking路径)
(3)扩展该节点的所有后继节点
对每一个后继节点,若后继节点不在CLOSED中,则把它插入OPEN List中
注意,这里同样每次扩展后继节点插入OPEN List前,要将后继节点的parent指针指向当前节点。每次节点插入OPEN List后,堆会根据f(n)值进行一次调整操作。
之前介绍过的Uniform-Cost Search(UCS)其实可以算Best-First Search的一种特例,其中f(n)=g(n),g(n)为到达当前节点的路径长度。Breadth-First Search(BFS)也是它的一个特例,其中f(n)=h(n),h(n)为距离目标节点的深度。Best-First Search可视为多种估价函数的组合搜索。
2. Beam Search
这个算法其实是Best-First Search的一个变体而已,由于Best-First Search算法中,每个节点的所有未曾出现过的后继节点都要被放入OPEN list中,随着深度的增加,空间开销势必会呈指数级膨胀。为了减少空间的开销,Beam Search限制了OPEN List的大小,它只保存好一些质量比较好的节点(f(n)值比较低的),而抛弃那些f(n)值较高的不太可能会是最佳方案的节点。这样做虽然大大提高了空间效率,但势必会有潜在的最佳方案由于当前f(n)值不理想而被丢弃了。所以说Beam Search算法是不完全的(Best-First Search是complete的),一般适用于大规模并且空间不充足的系统中。
3. A* Search(A-star Search)
A*算法是对Best-First Search的改良,Best-First Search虽然是完全的,但势必不是最优的。我们可以这样想,Best-First算法中,每次扩展出的后继节点只要不在CLOSED List