简单介绍一下非启发式搜索。
非启发式搜索是一种无信息搜索,一般只适用于求解比较简单的问题,通常是按预定的搜索策略进行搜索,而不会考虑到问题本身的特性(即就是不会利用问题本身的信息)。
常用的非启发式搜索有:
1,广度优先搜索(BFS)
BFS通常借用队列来完成。
主要代码思想为:
一张图G中(不一定是图,只要可以抽象成图的都可以)
1:初始节点S0开始入队并设访问标记 push(S0);visit(S0)=true;
2:只要队列不空 while(队列非空)
3:从队列中弹出一个节点 tem = pop();
4:检查是否为目标节点 if(tem == end) return
5:对tem节点进行扩展,将其未访问子节点一一入队,并加上已访问,然后重复此循环
所以,可以知道,BFS在对本层的节点没有全部入队之前,是不会对下一层的节点进行访问的,这就可能导致空间开销非常大,但一般速度较快。
2,深度优先搜索(DFS)
DFS通常借用递归来完成。
主要代码思想为:
一张图G中(不一定是图,只要可以抽象成图的都可以)
1:访问初始顶点S0 DFS(S0);
2:依次从S0的子节点出发,继续进行深度优先遍历
可知道,要找到目标解可能要递归好多层,导致DFS占内存少但速度较慢。
3,迭代加深搜索
为克服DFS易陷入无穷分支死循环(图中存在环)的问题,提出了有界DFS方法。其实质上是指定递归深度的DFS。即开始指定DFS n层,如果没找到目标解,则在DFS n+1层,直到找到目标
好处有
1.占内存少 ——————–本质是DFS。
3.时间效率不低 —————————–虽然存在重复搜索,但是第n层的搜索与n+1层的搜索相比是可忽略的。
从实际应用来看,迭代加深搜索的效果比较好,并不比BFS慢很多,但是空间复杂度却与DFS相同.
看一道题,会体会的更深迭代加深搜索