人工智能(第三版
人工智能(第三版)(24/1/15)
第一部分:
第一章:前言#起始:(24/1/15)
1.0引言
对于人工智能的理解存在争议——
一些人认为,人工智能等同于任何由非生命系统实现的智能。他们坚持认为,即使这类智能行为的实现与人类智能的依赖机制不同也无关紧要。而另一些人则认为,人工智能系统必须能够模仿人类智能。——《人工智能(第三版)》
(一些人认为:人工智能作为不同于现存各种智能生物的个体,没有必要模仿人类智能。而另有一些人认为人工智能的结果是创造类人思考的智械,所以认为人工智能必须能够模仿人类的智能。)
虽然双方在人工智能的结果上产生了分歧,但是对于研究人工智能的前提确实一致的
即研究人工智能或实现人工智能系统,首先应理解人类如何获得智能行为,这对我们大有裨益。也就是说,我们必须从智力、科学、心理和技术意义上理解被视为智能的活动。
(目的是实现通过研究人脑推广到机械脑。问题在于计算机的01语言如何能够实现类似于生物大脑的智能甚至是人类的智能。问题再次前推,生物的智能是如何实现。)
(如果单从算力来讲,计算机的算力相比于人类早已经是遥遥领先。但我们难以承认人工智能是成熟的智能,虽然对于可以轻易难倒人类的问题,人工智能通关自己算法的优势可以轻而易举的完成,但是对于一些人类比较容易做到的事情却会让人工智能难以理解,譬如一些语言游戏,如反问句,讽刺语气,三重肯定表否定)
“人工”
人工是指由人制造。人造物通常具有负面含义即“人造物体只是真实物体的次要形式”
(这里的真实物体是指现实中存在的物体,这里负面含义我认为应该是指人造物体的总是基于现实物体而形成的。虽然较纯正而言人造物品并不能与真实物体并论,但人造物品通常可以让人们生活更方便,人造花的装饰作用,其质感可能不及真正的花,但是它有不需要时时浇水,容易养活的特点。)
"思维与智能"
理解人的”智能“我们需要从智力,科学,心理和技术意义上理解被视为智能的活动。
对于智能,R.斯腾伯格(R. Sternberg)给出了如下有用的定义:
智能是个体从体验中学习,正确推理,记忆重要信息,以及应对日常生活需求的认知能力。
(在智能的定义中将短句拆分成几个部分,可以看到“体验中学习”,“正确‘推理’”等几个词语带有较强的标识性意义。拥有智能的实体能够实现这些,而能够实现这些也就是拥有了智能)
动物智能
(1)如何判定某个人或物是否有智能?
(2)动物是否有智能?
(3)如果动物有智能,那么如何评估它们的智能?
(书中1.0.2提出了以上问题,三个问题递进排布,由比较熟悉的人,到生活中无处不在的动物,但动物与人之间存在交流障碍,判断动物是否有智能和评估动物的智能可以延申为判断计算机是否有智能,以及智能的强弱,这本身也是利用了启发式方法吧)
1.1图灵测试
何为图灵测试:
举例说,一场测试需三名角色:
普通人,询问者,说谎者。(每个人之间用幕布围住)
普通人:诚实的回答,证明自己是个普通人
说谎者:用谎言将自己伪装成为一个普通的人
询问者:通过询问问题区分普通人和说谎者。
回到智能实现的步骤,我们不可否认剖析人的智能是重中之重的一步,因此,我们通过让人工智能充当说谎者的身份来伪装自己成为一个普通人,来进一步评估人工智能。
对于图灵测试,布洛克和塞尔提出的思考引人深思
布洛克:假设计算机有足够大的存储空间来记录每一个合理的答案(包括回答的时间,语言等等一系列)它不必理解这些词汇和拖时间的意义。(即用机械查表得方式而非智能的方式来回答问题)
塞尔:中文房间问题,假设询问者以中文发问,而普通人并不懂中文,他有一份潦草的翻译,他只需要将问题对照翻译,再将答案对照翻译写出符号,普通人也并不需要理解这些中文的意思,只需要处理字符而已。同样,对于计算机的回答也是如此,如果计算机也只是对照翻译 的字符表将询问者的问题转化成01语言再对照翻译表将01语言转化为人类语言。这种模式难道能称为智能么?
布洛克和塞尔的批评表现在如果只是通关观察计算机的外部,即便计算机做出了合理的回答仍无法判断计算机是否使用了有智能,即计算机是否对问题做出了相应的思考而不是打表。
(后续说明,卢瑟福的α粒子撞击金箔实验,卢瑟福仅通过观察外部结果推理出正确的原子内部结构)
1.2弱人工智能与强人工智能:
“弱人工智能”(与麻省理工大学相关)的观点
人造物是否使用与人类相同的方式执行任务无关紧要,唯一的标准就是程序能够正确执行。
弱人工智能以效率作为智能的标准,并不在乎解决问题的方式。
“强人工智能”(以卡内基·梅隆大学(CMU)为代表)的观点
当人造物展现出智能行为时,它的表现应该基于与人类相同的方法。
强人工智能认为人工智能解决问题的方式应该是基于人解决问题的方法,他们坚信完全依靠人工智能程序的启发式方法、算法和知识,计算机就可以获得意识和智能。
(不难看出弱人工智能与强人工智能的划分是对人工智能理解分歧的进一步延申。既然说延申,两者的分歧肯定不是完全相同的。讨论点仍然落在了对智能的讨论上,弱人工智能的观点更注重目的性,仍将人工智能视为工具,强人工智能则要求人工智能的表现基于人类解决问题的方法。)
1.3启发式方法:
启发式方法是解决问题的经验法则。
不同于算法,算法是预先设定的用于解决问题的一组规则,其输出是完全可预测的。
而启发式是经验的方法,当解决一个比较困难的问题时,我们可以通过解决相同类型比较简单的问题来学习解决此类推解决这道难题的方法,这个时候我们其实就是利用了启发式的方法。
(在这里算法可以指代解决某类问题的明确的公式,步骤。启发式方法则是通过现实中经验,学习后获得的知识,通过推理,举一反三等一系列操作后实现的。如果说算法是高数考试让你利用罗尔定理,那么启发式就是让你自己推证罗尔定理,并利用。可以看出很多算法是从启发式方法中获得灵感后创造出来的)
1.4 识别适用人工智能来求解的问题 :
专家系统:
1它拥有庞大的数据库,包含各个领域或专门领域的专业知识或者生活常识。
2专家系统意味着具有专家能力的系统,能够根据你所说出的现状给出专家的建议。(正确判断的能力)可以模拟专家判断的过程。
二人博弈:
通过下棋来评估人工智能的智能水平。
国际象棋比赛和跳棋比赛,国际象棋的数据量庞大,单纯的打表难以解决问题。
尽管人机比赛中机器获胜,但是不满足强人工智能的要求,人工智能无法解释每一步棋的推理过程,并没有将每步棋的意义考虑到决策之中。
1.5 应用和方法:
一个系统要展示智能,就必须与现实世界交互。(照应前文)
利用搜索算法可以预见某个棋子对后续的影响,因此**有很多研究都聚焦于高效搜索算法的发现和发展。 **(空间树)
拼图游戏中介绍了:
1.盲目搜索法(遍历):深度优先搜索(通常但不一定,向左支移动),广度优先搜索(首先访问靠近根节点的方向),之后讨论面对组合爆炸的问题(因为数据量的爆炸式增长导致的盲目搜索无法成功,这不仅仅是超时问题,不管未来计算机的计算速度有多快,这依然会是事实)
2.启发式搜索:在寻找之前先观察空间树,**这些算法可以使用启发式方法来估计到达目标状态的剩余距离。 **
二人博弈:
不同于拼图游戏,二人博弈为双人对抗性质,必须同时关注自身和对手的动态。(这种更具交互性质的游戏是人工智能研究的热门话题)
自动推理:对智能的定义中提到,人工智能需要有正确推理的能力。此处,人为给定一些相关信息,希望人工智能可以通过这些信息来推理出希望得到的信息。(此处给定的信息包含但不仅限于此,研究人员还希望它能明白并利用常识和世界知识)
细胞自动机:模拟生命从简单到复杂的过程。赋予人工智能简单的规则,通过规则的迭代使其获得复杂性
遗传算法:以计算机处理数据的速度优势,按照自然界中的遗传进话规律形成的进化计算。
为每个状态赋值名为适应度的参数,并使用适应度函数使与目标状态更接近的状态适应度更高。
知识表示:由传教士与野人问题引出绘图处理的方法,语义网络,框架等基于图的只是表示法。
1.59 不确定性推理
模糊集,给定的较为抽象的数值。
此处给例为员工的隶属度。从1.0到0.0不等,这些值无法明确表示,但是可以模糊表示,并且这些不确定性的数值可以作为我们某些推理的数据。
1.6人工智能的早期历史
亚里士多德建立逻辑前提论
乔治·布尔建立逻辑关系后被称之为布尔代数
雷蒙德·卢尔:可能是第一个尝试将人类思维机械化的人,建立了一个基于逻辑的系统
莱布尼茨:建立逻辑演算和通用代数几乎解决所有的逻辑论证
库尔特·戈德尔:认为总有些命题不能被判定为真或假。
雷内·笛卡儿:通过认知内省解决了物理现实的问题。
逻辑学家与逻辑机器:
第一台真正意义上的逻辑机器康斯坦普演示器
现代第一台原型的现代计算机名为差分机
差分机的下一代产品:分析机
克劳德·香农:继电器电路的应用上有开创性论文。
Nimotron是第一台可以完整发挥游戏技能的机器。
托雷斯·克韦多建立了第一个专家系统。
康拉德·楚泽发明了第一台使用电的计算机,楚泽认识到了工程和数学逻辑之间的关系并且认识到布尔代数中的计算与数学中的命题演算是等价的,他开发系统,在逻辑电路方面的工作比香农早了几年楚泽认识到需要一种高效和庞大的存储器,并基于真空管和机电存储器改进了计算机,他将这些计算机命名为 Z1、Z2 和 Z3。
人们普遍认可 Z3(1941 年 5 月 12 日)是世界上第一台基于浮点数的、可靠的、可自由编程的计算机。这台机器在第二次世界大战中被炸毁了,但是它的仿制品目前展示在慕尼黑的德意志博物馆。
1.7人工智能的近期历史到现在:
自第二次世界大战以后,计算机科学取得了巨大的进步,编程技术日渐成熟。
神经计算:
弗兰克·罗森布拉特开发了一种名为感知器学习规则的迭代算法,解决了人工神经网络(ANN)模型不包括学习机制的严重缺点。
20世纪80年代,这个领域迎来了第二次爆发,霍普菲尔德的异步网络模型
使用能量函数找到了NP问题的近似解。20世纪80年代中期,人工智能领域出现了方向传播算法——一种适合于多层网络的学习算法
自然语言处理(NLP):对于智能系统,具有理解自然语言的能力看起来是非常自然的事情
Eliza具有与人说话的能力(不是沟通或者交流)旨在模仿卡尔·罗杰斯(Carl Rogers)学派的精神病学家所担任的角色。
DOCTOR初步具备了感知情绪的能力
特里·威诺格拉德开发的SHRDLU可以 使用意义、语法、演绎推理来理解和响应英文命令,它的会话世界是一个桌面,上面放着各种形状、大小和颜色的积木
HEARSAY是一个雄心勃勃的语音识别程序,它采用黑板结构,该程序使用语法和语义信息来去除不太可能的单词组合。
改善:通过从宾州树库中获取相关概率实现增强上下文无关的语法,以赋予每条规则相关的概率。
1.8 新千年人工智能发展
人工智能的方法论已经被吸纳到计算机科学的标准技术中。比如,在人工智能研究中产生的搜索技术和专家系统现在都已经被嵌入许多控制系统、金融系统和基于 Web 的应用中
第一章讨论题:
1.从人工和智能两个角度讲。
“人工”的角度讲人工智能是人造物。
“智能”的角度讲人工智能具有从生活中获得经验,学习知识并应用解决问题的能力。
在图灵测试中,塞尔还强调了人工智能应该具备思考的能力。
2.弱人工智能针对于结果,他们的观点认为人造物是否具有基于人的智能无关紧要,侧重于人工智能是否能够正确运行高效的取得正确的结果
强人工智能要求人工智能的表现应该是基于人类解决问题的。
3.ALICE是一款安装在网络服务器上的聊天机器人,相比于早期的其他机器人,它具备更强的上下文联系能力。
4.图灵利用图灵测试评估人工智能的智能程度。
5.约翰·麦卡锡首次提出了“人工智能”,对于LISP编译语言做出了重大贡献,指出人工智能需要什么才能真正有效。
6.ATM机并不具备体验中学习,正确推理,即不具备智能。
7.人工智能可以基于过往的病例经分析推理确定或者的疾病和治疗问题,其次医疗诊断是一个复杂的过程,其中可能有很多有效的医疗方法,并且多数情况下并不存在可以识别潜在疾病或病症的确定性算法。专家的知识是离散分布且大量的,人工智能可以统合这些分散的信息
8.二人博弈与之前的拼图游戏有所不同,游戏需要两名参与者,人工智能不仅需要关注自身完成目标的进度还需要时刻关注对手的状况,更考验人工智能的分析推理学习的能力。
9.计算器象棋的可能性多,盲目搜索法无法实现,迫使算法以及启发式搜索法进步
评估人工智能的智能水平
10.专家系统将专家离散的知识与经验,提问者说明的条件整合,推理给出相对合理的建议。
11.语义网络,框架系统,描述逻辑
练习题:
1.通过逆图灵测试训练AI模型,实现判别是否是机器人和伪装自己两类人工智能的发展。通过此训练判别是否是人工智能的人工智能判定买票者是否是机器人。
2.通过伪装成为朋友或者亲人进行诈骗,冒名顶替他人进行违法行为。
3.大猩猩进行一了举一反三的行为,他通过手镯和手指两个词语来表示并未学到的戒指。
动物的智能是否只是对人类行为的理解,即是否只是简单的巴普洛夫反应 ,聪明的汉高通过分析推理人的表情和行为来获得数学问题的正确答案,这一点虽然已经表明这匹马具备智能,但是他还是不知道数学问题背后的意义。
测试方式:将戒指,手镯+其他小物品放在大猩猩面前,摆出手镯和手指的手语,让他选择。
判断他是否分析人类的意图。
判断他是否真正明白了戒指的意思。(而不是单纯看着像)
4.不能。根据布洛克和塞尔的批评为了完成指定的目标而没有思考背后意义并不能证明为人工智能,即判定大城市(智能)的标准应该包含但不仅限于这些标准。
5.将权重设为1.0阙值设为0.5。当输入的平均值大于0.5时执行真,小于0.5时执行非。
6.以平均收益作为策略成功与否的标准,取n次游戏收益的平均值,如果该策略可以长期获得高收益那么可以判定为成功的策略。
7.曼哈顿距离
8.搜寻过去高峰时期出租车上车下车的汇集地,根据城市高峰段的交通信息确定车辆较少的路段规定行车路线。
9.对地形的了解将猎物逼入死角。守水源处。在猎物睡觉或者猎物幼崽距群体远的时间。
10.家庭成员的组成,成员的年龄,经济条件,房屋大小,对干净的需求。
11.人类应该认识放下傲慢,应该尊重拥有智能的其他实体。即使人工智能由人类创造。
12.可以增加数据收集的速度。可以确保数据收集的多样性,可以整合分析去除错误数据。数量更多,可以避免安全性因素导致的失败。
13.Eliza可以被视为一种关系型人造物。Eliza的制作旨在通关交流互动的方式进行心理疏通,对精神问题的患者进行治疗。
14.翻译为,(我们是人类亦或者舞者?)我们是人类还是舞者?在了解到一定的背景故事之后我认为后者的翻译优于前者。舞者是人类的职业,在乐团的困境时以歌发问是继续前进还是放弃?是掌控命运还是受制于人。情感还是欲望?不够完美还是不受影响?维加斯的败犬还是大厦顶层的公子哥?在过去他们初出茅庐,风华正茂时无需考虑这种烦恼,他们轻浮愚蠢,并且对此毫无歉意,现如今他们困境重重,但是他们一本正经。歌唱时他们无需考虑这种烦恼,一心一意于自己的dancer人生。
对本门学科的意义:坚定向前的的信心不动摇。对人类的行为和性质进行哲学上的反思,避免过于轻浮。
15.机器学习,深度学习,专家系统,强化学习,自然语言处理。
16.人工智能和人一起打游戏,让另一个人工智能抓出来哪个是真人哪个是人工智能。
17.相比于习题2而言Lovelace 2的测试更注重测试AI的创造力。
第二部分:基础知识
本章的章首由AI的基础是什么来切入主题
观点1.AI的基础是搜索
观点2.AI的基础是逻辑
第二章:盲目搜索:
思考 盲目搜索法的盲目性:
盲目搜索需要在历经所有存在的路径之后才能判断出通往目的状态的最佳路径
使用盲目搜索一定可以找到结果,但是这也伴随着花费大量的空间和时间。并且随着节点的增多,复杂度的增大,花费的时间空间增长速度较快。
盲目搜索的盲目性体现在他忽略其他内在问题或者已知条件,将注意力完全放在解决问题上。其中,其所忽略的信息可能是一些限制条件,也可能是一些便利条件。这代表着,盲目搜索获得结果要花费更长的时间(一些已知错误的路径要撞到南墙才会回头,缺少随时判断当前状态是否能达到目标状态的能力,需要花费大量时间和空间)。
2.0 简介系统中的搜索:
简介介绍:
1.状态空间图——一种有助于形式化搜索过程的数学结构
2.生成-测试搜索范式
3.贪心算法和回溯法 : 这两种方法都首先将问题分成若干步骤。
4.盲目搜搜: 深度优先搜索(BFS) 和 广度优先搜索(DFS):如果一个问题存在解,那么BFS就一定能够找到它
缺点是:如果在每个时刻的可选项非常多,那么 BFS 可能会因为需要消耗太多的内存而变得不实用。
2.1状态空间图:
通过状态空间图进行搜索和分析,获得通往解的可能的可选路径。
假币问题:
将硬币分为2,2,2三组分别记作abc
随机抽取abc中的两组假设挑选的是ab两组
此时有两种情况
1.天平偏向一方:
表明假币在ab中,而c中全为真币
再将ab中一组与c比较,假设取出的为a
1.1天平偏向一方:
假币在a中,再从ac中各取出一个硬币放于天平
1.1.1天平偏向一方:
取出即为假币
1.1.2天平未偏移:
a中剩余为假币
1.2天平不倾斜:
假币在b中,从bc中各取一枚硬币放于天平结果见上1.1.1和1.1.2
2.天平不倾斜:
天平不倾斜则假币位于c中,具体操作见上文
十二枚硬币:
1.分4,4,4
44称取
1.如果不偏移,称取剩余的4
2.如果偏移,则假币在4+4中
2.1假设是左重右轻
将剩余的八个币进行分组,交换两个币(1组),拿出三个币(从一边)并用确定为真币的几个币补全(2组),剩余的三个币(3组)
接下来有三个平衡状态分别可以证明假币在三组中的哪一组
1.天平持平:2组
2.天平仍然表示左重右轻:3组
3.天平的表示右重左轻:1组
并且可以确定假币的轻重
在分为1+1或1+1+1称重可以确定假币
(解决这个问题要认清天平的三种状态,左倾右倾和持平分别会产生什么样的判断)
由假币问题,引出了我们正文状态空间树
状态空间树由 节点 和 分支 组成
起始节点表示问题的起始状态
目标状态搜索的结果
状态空间树包含了问题能够产生的所有可能状态,并包含所有可能的结果。
搜索始于起始节点,终于目标状态
这种方法不计较寻找解的代价代表这这种方法往往伴随着高昂的运行时间
在计算机中,解的代价指的是运行时间而不是软件的开发时间
节点不等于状态,每个问题的节点都处于某种状态中,但是多个不同的节点可能处在相同的问题状态下。
2.2.0生成--测试范式:
生成器:一个可靠的生成器必须生成所有可能符合条件的解,如果这个生成器给出了每个可能满足条件的解,我们就称这个生成器为完备的。
一个好的生成器还应该该是非冗余的,即相同的解不会给出两次
如果生成器有一些信息,允许其对产生的解做出限制,那么这个生成器就是知情的。
{While没有找到解,但仍有候选方案
[生成可能的解 测试其是否满足所有的问题约束条件]
End While}
IF找到某个解,则宣布成功,并输出此解
Else宣布没有找到解
(生成器知情可以在生成时避免一些已知错误的通往解的路径,从而降低搜索的成本。)
2.2.1回溯法:
回溯法是对完全枚举法的改进。
完全枚举法:获得所有可能的结果,无论结果是否是解,在搜索过程中,即便已经到达无法获得正确解的地步,也会继续枚举下去。
为了避免上述问题造成的时间和空间的浪费,要求我们在完成一步以后,检测当前状态是否已经违反了限制条件(即当前状态是否还能够找到解)
改良以后的方法即为回溯法:
针对某个问题,将解决问题的过程划分步骤,在完成每个步骤之后,检测能否达成目标状态。若不能,返回上一步并继续尝试该节点的下一个状态。
2.2.2贪心算法:
利用贪心算法(greedy algorithm),我们可以得到另外一种搜索方法。这种搜索方法也是先将一个问题分成几个步骤进行求解,其中每次只考虑一个输入。
贪心算法总是包含一个必须优化(将问题大化小 或 小化大),典型用法是解决旅行距离、开销或持续时间问题。寻找最佳解这一类的问题。
贪心算法从局部看待最佳。总是做出当前状态的最佳选择,把每个节点的最佳选择联系起来,组成可能是最佳的解(其中“局部”的改变并不是局部的移动,而是局部的放缩,动态变化的局部)。
利用书本的例子来讲。
1.从v1到最近的v5
2.从v1到第二近的v2,到达v2的路径包含了前几步的部分,拿来做比较。
3.从v1到v4,包含了前几步的部分,即v5-v4,v2-v4,v1-v4三部分,比较大小。
4.从v1到v3,包含前几步的部分,即v2-v3,v4-v3。拿来比较。
每一步的选择都建立在前一步最佳选择的基础上。利用v2-v4举例而言,若通过v2到v4这个路径最短(指经过v2-v4路径的由v1到v4的路程),那么前提是v1到v2的路程是最短的。
Dijkstra 短路径算法:用于解决贪心算法范式无法解决的问题
分支定界算法是广度优先搜索的一种变体,又称为统一代价搜索
2.3盲目搜索:
盲目搜索主要分为以下三种:
深度优先搜索(DFS)、广度优先搜索(BFS)和迭代加深的深度优先搜索
这些搜索具备以下的性质:
(1):他们不使用启发式估计
(2):他们的目标是找出给定目标的某个解。寻找是不定项的,不能定向找出最佳解。只能通过找出所有可能的解进行比较。
深度优先搜索:
在每个节点做出选择时优先选择向左,总是试图深入树中进行搜索。
拼图问题:利用盲目搜索,随时记忆已经出现过的状态。
广度优先搜索:
按照层级从左到右逐层访问,访问过程中记录节点的状态,跳过已经具备已经出现过的状态的节点,记录未出现的状态减少搜索成本。
2.4盲目搜索法的实现和比较
搜索法的实现一般有一个共同点,那就是要维护两张表,一张开放表(open list)和一张封闭表(closed list)
开放表包含树中所有待探索的节点(或扩展的节点)
封闭表包含所有已探索或不必探索的点。
栈:一种后进先出的数据结构。即最后进栈的先出去。对数据的操作仅在栈的一端,我们称为栈顶
列:一种先进先出的数据结构。
2.4.3问题求解性能的衡量指标 :
四种衡量指标:
完备性:如果搜索法可以保证获得一个结果,就说这个算法是完备的。
最优性:搜索法所获得的解是否是最优解
时间复杂度:时间复杂度关注的是找到解所需要的时间,这里可以根据搜索过程中生成(或扩展)的节点的个数
空间复杂度:空间复杂度关注的是内存的开销。
特别的对于AI而言用如下三个参数表示:
(1):节点的分支因子(branching factor,记为 b),指的是从节点出发的分支数
(2):节点的分支因子(branching factor,记为 b),指的是从节点出发的分支数
(3):参数 m 给出的是状态空间中所有路径的 大长度。
深度优先搜索和广度优先搜索的比较:
两种搜索在适合解决不同的问题。
深度优先搜索(DFS):
树很深。
分支因子不太大,并且 解出现在树中的位置相对较深。
广度优先搜索(BFS):
搜索树的分支因子不太大(一个适度的 b 值)。当整棵树的分支因子实际上很大时,
BFS 会因为有过多的路径需要探索而不堪重负。 解出现在树中的位置在合理的深度(一个适度的 d 值),并且 所有路径都不是特别深。
BFS利于寻找浅的目标结果,如果每个节点都有b个新的节点,那么时间复杂度会随着层数的递增指数增长。
在经过对广度优先搜索和深度优先选择的思考之后,一种新的搜索迭代加深的DFS即DFS-ID(DFS With Iterative Deepening)诞生了。
DFS-ID 执行一个 DFS 算法,其状态空间的深度的界为 0。
如果没有找到目标,就执行另一个 DFS 算法,此时深度的界为 1。
以此往复,每次迭代深度的界+1。
在每次迭代中,一个完备的 DFS 都要执行到当前深度。在每次迭代中,搜索都要重新开始。
DFS-ID 的时间复杂度是 O(bd),这比 BFS 稍好。在 坏的情况下,所有的盲目搜索算法,包括 DFS、BFS 和 DFS-ID,都会表现出指数级的时间复杂度。DFS-ID 每次只需要在内存中存储一条路径,因此它的空间复杂度为 O(b*d),这与 DFS 相同。
(盲目搜索的搜索成本会随着问题的复杂度加深而变得不合时宜)
第二章讨论题:
1.搜索为什么是 AI 系统的重要组成部分?
搜索串联起始状态和目标状态,通过搜索可以获得目标信息和有效信息。
2.状态空间图是什么?
状态空间是问题的一种表示方法,某个具体问题的解将对应状态空间图中的一条路径。
3.描述生成-测试范式。
分为生成和测试两部分,生成负责生成所有可能的解,测试部分筛选出符合题意得解。
4.生成器有什么属性?
完备的,非冗余的,知情的
5.回溯法如何对完全枚举法进行改进?
回溯法能够判断当前节点能否找到解,若不能则回溯到上一节点。
6.用一两句话描述贪心算法。
贪心算法将问题分步骤进行,将每一步的最佳建立在上一步最佳的基础上。
7.陈述旅行商问题。
给定 n 个顶点的加权图(即每条边上带有开销值),求从某个顶点 Vi 出发经过加权图中的所有顶点(每个顶点只经过一次),然后返回到 Vi 的 短路径。
8.简述 3 种盲目搜索算法。
DFS深度优先搜索:在每个节点优先向左,即优先选择深入树的路径。
BFS广度优先搜索:每层由左到右探索,逐层深入。
DFS-ID迭代加深的深度优先搜索:限制一定的深度进行深度优先算法,若在限制内未得到解,则降低限制进行深度优先搜索,以此往复。
9.在何种意义上,盲目搜索算法是盲目的?
搜索过程中无法确定该节点能否通向目标状态。
不考虑问题的特定信息,仅通过穷举的方式获得解
10.按照完备性、 优性和时空复杂性,比较本章描述的 3 种盲目搜索算法。
完备性:
若某条路的长度是无限的DFS不完备。
若某个节点的分支是无限的BFS不完备。
如果给定无限大空间或者是达到了难以遍历所有节点的结果,迭代加深的DFS不完备
优性:
盲目搜索一般不具备最优性。
时空复杂度:与上无法实现完备性的缺陷基本一致。(当问题复杂繁琐时,盲目搜索的完备性,时空复杂性可能会严重受损)
11.在什么情况下,DFS 比 BFS 好?
解位于树的深层,每个节点的分支较多。
12.在什么情况下,BFS 比 DFS 好?
解出现在较浅层,并且分支因子不太大。
13.在什么意义上,可以说 DFS-ID 是 BFS 和 DFS 的折中?
DFS-ID的时间复杂度介于两者之间,空间复杂度则与DFS相同
练习题:
1.在只允许称重 3 次的情况下,求解 12 枚硬币的假币问题。回忆一下,天平可以返回以下 3 种结果之一:相等、左侧轻或左侧重。
将12枚硬币编号为1,2,3……11,12
第一次称取:将1,2,3,4和5,6,7,8分别放在两端。
若平衡:将1,2和9,10分别放在两别称取
若平衡:将1和11称取
若平衡:12为假币
若不平衡:11为假币
若不平衡:将1和9称取
若平衡:10为假币
若不平衡:9为假币
若不平衡:记此时为右倾。将1,2,3,8和9,10,11,4分别称取。
若右倾:称取1,2
若右倾:1为假币
若左倾:2为假币
若平衡:3为假币
若左倾:称取1,4
若平衡:8为假币
若倾斜:4为假币
若平衡:称取5,6
若左倾:5为假币
若右倾:6为假币
若平衡:7为假币
(在一种假设且自身不知情的情况下,每枚硬币都有可能为假币,找到每枚硬币为假币的搜索路径才算成功)
2.在只称重两次的情况下,求解微型假币问题或证明这是不可能的。
在假币问题中,每次称取可能出现的结果有三种,即左右倾和平衡,即每个节点最多只有三个分支,两次称重最多可以产生9个结果,即在已知只有一枚假币的前提下,最多只能证明9枚硬币是假币的可能,无法证明12枚硬币。
3.非确定性搜索(nondeterministic search)是本章未讨论的一种盲目搜索方法。在这种搜索中,刚刚扩展的子节点以随机顺序放在开放表中。请判断非确定性搜索是否完备以及是否 优。
不是完备的,无法保证在有限的步骤中寻找到解
不是最优的,节点的扩展顺序是随机的,无法保证在最短的时间寻找到解
4.n 皇后问题的另一个生成器如下:第一个皇后放在第一行,第二个皇后不放在受第一个皇后攻击的任何方格中。在状态 i,将第 i 列的皇后放在未受前面(i−1)个皇后攻击的方格中,如图 2.34 所示。

(a)使用这个生成器求解 4 皇后问题。
[横,纵]
[[1,3],[2,1],[3,4],[4,2]]
[[1,2],[2,0],[3,1],[4,3]]
(b)证明这个生成器比文中使用的两个生成器拥有更多的信息。
文中使用的生成器需要遍历所有可能摆放的结果。
而这个生成器会将不能摆放棋子的格子标记出来。
(c)画出搜索第一个解时在搜索树中展开的部分。
[1,4] [1,3] [2,3] [2,4](要至少考虑其中的1/4)
5.思考下列 4 皇后问题的生成器:从 i=1 到 i=4,随机地分配皇后 i 到某一行。这个生成器完备吗?非冗余吗?解释你的答案。
不完备也不是非冗余。
不断的随机的结果并一定能够找到正确答案,随机性可能产生两个相同的解,所以不是非冗余的。
6.如果一个数等于其因数(不包括这个数本身)的和,则称这个数是完美数。例如,6 是完美数,因为 6 = 1 + 2 + 3,其中整数 1、2 和 3 都是 6 的因数。给出你所能想到的拥有 多信息的生成器,使用这个生成器,可以找到 1 和 100 之间(包括 1 和 100 在内)的所有完美数。
生成(2n-1)×2(n-1)查看是否在1-100之间,超过100则退出循环。
(奇数的因数也一定为奇数,而奇数与奇数的和为偶数,即在前提条件上要添加一条:因数的个数也为奇数。而此类奇数的因子的性质皆来自比自身小的奇数,后者的因数和未有大于自身的情况,至少在0-100之间奇数没有完美数)
7.使用 Dijkstra 算法找到从源顶点 V0 到所有其他顶点的 短路径,如图 2.35 所示。

图 2.35 使用 Dijkstra 算法的标记图
节点 | 距离出发点的距离 | 前面点 |
---|---|---|
0 | 0 | 无 |
1 | 4 | 0 |
2 | 7 | 1 |
3 | 6 | 1 |
4 | 7 | 3 |
8.创建拼图(如 15 拼图)的表示以适合检查重复状态。
建立3维列表,第一维作为标号,剩余二维列表用于记录位置。
9.使用广度优先搜索求解传教士与野人问题。
10.在河的西岸,一个农夫带着一匹狼、一只山羊和一篮子卷心菜(参见图 2.0)。河上有一艘船,可以装下农夫以及狼、山羊、卷心菜三者中的一个。如果留下狼与羊单独在一起,那么狼会吃掉羊。如果留下羊与卷心菜单独在一起,那么羊会吃掉卷心菜。现在的目标是将它们都安全地转移到河的对岸。请分别使用以下搜索算法解决上述问题:
(a)深度优先搜索;
(b)广度优先搜索。
11.首先使用 BFS,然后使用 DFS,从图 2.36(a)和图 2.36(b)的起始节点 S 开始,终到达目标节点 G。其中每一步都按照字母表顺序浏览节点。
12.标记图 2.37 所示的迷宫。
13.对于图 2.37 所示的迷宫,先使用 BFS,再使用 DFS,从起点处开始走到目标处。
BFS属于多线程操作,相当于在每个分路口同时选择所有可能的方向进行探索到下一个分路口,直到找到目标,
类似如此的迷宫有一种必定能找到目标的走法就是贴着左墙,或右墙走(还可以防止迷路)就是利用深度优先搜索的原理,将每个路口走到头。
  图 2.36 使用 BFS 和 DFS 到达目标节点 图 2.37 迷宫
14.我们已经确定,12 枚硬币的假币问题需要对 3 组硬币进行称重才能确定假币。那么在 15 枚硬币中,需要称重多少次才可以确定假币?20 枚硬币时又会怎么样?请开发出一种算法来证明自己的结论。
按照之前题目的回答,无论15还是20都可以在4此内称出。
提示:可以先考虑 2~5 枚硬币所需的基本称量次数,从而开发出事实知识库,自底向上得到这个问题的解。
15.我们讨论了传教士与野人问题。假定“移动”或“转移”是强行(受迫)的,找出这个问题的一个解。确定问题解决状态的“子目标状态”,我们必须获得这个状态,才能解决这个问题。
编程题:
1.编写程序来解决 15 拼图的实例,首先检查目标状态是否可达。你的程序应该利用下列搜索算法。
(a)深度优先搜索。
(b)广度优先搜索。
(c)迭代加深的深度优先搜索。
#关键在于超看目标状态和起始状态的逆序数奇偶性是否相同
dic=[]
#nums是正确排布的列表
nums=list[list[int]]
#nums1是当前状态
nums1=
def ex(一维数组):
求逆序数
def dfs(nums,deep):
if nums==nums1
return True
for#各个分支:
if dfs(nums,deep+1):
return True
return False
def bfs(li):
li1=li.coppy()
while li1:
num=li1.pop(0)
if ==:
return True
for #遍历节点:
return False
def ids(nums, max_depth):
for depth in range(max_depth):
if dfs(nums, 0, depth):
return True
return False
2.编写程序,使用贪心算法找到图的 小生成树。图 G 的生成树 T 是其顶点集和图 G 的顶点集相同的树。考虑图 2.38(a),图 2.38(b)给出了一棵生成树。可以看到,图 2.38(c)中的生成树具有 小的代价,这棵树被称为最小生成树(minimum spanning tree)。要求编写的程序能够找到图 2.38(d)中的 小生成树。
#由v3开始寻找
串联v3和v2
串齐v3和v4
v5对比v2,v3,v4距离选择v3.
v1对比v2和v5的距离选择v5
v6对比v1,v2,v5的距离选择v2
3.编写程序,使用回溯法来解决 8 皇后问题,然后回答以下问题。
(a)有多少个解?
import numpy as np
def dfs(dic1,dic2,dic3,n):
if n>8:
return 1
ans=0
for i in range(8):
if i not in dic1 and i not in dic2 and i not in dic3:
ans+=dfs((dic1+[i]),(dic2+[i])+1,(dic3+[i])-1,n+1)
return ans
print(dfs([],[],[],))
(b)这些解中有多少个是有区别的?(可通过阅读第 4 章的习题 5 来获得提示)
所有解都是有区别的
(c)使用哪种生成器?
 图 2.38 查找图的 小生成树
(a)图 G (b)图 G 的生成树 (c)图 G 的 小生成树 (d)需要找到 小生成树的图
4.编写程序,采用习题 5 中建议的生成器解决 8 皇后问题。
5.在国际象棋中,马有以下 8 种不同的走子方式:
(1)从上一个方格,到右两个方格;
(2)从上一个方格,到左两个方格;
(3)从上两个方格,到右一个方格;
(4)从上两个方格,到左一个方格;
(5)从下一个方格,到右二个方格;
(6)从下一个方格,到左两个方格;
(7)从下两个方格,到右一个方格;(8)从下两个方格,到左一个方格。
所谓 n×n 棋盘上的马踏棋盘问题(a knight’s tour,又称马周游、骑士漫游或骑士之旅问题),是指马从任何棋格出发,遍历剩下的 n2−1 个棋格,并且每个棋格只访问一次。显然整个过程是 n2−1 步走子的序列。
编写程序,实现 n 等于 3~5 时的马踏棋盘问题。采用随机数生成器随机选择起始棋格并报告程序的运行结果。
在5*5时出现一个结果(3,3) (4,1) (2,0) (0,1) (2,2) (1,4) (0,2) (1,0) (3,1) (4,3) (2,4) (0,3) (1,1) (3,0) (4,2) (3,4) (1,3) (2,1) (0,0) (1,2) (0,4) (2,3) (4,4) (3,2) (4,0)
(2,4) (0,3) (1,1) (3,0) (4,2) (3,4) (1,3) (0,1) (2,0) (4,1) (3,3) (1,4) (0,2) (1,0) (2,2) (4,3) (3,1) (2,3) (4,4) (3,2) (4,0) (2,1) (0,0) (1,2) (0,4)
6.在为图着色时,将颜色分配给图中的节点,使得任何两个相邻节点的颜色都不同。例如,在图 2.39 中,如果节点 V1 被着色为红色,则节点 V2、V3 或 V4 都不能被着色为红色。然而,因为节点 V1 和 V5 不相邻,所以节点 V5 可以用红色着色。
 图 2.39 待着色的图
图的着色数是对图着色所需的 小颜色数目。各种图的着色数如图 2.40 所示。

图 2.40 各种图的着色数
编写回溯程序,对图 2.41 中的图进行着色(采用你可以想到的拥有 多信息的生成器)。

#先从节点最多的点入手。,节点最多的点对周围的影响大,利于排除,之后颜色按照一定次序并判断是否符合条件即可
v=[]
col=[]
#要把相邻的记录下来。
for i in v:
if 相邻:
col加一个数字
else:
不变
最后输出col的个数
不存通过影响周围的数形成的扩散影响。
回溯:
def dfs(ans,dic,n):
if n>:
return len(ans)
for i in col:
for j in 相邻:
有相等break
else:
如果没有相等,那他就在剩余颜色中选择
for 这些颜色:
return dfs()
ans里面加颜色
return dfs()
最后返回的是包含颜色的数组。求长度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)