问题求解与搜索策略
-
状态空间的搜索策略
-
与或树的搜索策略
-
搜索的完备性和策略
人工智能的核心问题是【问题求解】,问题求解关键在于【问题表示】【解的搜索】
状态空间表示法:算符和状态(S,F,G)
求解过程转化为从初始节点到目标节点的路径问题:
- 必须要记录走过的点。CLOSED
- 必须要记录还可以走的点。OPEN
- 每一个子结点结构中必须要有指向父节点的指针
表中包含的项包括:状态节点和指针
状态空间搜索策略{ 盲目搜索:广度优先搜索、深度优先搜索启发式搜索:局部择优搜索、全局择优搜索、A∗算法状态空间搜索策略\begin{cases}盲目搜索:广度优先搜索、深度优先搜索\\启发式搜索:局部择优搜索、全局择优搜索、A*算法\end{cases}状态空间搜索策略{ 盲目搜索:广度优先搜索、深度优先搜索启发式搜索:局部择优搜索、全局择优搜索、A∗算法
- OPEN表:存放没走过的点;不同的搜索策略,结点的排列顺序是不一样的。
- CLOSED表:存放已经走过的点(已经扩展过的点)
- CLOSE表:存放将要扩展的点。(用可适用的算符对节点操作,生成一组子结点)
【搜索失败】:一直找不到目标节点;OPEN表中不再有可扩展的节点(叶子节点)。
【一般的搜索策略】:
- 把初始节点S0放入OPEN表,并建立目前只包含S0的图,记为G;
- 检查OPEN表是否为空,若为空则问题无解,退出;
- 把OPEN表的第1个节点取出放入CLOSE表,并计该节点为n;
- 考察节点n是否为目标节点。若是,则求得了问题的解,退出;否则执行5
- 考察节点n是否可以被扩展,扩展节点n,生成一组子节点。把其中不是节点n先辈的那些子节点,记做集合M,并把这些子节点作为节点n的子节点加入G中;
- 对于那些未曾在G中出现过的M成员设置–个指向父节点(即节点n)的指针,并把它们放入OPEN表(不在OPEN表 );
- 按某种搜索策略对OPEN表中的节点进行排序;
- 转第2步。
【说明】:
- 对于一个新生成的节点A父节点指针的问题,A有可能第一次生成的新节点,也有可能是之前执行过的节点生成过的,再由当前节点重新生成,那么A的父节点一般由原始节点到该节点的代价来决定,处于代价小的路途上的那个节点就作为该节点的父节点。
- 在搜索过程中,一旦某个被考察的节点是目标节点就得到了一个解。该解是由从初始节点到该目标节点路径上的算符构成。
- 如果在搜索中一直找不到目标节点,而且OPEN表中不再有可供扩展的节点,则搜索失败。
- 通过搜索得到的图称为搜索图,搜索图是状态空间图的一个子集。由搜索图中的所有节点及反向指针所构成的集合是一棵树,称为搜索树。根据搜索树可给出问题的解。
盲目搜索–不借用问题本身的经验信息,只用固定的搜索策略进行搜索
广度优先搜索
【基本思想】
- 从初始节点S0开始,逐层地对节点进行扩展并考察它是否为目标节点。在第n层的节点没有全部扩展并考察之前,不对第n+1层的节点进行扩展。
OPEN表中节点总是按进入的先后顺序排列,先进入的节点排在前面,后进入的排在后面。 - 扩展结点n(S0),将n的所有子节点放入OPEN表的尾部,为每一个子节点都配置指向父节点的指针。OPEN表相当与一个队列,按照深度优先遍历的顺序排列。
- 如果生成一个新的节点在OPEN表中已经出现过,就立即放弃这个点。
【优点】只要问题有解,用BFS总可以得到解,并且是路径最短的解
【缺点】盲目性很大,产生的无用节点很多,搜索效率很低
深度优先搜索
【基本思想】深度优先搜索与广度优先搜索的唯一区别是:广度优先搜索是将节点n的子节点放入到OPEN表的尾部,而深度优先搜索是把节点n的子节点放入到OPEN表的首部。
【问题】搜索一旦进入某一个分支,就会一直顺着这条分支找下去,万一该分支是无穷分支,那么就始终找不到解了。所以即使有解,也可能找不到解。
有界深度优先搜索
【基本思想】在深度优先搜索的基础上,引入深度的界限(dmd_md