带信息的搜索是现实环境中常见的情况,它可以使得搜索更有效。带信息的搜索(Informed heuristi search)是指使用特定问题的知识去使得搜索更有效的策略。
其代表的方法是Best-First search, 其实质是tree-search或者graph-search算法,但在选择节点展开时使用估计函数f(n)来选择最小或最大值作展开。估计函数有很多,最重要的一个是称为heuristic function:
h(n) = 从节点n到目标的最短距离
而贪心best first search的估计函数就是f(n) = h(n)。 最著名的要算A*算法,它的估计函数是f(n)=g(n)+h(n), 其中g(n)是指从开始节点到节点n的真实值。 那么f(n)求得就是通过节点n到达目标的最小估计值。
h(n)是可接受的是指h(n)永远不会超过从n节点到目标的实际距离。 A*算法使用tree-search时, h(n)为可接受的是可以找到最优解,但使用graph-search时,还需要h(n)满足一致性的。
A*算法是全局的,所以当节点比较大时是很耗时。这时可以通过局部搜索算法:它是指只保存当前状态,每一步只移动到其相邻的状态的一类算法。优点是只使用少量的内存,同时对于无穷状态的问题能很快找到合适的答案。
这类算法有:
1)hill climbing(爬山)算法
该算法是根据每次从相邻状态中选出最好的状态,然后变化到该状态,直到找到局部最优解。
2)随机爬山算法
3)模拟退火算法
4)Local beam search
该算法一次保存k个状态,而不是保存一个,然后在每一步中选择下一次的k个状态
5)随机beam search
6) 遗传算法: 他是随机beam search的变种, 它的每一个后续状态不是由一个状态产生,而是由两个父母状态产生。