搜索求解策略

  • 盲目搜索和启发式搜索
    • 所谓盲目搜索( blind search)是指在对特定问题不具有任何有关信息的条件下,按固定的步骤(依次或随机调用操作算子)进行的搜索,它能快速地调用一个操作算子。
    • 所谓启发式搜索( heuristic search)则是考虑特定问题领域可应用的知识,动态地确定调用操作算子的步骤,优先选择较适合的操作算子,尽量减少不必要的搜索,以求尽快地到达结束状态,提高搜索效率。
    • 盲目搜索中,由于没有可参考的信息,只要能匹配的操作算子都需运用,从而搜索出更多的状态,生成较大的状态空间显示图;
    • 启发式搜索中,运用一些启发信息,只采用少量的操作算子,生成较小的状态空间显示图,就能搜索到一个解,但是每使用一个操作算子便需做更多的计算与判断。启发式搜索一般要优于盲目搜索,但不可过于追求更多的甚至完整的启发信息。

简单问题求解智能体算法

function SIMPLE PROBLEM SOLVING AGENT(percept) returns an action
persistent: seq , an action sequence, initially empty
state, some description of the current world state
goal, a goal, initially null
problem, a problem formulation
action, the most recent action, initially none
state ← UPDATE STATE state, percept
if seq is empty then
goal ← FORMULATE GOAL state
problem ← FORMULATE PROBLEM state, goal
seq ← SEARCH problem
if seq = failure then return a null action
action ← FIRST seq
seq ← REST seq
return action

人工智能领域中,搜索求解算法可以应用在海量数据的搜索、计算中,假设有以下一张公路图:

罗马尼亚部分公路图

解决最短路径问题

每个路径在每个阶段的前一步基础上加以扩展,在第三阶段时,最北部的Oradea已经陷入死循环。

function TREE-SEARCH(problem) returns a solution, or failure
initialize the frontier using the initial state of problem
loop do
if the frontier is empty then return failure
choose a leaf node and remove it from the frontier
if the node contains a goal state then return the corresponding solution
expand the chosen node, adding the resulting nodes to the frontier

该 frontier(亦称open list): 一种数据结构, 用于存储所有的叶节点

在 frontier上扩展节点的过程持续进行, 直到找到一个解、或没有其它状态可扩展。

无信息搜索(盲目搜索)

无信息搜索称作盲目搜索,意味着该搜索策略没有超出问题定义的状态以外的附加信息。

做的事情就是生成后继结点,并且区分是目标状态还是非目标状态。

  • 宽度优先搜索
  • 深度优先搜索
  • 一致代价搜索

回溯法

算法用三张表来保存状态空间中的不同性质结点:

  1. 路径状态( path states)表PS
    保存当前搜索路径上的状态。如果找到了目的,PS就是解路径上的状态有
    序集。
  2. 新的路径状态( new path states)表NPS
    新的路径状态表。它包含了等待搜索的状态,其后裔状态还未被搜索到,即未被
    生成扩展。
  3. 不可解状态( no solvable states)表NSS
  • 回溯是状态空间搜索的一个基本算法。各种图搜索算法,包括深度优先、宽度优先、最好优先搜索等,都有回溯的思想

    • 用新的路径状态表(NPS)使算法能返回(回溯)到其中任一状态。
    • 用不可解状态表(NSS)来避免算法重新搜索无解的路径。
    • 在路径状态表(PS)中记录当前搜索路径的状态,当满足目的时可以将它作为结果返回。
    • 为避免陷入死循环必须对新生成的子状态进行检查,看它是否在该三张表中。
  • 递归性质

一致代价搜索

  • 策略:拓展最低代价的未拓展结点。
  • 实现:队列,按路径代价排序,最低优先。
function UNIFORM-FIRST-SEARCH(problem)returns a solution, or failure
node ← a node with STate=problem.INITIAL-STATE, PATH-TEST=0
frontier ← a priority queue ordered by PATH-CoSt, with node as the only element
explored ← an empty set
loop do
if EMPTY? (frontier) then return failure
node ← POP(frontier) /*chooses the lowest-cost node in frontier */
if problem.GOAL-TEST(node.STATE) then return solution(node)
add node state to explored
for each action in problem.Actions(node.State) do
child ← child-NODE(problem, node, action)
if child.State is not in explored or frontier then
frontier INSerT(child, frontier)
else if child.STAtE is in frontier with higher PaTH-Cost then
replace that frontier node with child
  • 双向搜索

同时进行两个搜索,一个是从初始状态向后搜索,一个从目标向前搜索,当两者在中间相遇是停止。

为了避免“错过”,应当使用一种剩余距离的启发式估计来导向

评价无信息搜索

  • 完备性:是否总能找到一个存在的解?
  • 时间复杂性:花费多长时间找到这个解?
  • 空间复杂性:需要多少内存?
  • 最优性:是否总能找到最优的解?

有信息搜索(启发式搜索)

  • 此类策略采用超出问题本身定义的、问题特有的知识,因此能够找到比无信息搜索更有效的解

  • 定义一个评价函数f(n),用于选择下一个节点

  • 定义一个启发式函数h(n),是f的一部分,实现前面提到的特有知识

最佳优先搜索

  • 实现方法:与一致代价搜索相同,但是最佳优先搜索使用f(n)代替g(n)来整理优先队列
  • 特例
    • 贪婪搜索
    • A*搜索

example: 从Arad到Bucharest

  • 具有启发式信息:每个城市到Bucharest的最短距离(右表)
  • $h(n)$用于计算从结点n到最接近目标的估计代价
  • $f(n)$就是$h(n)$

贪婪搜索

每一步都试图得到离最终目标结点距离最近的结点,却不考虑自己与这个结点的距离

评价贪婪算法

  1. 每一步都试图得到离最终目标结点距离最近的结点,却不考虑自己与这个结点的距离。那么得出来的自然有可能不是最短距离。

$$
最差情况下时间复杂度: 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*算法
    • 不同:集中于探索最有希望的结点,因此不会搜索该结点的同层结点

迭代加深搜索之对比:

算法区别
迭代加深深度优先搜索算法使用搜索深度作为每次迭代的截止值
迭代加深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$

搜索代价