基于李磊老师的讲课和ppt
首先,什么是搜索,按照李老师ppt上的解释:根据问题的实际情况不断寻找可利用的知识,构造出一条代价较少的推理路线,使问题得到圆满解决的过程称为搜索,即搜索需要完成两个任务,首先要找到一个解,其次这个解要尽量最优
按是否使用启发信息分为盲目搜索和启发式搜索
盲目搜索:按照预定的控制策略进行搜索,不利用专业知识,容易造成组合爆炸
启发式搜索:在搜索过程中利用专业知识的引导向着最有可能的方向搜索,有可能得不到最优解
按问题的表示方式分为状态空间搜索,与或树(问题规约)搜索
问题的状态空间表示:状态+操作符+状态空间
状态空间搜索基本概念:
扩展节点:在某一节点基础上产生后继节点的操作
Open表和Close表;前者存放未扩展节点,后者存放已扩展或待扩展节点
Visit数组:存放已经访问过的节点
状态空间的盲目搜索:BFS(1),DFS(1)
与传统的DFS,BFS区别在于BFS(1)DFS(1)只要找到目标定点算法就可以结束,并且DFS(1)可能是死循环,为了避免死循环有了有界深度优先搜索策略
估价函数与启发函数:估价函数 = 已付出的代价 + 启发函数
A算法(最好优先搜索):在图搜索算法中,如果能在搜索的每一步都利用估价函数f(n)=g(n)+h(n)对Open表中的节点进行排序,则该搜索算法为A算法
A算法在实现的过程中关键点在于需要对扩展节点的每一个子节点进行估价,然后放入open表,按估价从小到大排序,取出最优的一点
A*算法:在A算法上加上一些限制函数,实际上遇到的例子全是A*算法(如维基百科上的例子)
爬山搜索:是一种贪婪算法,效率最高,但是追去局部最优解而常常忽略了全局最优解
在估价函数中令已付出的代价为0即为A算法
等代价搜索(Dijkstra算法,在估价函数中令启发函数为0,因此为盲目搜索)
问题规约表示法:把复杂问题分解变换为较简单的子问题,通过子问题的求解得到原来问题的求解,但是只要有一个子问题无解,那么原问题就无解,
问题规约的与或树表示法:与树(分解),子节点全部可解时父节点可解,或树(等价代换)子节点只要有一个可解的时候父节点可解
本源问题:可以直接求出解的问题,也是规约的目标
解树:由可解节点组成,是问题求解的步骤,与或树盲目搜索就是不断寻找解树的过程(分为与或树深度优先搜索和与或树广度优先搜索,其区别在于求与或树的时候是按照DFS的顺序找可解节点还是按WFS的方式)
解树的代价:
》和代价:某一可解过程所有代价之和
》最大代价:某一可解过程从根节点到端节点所耗最大的代价
希望树:搜索过程中最有希望成为最优解树的树,与或树的启发式搜索就是不断选择修正希望树的过程,在这个过程中希望树是不断变化的
》下面是对常见算法的一些讨论(自李老师的ppt上直接截取的):
- f(n)=g(n),h(n)=0,g(n)为实际路径代价
等代价搜索 -- 效率不高,能得到最优解。
- f(n)=h(n),g(n)=0,
爬山搜索 -- 效率极高,往往陷入局部最优。
- f(n)=g(n)+h(n),g(n)>0,h(n)>0,
最好优先搜索 -- 但是设计估价函数时要充分考虑g(n)和h(n)的数量级要相当。否则当g(n)>>h(n)时,接近等代价搜索;h(n)>>g(n)时,接近贪婪搜索。
- f(n)=g(n)+h(n),g(n)>0,且g(n) ³ g*(n), h(n) £ h*(n)
A*算法 -- 为了兼顾搜索效率,在满足上述条件前提下,要尽可能取较大的h(n)值,尽可能提高搜索效率。
- f(n)=0,即g(n)=0,h(n)=0,
盲目搜索。