百科全书《人工智能(第2版)》之盲目搜索

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/epubit17/article/details/82459875

这里写图片描述
本文摘自《人工智能 (第2版)》人民邮电出版社出版

在本文中,我们从在人工智能中经常遇到的最重要的问题之一 ——搜索开始学习。我们的目标是介绍在AI中用于求解问题的最流行方法:搜索、知识表示和学习。我们开始学习基本的搜索算法——所谓的“无信息搜索”或“盲目搜索”的方法。这些算法不依赖任何问题领域的特定知识。正如我们将看到的,这些算法通常需要大量的空间和时间。

{60%}

2.0 简介:智能系统中的搜索

搜索是大多数人生活中的自然组成部分。我们都放错过房子钥匙或电视遥控器,然后检查口袋,翻箱倒柜。有时候,搜索可能更多是在大脑中进行。你可能有时突然不记得自己到访过的地方的名字、真正喜欢的电影中演员的名字,或者不记得曾经谙熟于心的歌词。要想起来这些事,可能需要几秒钟(记忆力衰退时或许更长)。

许多算法专门通过列表进行搜索和排序。当然,人们同意,如果数据按照逻辑顺序组织,那么搜索就会比较方便一些。想象一下,如果姓名和电话号码随机排列,那么搜索相对较大城市的电话簿会有多麻烦。因此,搜索和信息组织在智能系统的设计中发挥了重要作用,这并不奇怪。也许我们要搜索曾经到访过地方的名字或序列中的下一个数字(见第1章),抑或是井字游戏或跳棋游戏中下一步最佳移动(见第4章和第16章)。人们认为,可以非常快地解决此类问题的人,通常比其他人更聪明。软件系统也通常使用相同的术语,例如,人们也认为,性能更好的国际象棋博弈程序比同类型的程序更加智能。

本章介绍了几种基本搜索算法。2.1节首先介绍一个有助于形式化搜索过程的数学结构——状态空间图。在众所周知的假币问题(False Coin Problem)中,人们必须通过对两个或更多个硬币进行称重来识别假币,其中就展示了这种结构。接下来,本章介绍和解释了生成和测试(generate-and-test)搜索范式。生成器模块系统地提出了问题的可能解,而测试器模块验证了解的正确性。

本章还引入了两种经典的搜索方法:贪婪算法和回溯。这两种方法都是先将问题分成若干步骤。例如,如果你要将8个皇后放在棋盘上,任何两个皇后都不会互相攻击,也就是说,任何两个皇后都没有占据同一行、同一列或同一对角线。第 1 步就是将第一个皇后放在棋盘上,第2步就是将第二个皇后放在安全的方格中,以此类推。正如你在2.2节中所看到的,在选用何种标准做出具体选择方面,这两种方法互不相同。

2.3节解释了盲目搜索算法。盲目或无信息搜索算法是一种不需要使用问题领域知识的方法。例如,假设你正在迷宫中找出路。在盲目搜索中,你可能总是选择最左边的路线,而不考虑任何其他可替代的选择。两种典型的盲目搜索算法是宽度优先搜索(BFS)和深度优先搜索(DFS)——在第1章中已经做了简要介绍。回想一下,在继续前进之前,BFS在离开始位置的指定距离处仔细查看所有替代选项。BFS的优点是,如果一个问题存在解,那么BFS就会找到它。

但是,如果在每个节点的可替代选项很多,那么BFS可能会因需要消耗太多的内存而变得不切实际。DFS采用了不同的策略来达到目标:在寻找可替代路径之前,它追求寻找单一的路径来实现目标。DFS内存需求合理,但是它可能会因偏离开始位置无限远而错过了相对靠近搜索起始位置的解。具有迭代加深的DFS是介于BFS和DFS之间的折中方案,它将DFS中等空间需求与BFS提供能找到解的确定性结合到了一起。

2.1 状态空间图

状态空间图(state-space graph)是对一个问题的表示,通过问题表示,人们可以探索和分析通往解的可能的可替代路径。特定问题的解将对应状态空间图中的一条路径。有时候,我们要搜索一个问题的任意解;而有时候,我们希望得到一个最短(最优)的解。本章将主要关注所谓的盲目搜索方法,即寻找发现任意解。第 3 章将重点关注知情搜索算法,这些算法通常可以发现问题的最佳解。

假币问题

在计算机科学中,一个众所周知的问题是假币问题。有12枚硬币,已知其中一枚是假的或是伪造的,但是不知道假币是比其他币更轻还是更重。普通的秤可以用于确定任何两组硬币的质量,即一组硬币比另一组硬币更轻或更重。为了解决这个问题,你应该创建一个程序,通过称量三组硬币的组合,来识别假币。

在这一章中,我们将解决一个相对简单的问题实例,这只涉及6枚硬币;与上述的原始问题一样,它也需要比较三组硬币,但是在这种情况下,任何一组硬币的硬币枚数相对较少,我们称之为最小假币问题。我们使用符号Ci1 Ci2CirCj1 Cj2Cjr来指示r枚硬币,比较Ci1 Ci2Cir与另r枚硬币Cj1 Cj2Cjr的质量大小。结果是,要么这两组硬币同样重,要么不一样重。我们不需要进一步知道左边盘子的硬币是否比右边盘子的硬币更重或是更轻(如果要解决这个问题的12枚硬币的版本,就需要知道其他知识)。最后,我们采用记号[Ck1 Ck2Ckm]来指示具有m枚硬币的子集是所知道的包含了假币的最小硬币集合。图2.1给出了这个最小假币问题的一个解。

如图2.1所示,状态空间树由节点和分支组成。一个椭圆是一个节点,代表问题的一个状态。节点之间的弧表示将状态空间树移动到新节点的算符(或所应用的算符)。请参考图2.1中标有(*)的节点。这个节点[C1 C2 C3 C4]表示假币可能是C1C2C3C4中的任何一个。我们决定对C1C2以及C5C6之间的质量大小(应用算符)进行比较。如果结果是这两个集合中的硬币质量相等,那么就知道假币必然是C3C4中的一个;如果这两个集合中的硬币质量不相等,那么我们确定C1C2是假币。为什么呢?状态空间树中有两种特殊类型的节点。第一个是表示问题起始状态的起始节点。在图2.1中,起始节点是[C1 C2 C3 C4 C5 C6],这表明起始状态时,假币可以是6枚硬币中的任何一个。另一种特殊类型的节点对应于问题的终点或最终状态。图2.1中的状态空间树有6个终端节点,每个标记为[Ci](i = 1,…, 6),其中i的值指定了哪枚是假币。

..\17-0864改6.28\0201.tif{60%}

图2.1 最小假币问题的解

问题的状态空间树包含了问题可能出现的所有状态以及这些状态之间所有可能的转换。事实上,由于回路经常出现,这样的结构通常称为状态空间图。问题的解通常需要在这个结构中搜索(无论它是树还是图),这个结构始于起始节点,终于终点或最终状态(goal state)。有时候,我们关心的是找到一个解(不论代价);但有时候,我们可能希望找到最低代价的解。

说到解的代价,我们指的是到达目标状态所需的算符的数量,而不是实际找到此解所需的工作量。相比计算机科学,解的代价等同于运行时间,而不是软件开发时间。

到目前为止,我们不加区别地使用了节点(node)和状态(state)这两个术语。但是,这是两个不同的概念。通常情况下,状态空间图可以包含代表相同问题状态的多个节点,如图2.2所示。回顾最小假币问题可知,通过对两个不同集合的硬币进行称重,可以到达表示相同状态的不同节点。

0202{65%}

图2.2 状态空间图中的不同节点可以表示相同的状态

如图2.1所示,这是最小假币问题的解。解决这个问题的人穿着一件蓝色的衬衫,或者在处理12硬币版本的问题时,其他人需要一大杯咖啡,这些可能都是真的。但是,这些细节应该与解无关。抽象允许你抛开这样的细节。

在求解过程中,可以有意忽略系统的某些细节,这样就可以允许在合理的层面与系统进行交互,这就是在第1章中定义的抽象。例如,如果你想玩棒球,那么抽象就可以更好地让你练习如何打弧线球,而不是让你花6年时间成为研究物体如何移动的力学方面的博士。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/epubit17/article/details/82459875