搜索算法广泛应用于人工智能领域,但是由于时间复杂度是指数级别,计算机科学家在朴素的搜索算法(广度优先,深度优先搜索)上优化得到了一系列搜索算法
本文介绍的搜索算法主要指:广度优先搜索,深度优先搜索,以及在此基础上优化得来的
A*算法,分支限界算法。如有错误欢迎指正。
为了便于描述,搜索算法适用解决在一张有权无向图中,找到从原点到终点的最短路径。
基础搜索算法的通式是这样的:
Wait_arr[]数组存放待扩展的节点。
初始化:把初始节点root加入到wait_arr[]数组中
While( wait_arr[]数组不为空 ){
从wait_arr[]数组中取出左边第一个节点n
把取出节点扩展出邻接子节点
For( 遍历筛选每个邻接子节点 ){
If( 子节点没有出现在path中 ),留下这个子节点,然后记录这个子节点的父亲是节点n
}
If( 还存在子节点 )
子节点加入到wait_arr[]中。
}
注:由于每个子节点都保留了它的父亲节点,所以很容易逆推出到达该子节点的路径path
深度优先与广度优先搜索的区别与联系:
深度优先和广度优先的区别,从上面的通式中可以解释为红字部分的不同:
深度优先搜索:邻接子节点加入wait_arr[]数组的最左边,所以每次扩展的节点都是新的节点。
广度优先搜索:邻接子节点加入wait_arr[]数组的最右边,所以每次扩展的节点都是老一辈的节点。
A*算法与朴素搜索算法的区别与联系:
A*算法实际上是模拟这么一个过程,在广场上,有一些遮挡物,人要从B点越过遮挡物到达出口E点,应该怎么做呢?人每一次可以选择向前,向后,向左,向右四种走法。但是人比较聪明,每一次选择自己记忆中直线距离离E点最近的那个方向迈步,如果不行再回溯试其他的方向。这就是A*算法。
A*算法和之前的朴素的搜索算法有什么区别和联系呢?
估价函数
f(n) = h(n) + g(n); 其中f(n)是代表当前节点n的估计代价,g(n)