1.34k likes | 1.46k Views
AI: 问题求解. 基本理论与方法. 内容提要. 搜索的定义 具体问题的形式化 盲信 息搜索 有 信息搜索 / 启发式搜索 优化问题的搜索算法 联机 / 在线搜索. 搜索的定义. 三国华容道. 找出 : 一个移动序列,放出 曹操. 8. 2. 1. 1. 1. 2. 2. 2. 3. 3. 3. 4. 4. 4. 3. 4. 7. 5. 5. 5. 6. 6. 6. 7. 7. 7. 8. 8. 8. 5. 1. 6. 9. 9. 9. 10. 10. 10. 11. 11. 11.
E N D
AI: 问题求解 基本理论与方法
内容提要 • 搜索的定义 • 具体问题的形式化 • 盲信息搜索 • 有信息搜索/启发式搜索 • 优化问题的搜索算法 • 联机/在线搜索
三国华容道 找出: 一个移动序列,放出曹操
8 2 1 1 1 2 2 2 3 3 3 4 4 4 3 4 7 5 5 5 6 6 6 7 7 7 8 8 8 5 1 6 9 9 9 10 10 10 11 11 11 12 12 12 ? 13 13 13 15 14 14 15 15 14 类似游戏:数码(8,15,…, n2-1,…) Introduced in 1878 by Sam Loyd, who dubbed himself “America’s greatest puzzle-expert” .... =$1000
三国华容道 不同的初始布局
编程求解三国华容道 状态:每个“局面” 行动:可行的“移动” 实现问题:如何在计算机内表示“状态”和“行动”
1 2 3 定义一个“搜索”问题 S • State space S • Successor function: x S SUCCESSORS(x) 2S • Initial state s0 • Goal test: xS GOAL?(x) =T or F • Arc cost,路径耗散
State space S ==〉 State graph • 每个节点表示一个状态 • 弧及其两个端点表示后继函数 • 可能包括多个不连通的分量
搜索问题的“解” 解:从初始节点“I” 到任何目标节点“G”的一条路径(沿箭头方向) G 解是路径,可能存在多条从I到G的路径,最优解就是路径耗散(路径上cost之和)最小的路径 最短路径问题? I
搜索问题的“解” • 无解 • 解就是连通源点和目标点的路径 I G
构建好的状态空间 存在大量“不可达/违背约束”的状态!
1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 10 6 6 7 7 7 8 8 8 9 9 9 10 6 10 11 11 11 12 12 12 ? 13 13 13 14 15 14 14 15 15 n2-1 数码问题的状态空间 • 逆序值(每个数被逆序的次数之和)的奇偶性,将整个状态图分为两个不联通的分量 • 所以Sam Loyd不用担心他的钱被领走!!! 如何证明? n2 = 0 n3 = 0 n4 = 0 n5 = 0 n6 = 0 n7 = 1 n8 = 1 n9 = 1 n10 = 4 n11 = 0 n12 = 0 n13 = 0 n14 = 0 n15 = 0 逆序值 = 7
什么是“好的”状态空间 • 所有状态?所有“可达的”状态? • “不可达”状态的判断,在无解时非常重要! • 状态数目: 少,越少越好?最少?状态数目一般情形下,太多!(无法全部在计算机内表示出来<存储空间受限>,或者遍历一次<计算时间受限>) • 状态空间/状态图的设计和后继函数密切相关!
0.036 sec ~ 55 hours > 109 years 我们的搜索问题是寻找一个“状态”迁移的序列,为什么搜索状态空间大小个状态就一定可以完成搜索任务? 数码问题的搜索时间 8-puzzle 362,880 states 15-puzzle 2.09 x1013 states 24-puzzle 1025 states 100 millions states/sec
基准算法:搜索整个状态图 • 图的宽度优先搜索算法 • 生成树 Search tree
我们关心的搜索算法 空间大小/解的数量为N,则搜索过的部分是log(N)的多项式函数 • 仅仅搜索整个状态空间的一小部分 • 相同点:(与基准算法比) • 算法大框架 • 所有的解(可行+不可行)构成的集合 • 不同点: • 从状态图中选择的子集S不一样 • S构成的状态图(弧)不一样,后继函数
获得状态空间/状态图后,执行“搜索” • 8皇后问题和n2-1数码问题的求解方法的异同! • 8皇后问题,简单的解法就是在空棋盘上不停添加皇后,其解是“构造”出来,构造出一个状态,然后对状态进行目标测试,不同状态之间不迁移,相邻两次目标测试之间的“动作序列”是“后继函数”!(深度优先?) • n2-1数码问题,求解过程是从初态出发,不停地在不同状态之间迁移,直到到达目标状态
状态的解释 • 事物可能的抽象表示,关键属性上相同,不重要细节的影响可以忽略不计 • 比如棋盘的布局,棋子偏移1毫米,对布局/状态没有影响 • 状态空间是离散的,有限或者无限
后继函数的解释 • 数独求解器的例子。 • 每个状态可行的所有“行动”的集合 • 函数的返回值,行动的结果(后继状态)和行动的代价(cost) • 后继函数是算法设计的“关键”!最复杂的部分
路径耗散/代价 • 路径耗散/代价是沿着某条边/弧,转移到下一个状态,执行动作的代价(后继函数执行的代价),一般总是正数; • 数码问题,每移动一次,代价为1 • N皇后问题,每放置/撤回一个皇后,代价为1,从一个状态转移到下一个状态,花费的代价<=2N • 我们总是假设,任何一条边/弧的路径耗散/代价c总是大于等于某个正常数ε,即c>= ε >0 Why?
目标状态 • 可以是一个被精确定义的状态 • 可以是满足某些条件的状态 • 可以是满足某些条件的状态集合
搜索问题 • 状态/状态空间/状态图 • 后继函数/状态转移 • 目标状态 • 初始状态 • 路径耗散/代价 • 解 • 形式化搜索问题,设计算法求解
例子:8皇后问题 • 国际象棋棋盘上放置8个皇后,彼此间不能吃掉对方 正确的解 错误的解
形式化8皇后问题:方法一 • 状态,任何0,1,2,……,8个皇后在棋盘上时的布局代表一个状态 • 初始状态:0个皇后在棋盘上 • 目标测试/目标状态:8个皇后在棋盘上,彼此间不互吃 • 路径耗散:放置一个皇后,代价为1 • 后继函数:在一个空的格子上放置一个皇后,得到一个新状态 • 高度为9的64-叉树 ~ 64x63x...x57 ~ 3x1014 states
形式化8皇后问题:方法二 • 状态,任何0,1,2,……,8个皇后在棋盘左侧,且互不攻击时代表一个状态;所谓棋盘左侧互不攻击,就是前k列每列一个皇后,互不攻击; • 初始状态:0个皇后在棋盘上 • 目标测试/目标状态:8个皇后在棋盘上 • 路径耗散:放置一个皇后,代价为1 • 后继函数:在k+1列放置第k+1个皇后到一个不受攻击的位置 • 状态数目急剧减少! 2,057 states
N皇后问题 • “解”是一个状态,而非从初始态到目标状态的序列;这类搜索问题,一般称为“设计问题” • 上述形式化方法二是否能“简单”求解N皇后问题? • 8皇后 2057个状态 • 100皇后 1052个状态 • 能否有算法能快速求解N皇后问题? • 问题特点:很多个解,解的分布较好(较均匀)
路径规划问题 • 状态空间是什么?如何形式化? 禁止触碰障碍物
路径规划问题的形式化:方法一 • 网格化地图 • 令小网格边长为1,则对角线距离为√2
路径规划问题的形式化:方法一 • 最优解,仅仅是网格化的离散空间中的最优解 • 解释一个序列
扫描线 路径规划问题的形式化:方法二 • 假设垂直扫描线从左到右进行扫描; • 遇到障碍物的顶点(不妨设障碍物为多边形)则暂停,标记 • 标记方法:对两次暂停之间的被扫描区域染上不同的颜色 • 被障碍物割裂的扫描线获得不同颜色的区域
路径规划问题的形式化:方法二 • 每个染色区域用其重心点表示 • 每个重心点代表一个状态,获得状态空间
路径规划问题的形式化:方法二 • 后继函数:具有相邻边界线的色块之间互为后继 • 获得状态图 • 边/弧的路径耗散/代价为状态点之间的距离
路径规划问题的形式化:方法二 • 解为一条路径 • 路径需要通过特定的边界点 • 最优路径需要进一步优化和平滑
路径规划问题的形式化:方法三 • 取障碍物(不妨设为多边形)的顶点以及初始地点和目标地点构成图的顶点; • 对任何顶点,连接其可视顶点(没有被障碍物阻挡),获得后继函数 • 路径耗散/代价:边/弧的长度,顶点间的距离
路径规划问题的形式化:方法三 • 最优解是连续的
搜索与AI • AI系统中搜索无处不在 • 路径搜索与导航 • 打包/邮件分发 • 超大规模集成电路布局设计 • 蛋白质比对和折叠 • 制药 • 电脑游戏 • ……
状态图和搜索树 • 某些节点可能会被重复访问!!! State graph Search tree
8 8 2 2 8 2 7 3 3 4 4 7 7 3 4 1 1 1 5 5 6 6 5 6 8 2 8 4 3 4 7 8 2 2 3 4 7 3 7 1 5 6 5 1 6 5 1 6 搜索节点和状态 同样的状态,在树中可能有多个节点表示,我们先暂时认为“不同的节点代表不同的状态”,也就是说“节点”和“状态”暂时是同义词 如果状态允许被重复访问,则即使状态有限,搜索树也可能是无限的
父节点 8 2 3 4 7 状态 1 5 6 子节点 ... 搜索算法设计细节:节点数据结构 存储信息 Depth 3 Path-Cost 3 yes Expanded 节点N的Depth = 从根到N的路径长度 (根的深度为0)
8 2 8 4 3 4 7 8 8 2 2 2 3 3 7 3 4 7 4 7 1 5 6 5 1 6 5 1 6 5 1 6 搜索算法设计细节:节点扩展 • 节点N的扩展,包括的处理: • 评估状态/节点N的后继函数 • 对后继函数返回的所有状态,在搜索树上产生一个子节点 N • 节点产生 节点扩展
8 2 8 2 8 2 7 7 3 3 4 4 7 3 4 5 1 6 5 1 6 5 1 6 8 2 8 4 3 4 7 8 2 2 3 3 7 4 7 5 1 6 5 1 6 5 1 6 搜索算法设计细节:搜索树的边界 • 搜索树的边界:未被扩展的节点集合,可能在排队等待扩展! 注意与叶节点进行区别!!
搜索算法设计细节:搜索策略 • 搜索树的边界实际就是等待扩展的节点集合! • 等待扩展的节点用“优先队列”FRINGE来实现 • INSERT(node, FRINGE) • REMOVE(FRINGE) • 等待扩展节点的优先次序我们称之为“搜索策略”
搜索算法设计细节:算法框架(基准算法) • if (GOAL?(S0) ==T ) then return S0 • INSERT(S0, FRINGE) • Repeat: • if (empty(FRINGE)==T) then return failure • s REMOVE(FRINGE) • For every state s’ in SUCCESSORS(s) • If (GOAL?(s’) ==T ) then return path or goal state • INSERT(s’,FRINGE) 节点/状态扩展
度量算法求解问题的性能 • 完备性:问题有解时,算法能否保证返回一个解?问题无解时,算法能否保证返回failure? • 最优性:能否找到最优解?返回代价/路径耗散最小的路径? • 复杂性:算法需求的时间和内存 • 状态图的大小:初态和后继函数决定,影响因素:分支因子(后继的最大个数),最前目标状态的深度,路径的最大长度 • 时间复杂度:访问过的节点数目 • 空间复杂度:同时保存在内存中节点数目的最大值
我们研究搜索算法的目标 • 很多搜索问题是NP-hard,比如TSP,数码问题 • 因此,别期望能在多项式时间内(时间复杂度是问题规模的多项式函数)求解出问题的所有实例(instances),没有通用算法! • 没有免费的午餐 • 算法设计的意义:对每个instance/每类instances找到其最有效(尽可能高效)的求解算法
无信息搜索和有信息搜索的差异 Uninformed/Blind Informed/Heuristic Q:如何排序或者 判断优先扩展节点?