知情搜索

299 阅读6分钟

知情搜索

爬山法

该算法每次从当前位置的临近空间中选择一个最优解作为当前解,直到达到一个局部最优解。所以该算法也是一种简单的贪心算法。

  • 爬山法只考虑对剩余距离的估计,而忽略实际已经走过的距离。

  • 缺点: 做出决策的过程太过朴素简单(可以认为是启发式函数太过简单)

    启发式函数:可以帮助确定下一个要扩展的最优节点

image-20240130105655347

爬山者在A和B中做出选择,因为A更靠近目标,所以选择了A,然后忘记了B,但实际上A能否真的到达目标,这个就不能保证了。

最陡爬山法

这个是对爬山法的进一步改进。爬山法每次都是直接找一个比现在好的节点就前进,但是最陡爬山法会在多个比较好的节点中进行比较,选出最好的。

image-20240130110454102

爬山者面对的节点按照字母表顺序,那么先检查了节点D之后检查节点E,发现E得分更高,所以爬山法会选择节点E,而最陡爬山法会对比DEF,最后选择得分最高的F

山丘问题

一些情况下,爬山法会陷入一种局部最大值的状态,即就是对于现在的爬山者来说已经到达当前山峰的最大值,但是想要到达山顶(全局最大值)还需爬上另一个山顶。

image-20240202162755103

解决方法:回溯

平台问题

状态空间中存在一个相对平坦的区域,使得所有相邻状态都具有相同的值

image-20240202162950654

在这个区域内移动,目标函数的变化非常小,故当相邻区域内具有许多有相似值的点时,就会出现这个问题,

最好方法:通过多次应用相同的规则,尝试到达搜索空间的新区域以产生新的极端的值,并且最好同时应用多个规则,避免导致山脊问题的各种值

山脊问题

在这个问题中,不管向下往哪个方向移动,山脊上的任何一点都看起来像山峰顶点

image-20240202163818889

最佳优先搜索(Best First Search)

是一种启发式搜索算法,我们可以将它看作BFS的一种改进,在其基础上,用启发估价函数对讲要遍历到的每一个点进行估价,然后选择代价小的进行遍历,直到找到目标节点或者遍历完所有点。

虽然不能找到一条最短路径,但会比Dijkstra算法快很多

image-20240202174108481

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

image-20240202172055144

启发函数:从当前节点到目标节点的代价

评价函数:找下一个节点

不足之处:

  1. 不是最优的,比如

    image-20240202172651323

    image-20240202172909613

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

    image-20240202173239280

  3. 不完备,他可能沿着一条无限的路径走下去而不选择做出其他尝试,无法找到最佳路径

  4. 时间复杂度和空间复杂度都是O(b^m),其中,b是结点的分支因子数目,m是搜索空间的最大深度

集束搜索(Beam Search)

其实是最佳优先搜索算法的优化,使用启发式函数评估他检查的每个节点的能力,不过集束搜索只能在每个深度中发现前m个最符合条件的点,m是集束的宽度

在集束搜索中,探索通过搜索树逐层扩展,但是每层只有最好的 W 个节点才会得到扩展。W 被称为集束宽度(beam width)。

image-20240202182614518

找到最优解

分支定界法

分支:将一个问题不断细分为 若干子问题 , 之后逐个讨论子问题 ;

定界 : 分支很多的情况下 , 需要讨论的情况也随之增多 , 这里就需要定界 , 决定在什么时候不在进行分支 ;

满足 ① 得到最优解 , ② 根据现有条件可以排除最优解在该分支中 , 二者其一 , 就可以进行定界 ;

定界的作用是 剪掉没有讨论意义的分支 , 只讨论有意义的分支 ;

分支定界法不采用启发式估值!

image-20240202185417106

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

image-20240202185753649

在展开A之后,到B的距离是4,开销是14;到C的距离是11,开销是4。

明显选择C的代价更小但是距离长,但是这里我们选择C,这就是低估计启发值

image-20240202190046598

image-20240202190234779

采用动态规划的分支定界

如果两条或更多的路径到达一个公共节点,那么只有到达该公共节点且具有最小开销的路径才应该被存储(删除其他路径)。

高级搜索算法

约束满足搜索

image-20240202191128469

该拼图目的是将Blob移到垂直条的另一边

为了求解上述问题,一个相对盲目

的状态空间搜索算法可能需要 800 次移动,并且还需要大量的回溯过程。但如果Blob 在垂直条之上或之下的两行内(因此它们可以彼此通过),只需要81次。

在开始问题求解过程之前,额外花时间来尝试了解问题及其约束条件通常更好。

与或树

通过应用以下规则,在给定的树中找到解的路径。

如果满足以下条件,那么节点是可解的。

  • 它是一个终止节点(一个基元问题)。
  • 它是一个非终止节点,并且其后继节点都是可解的与(AND)节点。
  • 它是一个非终止节点,后继节点是或(OR)节点,在这些或节点中,至少有一个可解。

以下情况不可解:

  • 它是一个没有后继节点的非终止节点(没有运算符可应用的非基元问题)。
  • 它是一个非终止节点,后继节点是与(AND)节点,在这些与节点中,至少有一个不可解
  • 它是一个非终止节点,后继节点是或(OR)节点,并且这些或节点都是不可解的

image-20240202192849735

双向搜索

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

image-20240202193144401