研究生课程:高级人工智能-第2讲 搜索

《高级人工智能》课程笔记:第2讲 搜索

第2讲 搜索

搜索问题:有策略有规律的探索

搜索问题是对原问题的建模

搜索问题的构成:状态空间➡后继函数(状态转化为另一个状态,采取的动作,付出的代价)➡初始状态和目标测试

解是一个行动序列,将初始状态转换成目标状态

例1:罗马尼亚旅行:

vqG77Q.md.png

  • ①状态空间:所有城市
  • ②后继函数:沿着道路从一个城市到达另外一个城市,损失函数是距离
  • ③初始状态:这个人现在在Arad
  • ④目标测试:目前是否到达了Bucharest

解:从Arad到Bucharest的最短路径

例2:吃豆子游戏

vqJwNj.png

状态空间包含了环境中的每一个细节:Agent,Ghost,大的豆子和小的豆子

搜索状态只保留行动需要的细节:

对于走到终点来说:

  • ①状态空间:Agent的位置信息
  • ②后继函数:四个方向进行行走,更新位置信息
  • ③目标测试:是否到达了终点

对于吃掉所有豆子来说:

  • ①状态空间:Agent的位置信息和每一个点的状态(豆子吃没吃掉)
  • ②后继函数:四个方向进行行走,更新位置信息,更新豆子的信息
  • ③目标测试:全部豆子是否都被吃光

状态数量计算:

  • Agent的状态:120
  • 食物数量:30
  • 鬼魂的位置:12*12
  • 朝向:4
  • 世界状态:
  • 路线规划状态:120
  • “吃光豆子”状态:

例3:三个传教士和三个野人

状态空间:{(M, C, B)},表示河左岸的传教士数量、野人数量和船目前的方位

后继函数:{P01, P10, P02, P20, P11, Q01, Q10, Q02, Q20, Q11},P表示现在是从左岸到右岸,后面两个数字表示船上的传教士数量和野人数量

初始状态:(3, 3, 1)

目标状态:(0, 0, 0)

状态空间图:搜索问题的数学表示,在状态空间图中,每个状态只出现一次

搜索树:

  • 根节点对应了初始状态
  • 子节点对应了父节点的后继
  • 节点显示状态,但对应的是到达这些状态的行动
  • 对大多数问题,实际上不会构建整个树,一般都会剪枝

状态空间图的每一个结点表示每一个状态

搜索树的每一个结点不表示状态,而是从初始状态到这个状态的一个路径(因此要尽量少构建搜索树的结点)

无信息搜索

基于搜索树的搜索:

  • 扩展出潜在的行动 (tree nodes)
  • 维护所考虑行动的边缘(fringe)节点
  • 试图扩展尽可能少的树节点

搜索算法特性:

  • 完备性: 当问题有解时,保证能找到一个解?
  • 最优性: 保证能找到最优解(最小耗散路径)?
  • 时间复杂度和空间复杂度?

所有搜索算法都是相同的,除了对边缘的处理策略

深度优先搜索

  • 在找到目标之前,搜索到整个树左侧的一些子树
  • 可以遍历整个树
  • 分支因子为,最大深度为时间复杂度为空间复杂度为(因为只保留了路径上的结点)
  • 完备性:不完备。如果无穷大,无法在可以接受的时间内找到解
  • 不是最优的:只去找最左边的结点

广度优先搜索

  • 在找到目标之前,搜索到全部更浅的结点
  • 分支因子为,最大深度为,解的深度为时间复杂度为空间复杂度为
  • 完备性:完备。因为如果解存在,一定是有限的
  • 只有所有的路径代价都相同时才是最优的

迭代深入搜索(Iterative Deepening)

结合DFS的空间优势与BFS的时间优势

深度优先按照层数进行约束,不要搜索到

通常绝大多数的节点都在底层,所以上层的节点生成多次影响不是很大

代价敏感搜索(Cost-Sensitive Search)

代价一致搜索(Uniform Cost Search):将之前的走过的路径的代价进行一个累加,然后寻找其代价最低的路径。

可以看成代价敏感搜索的一种实现。

  • 在找到目标之前,搜索到比代价最小的方式更小代价的结点
  • 解的代价为,每条结点间连线的代价大概为时间复杂度为,空间复杂度为
  • 完备性:完备。前提是代价都是有限且都为正数。
  • 最优的

启发式搜索

启发策略:估计一个状态到目标距离的函数,问题给予算法的额外信息,为特定搜索问题而设计。

贪婪搜索

策略:扩展你认为最接近目标状态的节点

启发式:对每个状态估计到最近目标的距离(曼哈顿距离或者欧氏距离),只使用启发函数来评价节点

通常情况下最佳优先使你直接(或很快)到达目标,最坏情况类似DFS

A* 搜索

结合代价一致搜索和贪婪搜索

重点搜索评价函数:

表示路径的代价,或者称为后向的代价

表示前方距离目标的距离,或者称为前向的代价

A* 搜索将两个代价进行组合

A* 搜索结束条件是目标出列的时候,而不是目标入列的时候,因为目标入列的时候可能路径并不是最优的。

A*搜索不一定是最优的,启发函数要好好选择

启发函数可采纳的,那么,其中是到最近目标的真实耗散。(例如曼哈顿距离)

前提:启发函数可采纳的,那么A* 树搜索是最优的。

  • 代价一致搜索在所有“方向”上等可能的扩展
  • A*搜索主要朝着目标扩展,而且能够保证最优性

对于解决难的搜索问题,大部分工作就是想出可采纳的启发函数。通常可采纳启发函数是松弛问题的解的耗散

A*图搜索与树搜索的区别在于图搜索不允许访问相同结点

图搜索中,如果启发函数是一致的,A* 搜索是最优的。

一致的:启发函数不仅仅要是可采纳的,同时在每一个局部的位置也要合理。

也就是:如果沿路径的节点估计耗散值单调递增,即,那么A*图搜索具备最优性。

通常,天然的可采纳启发函数是倾向于一致的,特别是从松弛问题中获得的启发函数

局部搜索

树搜索在边缘集合中保留未探索的替代路径(确保完备性)

局部搜索: 改进单一选项直到不能再改善为止

爬山法搜索

模拟退火搜索:避免局部极大(允许向山下移动)

遗传算法——自然选择

  • 基于适应度函数,在每步中保留N个最好状态
  • 配对杂交操作
  • 产生可选的变异

研究生课程:高级人工智能-第2讲 搜索
https://zhangzhao219.github.io/2022/09/08/UCAS/advanced-ai/advanced-ai-2/
作者
Zhang Zhao
发布于
2022年9月8日
许可协议