书:人工智能第2版
有需要电子版的可以私信我。
这次先简要介绍启发法与前面的盲目搜索的区别,然后讲爬山法、最佳优先搜索、集束搜索。
引言
第二章的盲目搜索,对解决Nim、井字游戏是适用的。但是对于跳棋、国际象棋这种拥有巨大搜索空间的游戏,就难以适配了。例如前面学的DFS和BFS,在最坏的情况下,时间复杂度都是指数级别的(相对于节点)。
所以我们需要采用启发法的搜索算法,引导程序前进。
这次先学习3个“从不回头”的算法:爬山(hill)、最佳优先搜索(best-first search)、集束搜索(beam search)。
爬山法
爬山法不存储历史记录,也没有能力从错误中或错误路径中恢复。
对于一个爬山者,他只有一个高度计来指示目前所在高度,他每到一个点,必须做出选择,选择的方式就从候选节点中,选择高的那个。看下面的图:
爬山者在A和B中做出选择,因为A更靠近目标,所以选择了A,然后忘记了B,但实际上A能否真的到达目标,这个就不能保证了。
最陡爬山法
这个是对爬山法的进一步改进。爬山法每次都是直接找一个比现在好的节点就前进,但是最陡爬山法会在多个比较好的节点中进行比较,选出最好的。
用书中给的例子来解释吧。
书中对这个例子的解释有点看不太懂,我就按我自己的理解来解释吧。
在程序中,假设搜索的方式是按字母顺序来的。
爬山法:先搜索A和B,发现B更小,就选择了B,然后去了C,接着对比D和E,选择了E。
最陡爬山法:先搜索A、B、C,然后选择了C,接着搜索D、E、F,然后选择了F。
(这里爬山法为什么能选了B之后再去C,其实我也持怀疑态度,但是书中这里好像就是这么写的,它的本意可能是想说明第一次选择时,爬山法选了B而不是C,但最陡爬山法选了C,然后假设两种算法都选了C,那么下一步是怎么选的。可能是这么回事吧,有人看懂的麻烦纠正一下。)
爬山法的问题
爬山法和最陡爬山法都有三个问题(个人感觉就是一个问题),分别是山麓问题、高原问题、山脊问题。见下图:
山麓问题:找了个小的峰,知道最大的峰在那里,但是永远到不了,因为它和现在这个位置之间有一个很低的谷。根据爬山法的搜索选择方式,不可能往低的地方走,所以到不了。
高原问题、山脊问题:这两个总感觉和前面那个一样的,我就不解释了。
一句话:陷入了局部最优解。
最佳优先搜索
这个搜索方法可以补救爬山法的问题,它是目前第一个智能搜索算法。
先明确两个定义:
开放节点:搜索边缘上的节点,以后可能要进一步探索到。
封闭节点:不再探索的节点,将形成解得基础。
最佳优先搜索:开放列表中的开放节点按接近目标的估计值进行排列。每次搜索,考虑开放列表中最优希望的点,这样反复选择最优的进行探索。
看伪代码和图例可能会好理解些:
集束搜索
大白话就是,每层选择都是选择最优的W个,而不是1个。W叫集束宽度。
下图是W=2的示例图。
集束搜索降低了广度优先搜索的内存开销(从指数降低到线性),但是,如果W太小,可能会是去潜在的解。
这次就到这里了,可以点个赞吗?