ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

人工智能期末复习习题集:知识表示、归结推理与搜索策略精讲

人工智能期末复习习题集:知识表示、归结推理与搜索策略精讲

简介:这份人工智能经典习题集及各章总结,面向高校学生与备考期末的学习者,帮助系统梳理人工智能理论体系并强化解题能力。资源以doc文档形式呈现,共1个文件,压缩包约2.19MB,内容按章节组织,涵盖绪论、知识表示、推理等模块,每章配有小结与习题解答。已有100人学习,适合需要集中复习、查漏补缺的读者。文档中收录了人工智能发展五阶段、符号主义与连接主义等学派划分、问题求解与专家系统等研究领域,以及产生式规则、框架表示法、语义网络等知识表示方法;推理部分则通过盗窃犯归结演绎、旅行商最短路线等典型例题,展示谓词公式转化与归结过程。读者可借助各章小结快速建立知识框架,再通过习题解答理解推理步骤与答题规范,从而在考试中更从容地应对概念辨析与综合应用题。

1. 从一份习题集拆起:人工智能期末复习到底该刷什么

期末前两周,图书馆里最常见的一幕是:课件翻了三遍,概念还是散的;真题做了一套,归结反演写一半就卡住;搜索树画到第三层,自己都不知道 OPEN 表和 CLOSED 表该谁先动。这份《人工智能经典习题集及各章总结》就是冲着这个场景来的——它不是教材,也不是科普读物,而是一份按章节组织、带完整解答过程的复习资料,覆盖绪论、知识表示、推理、搜索策略四大块,每章前面有小结,后面跟习题解答,答案写到能直接抄步骤的程度。

它适合两类人:一类是期末需要快速把零散知识点串成答题模板的学生,另一类是已经工作、想回头补一补经典 AI 理论底子的开发者。如果你指望它讲深度学习调参或者大模型微调,那方向不对;但如果你需要把归结演绎推理、代价树搜索、与或树求解这些“考试必考、工作里偶尔撞见”的东西重新捋顺,这份材料的密度是够的。下面按“它到底包含什么 → 每类题怎么下手 → 容易在哪翻车 → 怎么用得更狠”的顺序拆开说。

2. 知识表示与归结推理:从谓词公式到子句集的完整链路

2.1 谓词表示法的落地写法

知识表示这一章的核心不是背定义,而是学会把一句自然语言翻译成谓词公式,再化成子句集。资料里给了两个典型题:一个是“兄弟同父”推理,一个是“盗窃犯”归结。两题的共同套路是——先定义谓词,再用连接词组织,最后消去量词得到子句。

以“任何兄弟都有同一个父亲”为例,标准写法是:

% 谓词定义 % Father(x,y): x 是 y 的父亲 % Brother(x,y): x 和 y 是兄弟 % 原始公式 % (∀x)(∀y)(∀z)(Brother(x,y) ∧ Father(z,x) → Father(z,y)) % 化成子句集后 % ¬Brother(x,y) ∨ ¬Father(z,x) ∨ Father(z,y)

逻辑说明:蕴含式 A→B 等价于 ¬A∨B,这是化成子句的第一步。参数说明:x、y 是兄弟关系中的两个人,z 是父亲变量,三个变量在子句中的绑定顺序会影响后续归结时的置换选择。很多人在这里翻车,是因为忘了量词消去的顺序——全称量词直接去掉,存在量词要用 Skolem 函数替换,资料里的题恰好只涉及全称量词,所以看起来简单,但考试一旦混入存在量词,不熟悉 Skolem 化就会卡住。

2.2 归结反演的步骤拆解

归结演绎推理的答题流程,资料里给得很清楚,我按自己的习惯重新排一遍,方便直接套:

第一步,把已知条件全部写成谓词公式,化成子句集 S1。第二步,把待求证的问题取否定,与 ANSWER 谓词做析取,化成子句集 S2。第三步,合并 S1 和 S2,列出所有子句并编号。第四步,两两归结,每次归结标注来源子句和置换。第五步,归结出 ANSWER(某常量),该常量就是答案。

以“盗窃犯”题为例,五个侦察员的话化成六条子句后,关键归结路径是:

% 子句列表 % (1) P(zhao) ∨ P(qian) % (2) P(qian) ∨ P(sun) % (3) P(sun) ∨ P(li) % (4) ¬P(zhao) ∨ ¬P(sun) % (5) ¬P(qian) ∨ ¬P(li) % (6) ¬P(y) ∨ ANSWER(y) % 归结过程(部分) % (7) P(qian) ∨ ¬P(sun) 由(1)和(4)归结 % (13) P(qian) 由(2)和(7)归结 % (15) ANSWER(qian) 由(6)和(13)归结,σ={qian/y}

逻辑说明:每次归结都是找一对互补文字,消去后合并剩余文字。参数说明:σ 是置换,表示变量 y 被绑定为 qian。这里最容易出错的地方是归结顺序——先归结哪两条子句没有强制要求,但不同的顺序会导致中间子句数量差异很大。我的习惯是优先归结含目标谓词否定的子句,这样能更快逼近 ANSWER。

2.3 语义网络与框架表示:画图题的评分点

资料里还有语义网络表示“两校篮球队比赛比分”的题。这类题看起来是画图,实际上评分点很固定:节点表示实体或概念,弧线表示关系,关系标签必须写清楚。比如“神州大学”和“东方大学”是两个节点,“比赛”是一个事件节点,比分 85:89 作为属性挂在事件节点上。框架表示法则要注意槽和侧面的层级——一个框架可以有多个槽,每个槽可以有多个侧面,每个侧面可以有多个值。答题时把槽名写全,侧面值不要漏,基本就能拿分。

3. 搜索策略:代价树、与或树和博弈树的答题模板

3.1 代价树广度优先与深度优先的分水岭

搜索策略这一章,资料里反复出现的一类题是:给一张城市交通图,求最小费用路径。解题第一步永远是“把图转成代价树”,第二步才是选搜索策略。代价树的广度优先搜索(也叫代价一致搜索)每次从 OPEN 表中取代价最小的节点扩展,能保证最优解;代价树的深度优先搜索每次沿一条路走到底,不一定最优,甚至可能不完备。

以资料中五城市交通图为例,广度优先的扩展顺序是:

初始:OPEN = {A(0)} 扩展 A:OPEN = {C1(5), B1(7)} 扩展 C1:OPEN = {B1(7), D1(11)} 扩展 B1:OPEN = {D1(11), D2(12)} 扩展 D1:OPEN = {D2(12), E2(19)} 扩展 D2:OPEN = {E2(19), E1(21)} 扩展 E2:到达目标 E,路径 A→C→D→E,代价 19

参数说明:括号内数字是从起点到该节点的累计代价 g(x)。广度优先的关键操作是“每次扩展后对 OPEN 表按 g 值重新排序”,这一步漏了,整个搜索就退化成普通广度优先,答案会错。深度优先则相反,子节点按代价从小到大压栈,每次取栈顶,资料里特别标注了“该题两种方法结果相同只是巧合”,这个提醒很实在——考试里经常故意设计成结果不同,让你判断哪种策略更优。

3.2 与或树的可解性判断与解树提取

与或树的题,核心就两件事:判断根节点是否可解,以及找出解树。可解节点的定义资料里写得很清楚:终止节点可解;与节点所有子节点可解才可解;或节点任一子节点可解即可解。答题时从叶节点往上推,先标终止节点,再逐层判断。

解树的提取有个容易忽略的点:解树一定是一棵与树,也就是说,从根到每个叶节点的路径上,所有分支关系都必须是“与”关系。如果某个或节点的多个子节点都可解,选其中一个就行,但选哪个会影响解树的形状。资料里的题选了包含终止节点最少的那棵,这是常见做法,因为解树越简洁,代价计算越方便。

3.3 博弈树与 α-β 剪枝的手算流程

α-β 剪枝是搜索策略里最容易在考试中拉开差距的部分。资料里给了极大极小分析和剪枝的一般规律,我把它翻译成手算步骤:

第一步,画出完整博弈树,标出端节点的估值。第二步,从下往上倒推,或节点取子节点最大值,与节点取子节点最小值。第三步,在倒推过程中维护 α 值和 β 值:或节点的 α 是当前最大倒推值,与节点的 β 是当前最小倒推值。第四步,剪枝判断——或节点的 α 如果不能降低父节点的 β,剪掉该节点以下分支;与节点的 β 如果不能升高父节点的 α,剪掉该节点以下分支。

示例(简化): MAX / \ MIN MIN / \ / \ 3 5 6 ?

倒推到第一个 MIN 节点,取 min(3,5)=3,父节点 MAX 的 α=3。第二个 MIN 节点扩展第一个子节点得 6,此时 β=6,因为 β=6 > 父节点 α=3,继续扩展不可能让 MIN 节点的值低于 3,所以第二个子节点可以剪掉。这就是 β 剪枝。手算时把 α、β 值写在节点旁边,剪掉的分支画叉,阅卷时一目了然。

4. 避坑与排查:这份习题集刷题时最容易翻车的五个地方

4.1 归结时量词消去顺序搞反

现象:把存在量词直接去掉,或者把全称量词用 Skolem 函数替换。原因:记混了量词消去规则——全称量词直接消去,存在量词才需要 Skolem 化。解决:每次化子句集前,先把公式写成前束范式,量词前缀写清楚,再按“从左到右,全称直接去,存在用函数替”的规则操作。

4.2 代价树搜索忘记重排 OPEN 表

现象:广度优先搜索的结果和深度优先一样,或者找不到最优解。原因:扩展节点后没有按 g 值对 OPEN 表重新排序,导致取出的不是当前代价最小的节点。解决:每次扩展后强制排一次序,可以在草稿纸上把 OPEN 表画成有序队列,取队首扩展。

4.3 与或树可解性判断漏掉“与节点全可解”条件

现象:某个与节点只有一个子节点可解,就判定该节点可解。原因:把与节点的条件和或节点搞混了。解决:与节点必须所有子节点都可解才可解,判断时逐个检查,不要跳步。可以在节点旁边标注“与”或“或”,避免视觉混淆。

4.4 α-β 剪枝时 α、β 值更新时机错误

现象:该剪的分支没剪,或者剪错了分支。原因:α 值只在或节点更新,β 值只在与节点更新,且更新后要立即与父节点比较。解决:每处理完一个子节点就更新一次当前节点的 α 或 β,然后立刻判断是否能剪掉剩余子节点。不要等所有子节点都处理完再更新。

4.5 谓词公式中变量命名冲突

现象:归结时置换搞混,比如把 x 和 y 的绑定弄反。原因:不同子句用了相同变量名,归结时没有做变量标准化。解决:在归结前,把每条子句的变量重命名为唯一名称,比如子句 1 用 x1、y1,子句 2 用 x2、y2,这样置换时不会混淆。

5. 把习题集用出复利:从手算到代码验证的一条捷径

手算归结和搜索树,最大的问题是“不知道自己算对没有”。我的习惯是,每做完一道归结题,用 Prolog 或 Python 写一个最小验证脚本,把子句集喂进去,看能不能推出同样的 ANSWER。资料里恰好给了一段 Prolog 亲属关系程序,可以直接拿来改。

% 验证“兄弟同父”推理 father(david, john). brother(john, peter). % 规则:兄弟同父 same_father(X, Y, F) :- brother(X, Y), father(F, X). % 查询:Peter 的父亲是谁? % ?- same_father(john, peter, F). % F = david

逻辑说明:same_father 规则表示,如果 X 和 Y 是兄弟,且 F 是 X 的父亲,那么 F 也是 Y 的父亲。参数说明:brother 和 father 是事实谓词,same_father 是规则谓词。运行查询时,Prolog 会自动回溯匹配,输出 F=david。这个脚本虽然简单,但能帮你验证手算归结的答案是否一致。

对于搜索题,可以用 Python 写一个代价树广度优先的骨架:

import heapq def cost_uniform_search(graph, start, goal): # graph: {节点: [(邻居, 代价), ...]} open_list = [(0, start, [start])] # (累计代价, 当前节点, 路径) closed = set() while open_list: cost, node, path = heapq.heappop(open_list) if node == goal: return path, cost if node in closed: continue closed.add(node) for neighbor, edge_cost in graph.get(node, []): if neighbor not in closed: heapq.heappush(open_list, (cost + edge_cost, neighbor, path + [neighbor])) return None, float('inf') # 示例图 graph = { 'A': [('C', 5), ('B', 7)], 'C': [('D', 6)], 'B': [('D', 5)], 'D': [('E', 8)], 'E': [] } path, cost = cost_uniform_search(graph, 'A', 'E') print(path, cost) # ['A', 'C', 'D', 'E'] 19

逻辑说明:用优先队列维护 OPEN 表,每次弹出累计代价最小的节点。参数说明:graph 是邻接表,start 和 goal 是起止节点。运行结果和手算一致时,说明你的扩展顺序没写错。如果不一致,对比 OPEN 表的排序过程,通常能定位到是哪一步忘了重排。

最后一个技巧:把资料里每章的“小结”部分单独抄一遍,用不同颜色的笔标出“定义类”“步骤类”“对比类”三种内容。定义类背关键词,步骤类背流程,对比类背差异表。期末前三天,只看这些标记,比重新翻一遍习题快得多。从那以后我每次带人复习 AI,都强制先过一遍小结再刷题,顺序反了效率至少打对折。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进