先建模,再选择搜索边界
01 / 从一个故事开始
博物馆机器人寻找房间。若有门需要钥匙,只记录房间不够:同一房间里有钥匙和没钥匙,未来选择不同。记录房间与钥匙状态就修好了模型。机器人还保存未完成路线:队列先看近处,栈沿一条走廊深入,优先队列先看已花费最少的路线。先准确描述世界,再决定探索顺序,是两项不同工作。
02 / 理解原理
搜索问题包括初始状态、动作、转移规则、目标检查和路径代价。搜索节点还记录父节点与累计代价;同一状态可对应多条路线的不同节点。广度优先使用先进先出队列,在有限分支下找到最浅目标;步长代价相同时也最便宜。深度优先使用栈,边界内存小,却可能困在无限分支且一般不保证最优。深度限制可能漏掉更深目标。迭代加深重复增加限制,在有限分支下兼具深度优先存储与最浅目标完备性。
一致代价搜索取出累计代价最小节点,并在取出时检查目标;无限空间中的通常完备性保证要求每步代价至少为某个正数。
先认识这些词
- 状态
- 足以决定未来合法动作的信息。
- 搜索边界
- 已生成、等待探索的路线。
- 路径代价
- 一条路线全部步骤代价之和。
03 / 逐项读懂公式
g(n) = 到 n 路线上全部边代价之和 BFS:最小深度;DFS:当前最深;UCS:最小 g(n) 树搜索边界空间:BFS O(bᵈ),DFS O(bm),IDS O(bd)
g(n) 是到搜索节点 n 已支付代价,Σ 把路线全部边相加,不只是最后一边。b 是有限分支数,d 是最浅解深度,m 是最大搜索深度。内存界描述通常树搜索边界;图搜索已访问集合另占空间。展开次序不是最后路径。
04 / 先看一个完整例子
边 S→A 为1、A→G 为9、S→B 为4、B→G 为2。两个目标深度均为2,若先生成 A,广度优先可返回费用10的 S→A→G。一致代价依次取出 S、费用1的 A、费用4的 B,比较目标费用10与6,取出6后返回 S→B→G。父指针还原路线;展开顺序 S,A,B,G 本身不是合法路线。
一步步想清楚
状态为何包括钥匙?
它改变哪些门可打开。
一致代价为何在取出时验目标?
先生成目标可能比另一未完成路线贵。
展开列表是路径吗?
通常不是,须用父指针还原相连路线。
完整推导一道题 · 01
两条同深路线
有向边 S→A:2、A→G:8、S→B:3、B→G:2,无其他边。先生成 A。比较 BFS 与 UCS。
先选择方法
区分边数与边代价之和。
两路都两条边,BFS 可依给定顺序选 A 路线。
相加得 S-A-G 费用2+8=10,S-B-G 费用3+2=5。
UCS 取出费用2的 A、3的 B,再先取5的目标而非10。
解释最终答案
BFS 可返回10;UCS 返回 S-B-G,费用5。
检验推理
图只有这两条完整路线,5 是较小总数。
完整推导一道题 · 02
深度限制漏解
链 S→A→B→G 各边费用1,根深度0。先用限制2,再用迭代加深限制0、1、2、3。
先选择方法
先标深度,再判断限制内可到节点。
S、A、B、G 深度分别0、1、2、3。
限制2到 B,却不能访问深度3的目标。
限制0、1、2失败;限制3到 G 并还原三边路线。
解释最终答案
深度2搜索终止但无解;迭代加深在限制3找到费用3的解。
检验推理
图只有一条链,三条边不可省。
Leon 的进一步思考
代价改变算法选择
数边只在每边代价相等时给最便宜路线;代价不同时须比较累计和。
合并状态须有理由
只有未来动作与代价一致才能合并两次房间访问;剩余电量可像钥匙一样重要。
检查自己的理解: 广度优先何时像一致代价?
每步代价为相同正数且平局规则一致时,累计代价正比于深度,两者按相同层次展开。