
1. 问题解决与搜索1.1. 解决问题的能力无疑是区分人类和其他动物的关键能力之一1.1.1. 解决问题是需要智慧的1.2. 汉诺塔1.2.1. 对于三个金环而言1.2.1.1. 你不可能找到少于7次的解决方案了1.2.2. 最初,我们只能选择移动最小的金环,只有将它移动到中间或者最右边的柱子上1.2.2.1. 所以对应第一步,我们只有两种移动可能,以及两种不同的新状态1.2.3. 如果我们选择将最小的金环移动到中间柱子,那么我们随后可以执行三种操作1.2.3.1. 将最小的金环移动到最左侧或者最右侧的柱子1.2.3.2. 将第二个金环移动到最右侧柱子(不能将第二个金环移动到中间柱子)1.2.4. 以此类推1.3. 所有类似汉诺塔的问题都有着相通的解决方案1.3.1. “状态”这个术语在人工智能领域指的是某个事物或者问题在某个特定时刻呈现的结构1.3.2. 首先,从初始状态开始,我们考虑每个可能的动作对初始状态的影响,执行每一步操作都会将初始状态转换为一个新的状态1.3.3. 如果其中某个新状态是我们的目标状态,那就意味着操作成功1.3.3.1. 这个问题的解决步骤就是从初始状态达到目标状态所执行的操作1.3.4. 否则,在每一个新状态上,继续考虑所有可能导致状态变更的操作,重复这样的过程,以此类推1.4. 穷举搜索1.4.1. 穷举搜索的方式不仅能保证在问题可解的时候寻找到问题的解,还能保证寻找到问题的最优解1.4.1.1. 作为计算机的算法,穷举搜索非常简单,编写一个程序来实现它非常容易1.4.2. 简单的穷尽式搜索是一项非常原始的技术1.4.2.1. 可以使用启发式方法来对它进行优化,但是并不保证一定有效1.4.2.2. 你会发现对搜索方式的优化可以改善一些东西,但是,最终你仍然无法绕过组合爆炸1.4.2.2.1. 在大多数情况下,能在理论上确保问题可以解决的方案,在实践中都会遇到这个问题1.4.3. 学会避免做一些徒劳的移动1.4.3.1. 一台简单执行穷举搜索的计算机却无法做到1.4.3.2. 它只能穷举出所有移动下的所有新状态,哪怕某些穷举步骤就是在浪费时间,它也会走回头路,回到已经被确认过失败的状态1.4.4. 除了太多重复和低效率以外,穷举搜索还有一个根本的问题1.4.4.1. 搜索树随着分支因子能增长到多大1.4.4.1.1. 通常一局围棋游戏要走大概200步,在围棋搜索树中存储200步走棋的搜索树状态数目1.4.4.1.2. 是一个大到你我都无法想象的天文数字,它比我们宇宙中所有原子的数目还大几百个数量级1.4.4.2. 对确定了分支因子数的搜索树,在不同层级有多少种状态1.5. 搜索树这种迅速、荒唐的增长速度导致了无法想象的问题,我们称之为组合爆炸,它是人工智能所面临的最重要的实际问题1.5.1. 在人工智能发展初期,组合爆炸被认为是根本性问题,麦卡锡将其确定为1956年人工智能暑期学校的重要研究课题之一1.5.2. 搜索树中的每个层级都呈指数型增长1.5.2.1. 在层级增多的时候,组合爆炸会导致可能出现结果的增长速度超乎想象1.5.2.2. 彻底列举每一种组合可能性的方式,是不可行的1.5.2.3. 理论上它行得通(如果时间足够,总会得到正确的答案),但在实践中它毫无意义(因为对每种可能的组合做判断需要的时间是天文数字)2. 深度优先搜索2.1. 并非逐级建立完整的搜索树,而是沿着其中一个分支构建搜索树2.2. 通过深度优先搜索,我们沿着一个分支往下扩展,直到得到解决方案或者确信无法得到解决方案2.3. 如果遇到困难,那么我们就停止在该分支上的扩展,返回到上一级,选择另外的分支2.4. 深度搜索的主要优点在于不用存储整个搜索树,只需要存储当前正在处理的分支即可2.5. 缺陷2.5.1. 如果选择了错误的分支进行探索,可能会在错误的路上越走越远,永远找不到解决方案2.6. 首先我们得确认哪个分支最值得搜索3. 启发式搜索3.1. 启发式搜索的概念就是使用所谓的“经验法则”来指导搜索的重点3.2. 通常我们也无法寻找到直指正确搜索路径的启发式方法,但我们往往可以在感兴趣的问题上找到启发式搜索方向3.3. 启发式搜索是一个自然而然产生的概念,多年来它被重新定义了很多次,所以争论到底是谁发明了它已经毫无意义3.4. 第一个应用在人工智能程序的启发式搜索来自一个玩跳棋游戏的程序,由IBM的亚瑟·塞缪尔(Aithur Samuel)于20世纪50年代中期创造3.4.1. 塞缪尔使用的是IBM701计算机,只能处理相当于几页文本长度的程序代码3.4.2. 塞缪尔跳棋程序的关键点在于给棋盘的各个位置赋予不同的权重,用以评估对选手而言位置“好”的程度3.4.3. 从直觉来说,某些“好”的位置可能让某位选手更容易取得胜利,而一些“坏”的位置则会导致失败3.4.4. 程序将不同的评估参数整合起来,给出棋盘位置的一个综合评估价值分数,形成一个量化的评估标准3.4.5. 再根据启发式搜索方法来选择最佳的棋盘移动路径3.5. 极大极小值搜索3.5.1. “最坏情况推理”的方法3.5.2. 假设对手的行为会使得自己的得分最大化,让你的得分最小化3.5.3. 是对抗性游戏的基本概念3.6. 大部分早期的启发式搜索算法,包括塞缪尔的程序,都使用了某种特别的启发方式:“尝试—实践—判断”3.7. 20世纪60年代末,美国SRI人工智能研究中心的尼尔斯·尼尔森(Nils Nilsson)和他的同事取得了突破,他们开发出名为A*的技术3.7.1. 在A*之前,启发式搜索不过是一个猜谜游戏3.7.2. 在A*之后,它是一个数学上很容易理解的过程3.7.3. A*现在被视为计算机科学中的基础算法之一,并且在实践中得到了广泛的应用3.7.4. 尽管A*很惊艳,但它仍然依赖于使用特定的启发式搜索:好的启发能很快地找到解决方案,而差的启发就没什么价值4. 复杂性障碍4.1. 图灵发明计算机可能算是计算机科学史上最大的讽刺之一,因为他的本意是证明有些事情计算机永远也办不到4.2. 在图灵的研究成果问世后的几十年里,探索计算机能做和不能做的事情的范围形成世界各地数学系的小分支的研究方向4.2.1. 工作的重点在于把那些固有的不可判定问题(无法用计算机解决的问题)和可判定问题(能够用计算机解决的问题)区分开来4.3. 不可判定的问题存在层次结构4.3.1. 即存在某些问题,不仅不可判定,还是高阶不可判定的4.4. 在20世纪60年代,确定一个问题是否可判定,还远远不够4.4.1. 一个问题在图灵看来是可以解决的,并不意味着它在实际操作上是可以实现的4.4.2. 图灵只是从理论上证实某些问题有解,但是有些问题的解决方式需要消耗庞大的计算资源4.4.2.1. 需要动用的计算机内存大到不可估量,或者计算机的运行速度慢得出奇,能计算出结果的时间遥遥无期4.4.2.2. 期待英特尔的工程师们提供计算速度更快的芯片也无济于事4.4.2.3. 传统计算机技术再怎么突飞猛进,也无法在合理的时间内完成10^29这个数量级的计算任务5. NP完全问题5.1. “NP”代表“不确定多项式时间”5.1.1. 具体的技术定义相当复杂5.1.2. NP完全问题背后的逻辑很简单5.2. NP完全问题的基本结构早在20世纪70年代就已成形5.2.1. 1971年美籍加拿大数学家斯蒂芬·库克(Stephen Cook)的一篇论文确定了NP完全问题的核心思想5.2.2. 随后美国人理查德·卡普(Richard Karp)证明了库克NP完全问题的范畴比最初想象的要广泛得多5.3. 整个20世纪70年代,人工智能领域的研究人员开始利用NP问题完全性理论来研究他们的课题,结果令人震惊5.3.1. 不管哪个领域(解决问题、玩游戏、计划、学习、推理任何方面),似乎关键性的问题都是NP完全问题(甚至更糟)5.3.2. 到了20世纪70年代,NP完全性理论和组合爆炸成为笼罩在人工智能领域的阴影,以计算复杂性的形式阻拦在人工智能发展道路上,使它陷入停滞5.4. 组合问题是一个NP完全问题5.5. 旅行推销员问题5.5.1. 旅行推销员问题和团队建设问题一样,都会面临组合爆炸的难题5.5.2. 如果你发明了一种可以高效又准确解决团队建设问题的方法,那么就等同于你发明了可以高效又准确解决旅行推销员问题的方法5.5.3. 这种神奇的方法并不仅仅适用于这两个问题,而是可以解决所有NP完全问题5.6. 所有的NP完全问题都能共通,可以互相转换5.6.1. 要么所有NP完全问题存在通用的解,要么它们都无解5.6.2. 如果你能找到高效又准确解决某个NP完全问题的方法,就意味着你能够解决所有NP完全问题5.7. 事实上NP完全问题能否有效解决,是当今科学界最重要的开放性问题之一5.7.1. 这个问题被称为P与NP问题5.7.2. 我们还没有明确地证明NP完全问题不可解5.8. 如果你发现自己要解决的问题是NP完全问题,这就意味着传统意义上的计算机技术在解决该问题上是行不通的5.8.1. 从精准的数学意义来说,你的问题太难了6. 人工智能寒冬6.1. 20世纪70年代初,人工智能的瓶颈让科学界越来越沮丧,没有太多有用的核心研究进展6.1.1. 某些研究人员又大肆鼓吹人工智能的未来6.1.2. 当年的研究人员没有意识到正在研究的问题本质上是计算机无法处理的,因而总存在出现突破性进展,使得问题迎刃而解的可能性6.2. 到了70年代中期,批评人工智能的风潮达到狂热的程度6.3. 德莱弗斯选择的报告题目是《炼金术与人工智能》,明白无误地表达了他对这一领域及其工作人员的蔑视6.3.1. 他的某些观点是有道理的,特别是关于人工智能先驱者们浮夸的观点和宏伟的预测6.4. 20世纪70年代初到80年代初这10年被称为人工智能寒冬6.4.1. 更确切地说应该是人工智能的第一个寒冬,因为此后还有类似事件发生