知情搜索
爬山法
该算法每次从当前位置的临近空间中选择一个最优解作为当前解,直到达到一个局部最优解。所以该算法也是一种简单的贪心算法。
-
爬山法只考虑对剩余距离的估计,而忽略实际已经走过的距离。
-
缺点: 做出决策的过程太过朴素简单(可以认为是启发式函数太过简单)
启发式函数:可以帮助确定下一个要扩展的最优节点

爬山者在A和B中做出选择,因为A更靠近目标,所以选择了A,然后忘记了B,但实际上A能否真的到达目标,这个就不能保证了。
最陡爬山法
这个是对爬山法的进一步改进。爬山法每次都是直接找一个比现在好的节点就前进,但是最陡爬山法会在多个比较好的节点中进行比较,选出最好的。

爬山者面对的节点按照字母表顺序,那么先检查了节点D之后检查节点E,发现E得分更高,所以爬山法会选择节点E,而最陡爬山法会对比DEF,最后选择得分最高的F
山丘问题
一些情况下,爬山法会陷入一种局部最大值的状态,即就是对于现在的爬山者来说已经到达当前山峰的最大值,但是想要到达山顶(全局最大值)还需爬上另一个山顶。

解决方法:回溯
平台问题
状态空间中存在一个相对平坦的区域,使得所有相邻状态都具有相同的值

在这个区域内移动,目标函数的变化非常小,故当相邻区域内具有许多有相似值的点时,就会出现这个问题,
最好方法:通过多次应用相同的规则,尝试到达搜索空间的新区域以产生新的极端的值,并且最好同时应用多个规则,避免导致山脊问题的各种值
山脊问题
在这个问题中,不管向下往哪个方向移动,山脊上的任何一点都看起来像山峰顶点

最佳优先搜索(Best First Search)
是一种启发式搜索算法,我们可以将它看作BFS的一种改进,在其基础上,用启发估价函数对讲要遍历到的每一个点进行估价,然后选择代价小的进行遍历,直到找到目标节点或者遍历完所有点。
虽然不能找到一条最短路径,但会比Dijkstra算法快很多

使最佳优先搜索只需16.6公里,比MapQuest给出的路线都少

启发函数:从当前节点到目标节点的代价
评价函数:找下一个节点
不足之处:
-
不是最优的,比如


-
启发函数代价最小化会对错误的起点比较敏感,比如

-
不完备,他可能沿着一条无限的路径走下去而不选择做出其他尝试,无法找到最佳路径
-
时间复杂度和空间复杂度都是O(b^m),其中,b是结点的分支因子数目,m是搜索空间的最大深度
集束搜索(Beam Search)
其实是最佳优先搜索算法的优化,使用启发式函数评估他检查的每个节点的能力,不过集束搜索只能在每个深度中发现前m个最符合条件的点,m是集束的宽度
在集束搜索中,探索通过搜索树逐层扩展,但是每层只有最好的 W 个节点才会得到扩展。W 被称为集束宽度(beam width)。

找到最优解
分支定界法
分支:将一个问题不断细分为 若干子问题 , 之后逐个讨论子问题 ;
定界 : 分支很多的情况下 , 需要讨论的情况也随之增多 , 这里就需要定界 , 决定在什么时候不在进行分支 ;
满足 ① 得到最优解 , ② 根据现有条件可以排除最优解在该分支中 , 二者其一 , 就可以进行定界 ;
定界的作用是 剪掉没有讨论意义的分支 , 只讨论有意义的分支 ;
分支定界法不采用启发式估值!

用低估计启发值的分支定界

在展开A之后,到B的距离是4,开销是14;到C的距离是11,开销是4。
明显选择C的代价更小但是距离长,但是这里我们选择C,这就是低估计启发值


采用动态规划的分支定界
如果两条或更多的路径到达一个公共节点,那么只有到达该公共节点且具有最小开销的路径才应该被存储(删除其他路径)。
高级搜索算法
约束满足搜索

该拼图目的是将Blob移到垂直条的另一边
为了求解上述问题,一个相对盲目
的状态空间搜索算法可能需要 800 次移动,并且还需要大量的回溯过程。但如果Blob 在垂直条之上或之下的两行内(因此它们可以彼此通过),只需要81次。
在开始问题求解过程之前,额外花时间来尝试了解问题及其约束条件通常更好。
与或树
通过应用以下规则,在给定的树中找到解的路径。
如果满足以下条件,那么节点是可解的。
- 它是一个终止节点(一个基元问题)。
- 它是一个非终止节点,并且其后继节点都是可解的与(AND)节点。
- 它是一个非终止节点,后继节点是或(OR)节点,在这些或节点中,至少有一个可解。
以下情况不可解:
- 它是一个没有后继节点的非终止节点(没有运算符可应用的非基元问题)。
- 它是一个非终止节点,后继节点是与(AND)节点,在这些与节点中,至少有一个不可解
- 它是一个非终止节点,后继节点是或(OR)节点,并且这些或节点都是不可解的

双向搜索
双向搜索(bidirectional search)的想法是在向前搜索目标状态的同时,从已知的目标状态向后搜索到起始状态,以找到解的路径。
