搜索的优化方法
零、启发式测度函数是一种计算当前节点和目标距离的计算方法
一、爬山法:基本属于深度优先遍历+启发式测度函数,在每个搜索节点处找到离终点最近的节点,这种方法不能保证找到最优解,因为找到一个解就停止了(除非完全遍历所有节点,但这样爬山法剪枝就没意义了)。
二、Best-first:基本属于广度优先遍历+深度优先遍历+启发式测度函数,在全部节点中找到离终点最近的节点并发展该节点,将发展后的节点纳入考虑进行下一步搜索,这种方法也不能保证找到最优解,也是因为找到一个解就停止了(除非完全遍历所有节点,但这样Best-first剪枝也就没意义了)。
三、分支界限:本质上是一种优化剪枝方法,找到一个解后将这个解作为其他解的上界进行剪枝(这个上界如果找到更优解时需要更新),当找其他解的过程中代价已经超过这个上界就可以不用继续找下去了。
分支界限+爬山法、分支界限+Best-first这样结合使用可以即保留一、二的剪枝优化作用,也可以使其能找到最优解。
四、A*算法:需要定义f(n)、g(n)和h(n),f(n)=g(n)+h(n),g(n)是到达当前节点的实际代价,这是切实可以得到的,h(n)是当前节点到达目标节点的估计代价,这一点和一、二的启发式测度函数相同,实际上,如果不考虑g(n),也可以把Best-first的f(n)看作f(n)=h(n),这个条件下A可以说和“分支界限+Best-first”是一样的,因此A可以得到最优解,由于A提前考虑了g(n)(到达当前节点的代价),所以A可以比“分支界限+Best-first”更快地找到最优解,这一点和dijkstra算法可以说是有异曲同工之妙。