人工智能 - 搜索求解策略
搜索求解策略
- 盲目搜索和启发式搜索
- 所谓盲目搜索( blind search)是指在对特定问题不具有任何有关信息的条件下,按固定的步骤(依次或随机调用操作算子)进行的搜索,它能快速地调用一个操作算子。
- 所谓启发式搜索( heuristic search)则是考虑特定问题领域可应用的知识,动态地确定调用操作算子的步骤,优先选择较适合的操作算子,尽量减少不必要的搜索,以求尽快地到达结束状态,提高搜索效率。
- 盲目搜索中,由于没有可参考的信息,只要能匹配的操作算子都需运用,从而搜索出更多的状态,生成较大的状态空间显示图;
- 启发式搜索中,运用一些启发信息,只采用少量的操作算子,生成较小的状态空间显示图,就能搜索到一个解,但是每使用一个操作算子便需做更多的计算与判断。启发式搜索一般要优于盲目搜索,但不可过于追求更多的甚至完整的启发信息。
简单问题求解智能体算法
function SIMPLE PROBLEM SOLVING AGENT(percept) returns an action |
人工智能领域中,搜索求解算法可以应用在海量数据的搜索、计算中,假设有以下一张公路图:
解决最短路径问题
采用Graph Search
每个路径在每个阶段的前一步基础上加以扩展,在第三阶段时,最北部的Oradea已经陷入死循环。
采用Tree Search
function TREE-SEARCH(problem) returns a solution, or failure |
该 frontier(亦称open list): 一种数据结构, 用于存储所有的叶节点。
在 frontier上扩展节点的过程持续进行, 直到找到一个解、或没有其它状态可扩展。
无信息搜索(盲目搜索)
无信息搜索称作盲目搜索,意味着该搜索策略没有超出问题定义的状态以外的附加信息。
做的事情就是生成后继结点,并且区分是目标状态还是非目标状态。
- 宽度优先搜索
- 深度优先搜索
- 一致代价搜索
回溯法
算法用三张表来保存状态空间中的不同性质结点:
- 路径状态( path states)表PS
保存当前搜索路径上的状态。如果找到了目的,PS就是解路径上的状态有
序集。 - 新的路径状态( new path states)表NPS
新的路径状态表。它包含了等待搜索的状态,其后裔状态还未被搜索到,即未被
生成扩展。 - 不可解状态( no solvable states)表NSS
回溯是状态空间搜索的一个基本算法。各种图搜索算法,包括深度优先、宽度优先、最好优先搜索等,都有回溯的思想
- 用新的路径状态表(NPS)使算法能返回(回溯)到其中任一状态。
- 用不可解状态表(NSS)来避免算法重新搜索无解的路径。
- 在路径状态表(PS)中记录当前搜索路径的状态,当满足目的时可以将它作为结果返回。
- 为避免陷入死循环必须对新生成的子状态进行检查,看它是否在该三张表中。
递归性质
一致代价搜索
- 策略:拓展最低代价的未拓展结点。
- 实现:队列,按路径代价排序,最低优先。
function UNIFORM-FIRST-SEARCH(problem)returns a solution, or failure |
- 双向搜索
同时进行两个搜索,一个是从初始状态向后搜索,一个从目标向前搜索,当两者在中间相遇是停止。
为了避免“错过”,应当使用一种剩余距离的启发式估计来导向
评价无信息搜索
- 完备性:是否总能找到一个存在的解?
- 时间复杂性:花费多长时间找到这个解?
- 空间复杂性:需要多少内存?
- 最优性:是否总能找到最优的解?
有信息搜索(启发式搜索)
此类策略采用超出问题本身定义的、问题特有的知识,因此能够找到比无信息搜索更有效的解
定义一个评价函数
f(n)
,用于选择下一个节点定义一个启发式函数
h(n)
,是f
的一部分,实现前面提到的特有知识
最佳优先搜索
- 实现方法:与一致代价搜索相同,但是最佳优先搜索使用
f(n)
代替g(n)
来整理优先队列 - 特例
- 贪婪搜索
- A*搜索
example: 从Arad到Bucharest
- 具有启发式信息:每个城市到Bucharest的最短距离(右表)
- $h(n)$用于计算从结点n到最接近目标的估计代价
- $f(n)$就是$h(n)$
贪婪搜索
每一步都试图得到离最终目标结点距离最近的结点,却不考虑自己与这个结点的距离。
评价贪婪算法
- 每一步都试图得到离最终目标结点距离最近的结点,却不考虑自己与这个结点的距离。那么得出来的自然有可能不是最短距离。
$$
最差情况下时间复杂度: O(b^m)
$$
$$
空间复杂度:O(b^m)
$$
b - 分支因子
m - 搜索空间的最大深度
A*搜索
改进的贪婪算法,评价函数$f(n)$由两部分组成,一部分是本结点到下一步结点的代价$g(n)$,另一部分是从下一步结点到目标结点的距离$h(n)$:
$$
f(n) = g(n) + h(n)
$$
用A*算法解决上述路径问题:
迭代加深A*算法
- 是迭代加深 深度优先搜索算法的变种
- 借鉴了A*算法,使用启发式函数来评价叨叨目标的剩余代价
- 是一种深度优先搜索算法,内存使用率低于A*算法
- 不同:集中于探索最有希望的结点,因此不会搜索该结点的同层结点
迭代加深搜索之对比:
算法 | 区别 |
---|---|
迭代加深深度优先搜索算法 | 使用搜索深度作为每次迭代的截止值 |
迭代加深A*算法 | 使用信息更加丰富的评价函数 |
8数码难题的启发式
要用A*算法找到最短距离的解,需要一个启发式函数,通常有两个候选
$h_1=number \quad of \quad misplaced tiles(错位棋子个数)=8$
$h_2= total \quad Manhattan \quad distance(tiles \quad from \quad desired \quad locations)曼哈顿距离之和(每个棋子到目标的位置)= 3 + 1 + 2 + 2 + 2 + 3 + 3 +2 = 18$