读人工智能全传04NP完全问题

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. 更确切地说应该是人工智能的第一个寒冬,因为此后还有类似事件发生

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/776779.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Renesas R7FA8D1BH (Cortex®-M85) ADC模块应用

目录 概述 1 软硬件 1.1 软硬件环境信息 1.2 开发板信息 1.3 调试器信息 2 FSP和KEIL配置ADC 2.1 ADC硬件接口 2.2 FSP配置ADC 3 软件功能实现 3.1 FSP生成项目 3.2 FSP ADC模块库函数介绍 3.2.1 库函数列表 3.2.2 函数介绍 4 ADC功能代码 4.1 编写代码 4.2 代码…

盘点各个国家的国宝

中国:熊猫 熊猫已有800万年的历史,和它们同时代的动物都已灭绝,大熊猫生存至今成为“活化石”。 俄罗斯:北极熊 北极熊是世界上最大的陆地食肉动物,体型巨大,性格凶猛。 美国:白头海雕 白头海雕…

Python | Leetcode Python题解之第218题天际线问题

题目: 题解: class Solution:def getSkyline(self, buildings: List[List[int]]) -> List[List[int]]:buildings.sort(keylambda bu:(bu[0],-bu[2],bu[1]))buildings.append([inf,inf,inf])heap [[-inf,-inf,-inf]]ans []for l,r,h in buildings:i…

二维树状数组区域查询

落谷4514 过关代码如下 #define _CRT_SECURE_NO_WARNINGS #include<bits/stdc.h> using namespace std; //#define int long longconst int N 2050; int t1[N][N], t2[N][N], t3[N][N], t4[N][N]; int lowbit(int x) { return x & (-x); } int n, m; void update(…

C++ 对象模型 -- vptr 和 vtbl

是看侯捷老师讲解c对象模型 虚表和虚指针的笔记和程序验证。 先看两张关键的图吧&#xff0c;右边的三个基类和派生类 A&#xff0c;B&#xff0c;C。定义了两个虚函数&#xff0c;两个一般成员函数&#xff0c;以及几个成员变量。 只有在类中有虚函数时&#xff0c;才会有虚指…

LT8711UXE2 国产芯片 Type-C with 2lane@8.1Gbps/lane 4K60 USB3.0 在线提供软硬件技术支持服务

2.一般说明 LT8711UXE2是一款高性能的Type-C/DP1.4到HDMI2.0转换器&#xff0c;设计用于将USBType-C源或DP1.4源连接到HDMI2.0收发器。该LT8711UXE2集成了一个符合DP1.4标准的接收器和一个符合HDMI2.0标准的发射器。此外&#xff0c;还包括用于CC通信的两个CC控制器&#xff0c…

深入解析代理模式:静态代理与动态代理的比较及JDK与CGLIB动态代理技术

1. 静态代理与动态代理的区别 静态代理和动态代理都是实现代理模式的方式&#xff0c;它们在实现上有很大的不同。下面是它们的主要区别&#xff1a; 实现方式不同 静态代理 静态代理是在编译期就已经确定代理对象的类型。代理类需要手动编写&#xff0c;并实现被代理类的接…

C++20中的基于范围的for循环(range-based for loop)

C11中引入了对基于范围的for循环(range-based for loop)的支持&#xff1a;该循环对一系列值(例如容器中的所有元素)进行操作。代码段如下&#xff1a; const std::vector<int> vec{ 1,2,3,4,5 }; for (const auto& i : vec)std::cout << i << ", …

免费鼠标连点器有吗?需要付费吗?鼠标连点器电脑版免费推荐6款!

在数字化时代&#xff0c;鼠标连点器成为了许多用户提高工作效率、优化游戏体验的得力助手。然而&#xff0c;面对市场上琳琅满目的鼠标连点器软件&#xff0c;很多用户都会产生疑问&#xff1a;是否有免费的鼠标连点器&#xff1f;它们真的需要付费吗&#xff1f;今天&#xf…

转盘输入法-单独鼠标版本

序 转盘输入法&#xff0c;给你的聊天加点新意。它不用常见的九宫格或全键盘&#xff0c;而是把字母摆在圆盘上&#xff0c;一滑一滑&#xff0c;字就出来了&#xff0c;新鲜又直接。 单独鼠标版本GIF演示 演示软件下载 转盘输入法https://download.csdn.net/download/u0146…

优化LabVIEW代码以提高软件性能

优化LabVIEW代码对于提高软件性能、减少执行时间和资源消耗至关重要。以下是一些具体的策略和方法&#xff0c;可以帮助LabVIEW程序员优化代码&#xff1a; 1. 代码结构和模块化 使用子VI&#xff1a;将重复使用的代码段封装成子VI&#xff0c;提高代码的可读性和可维护性。 避…

为什么https比http更安全

读完本文&#xff0c;希望你能明白&#xff1a; HTTP通信存在什么问题HTTPS如何改进HTTP存在那些问题HTTPS工作原理是什么 一、什么是HTTPS HTTPS是在HTTP上建立SSL加密层&#xff0c;并对传输数据进行加密&#xff0c;是HTTP协议的安全版。现在它被广泛用于万维网上安全敏感…

Python酷库之旅-第三方库Pandas(005)

目录 一、用法精讲 7、pandas.read_clipboard函数 7-1、语法 7-2、参数 7-3、功能 7-4、返回值 7-5、说明 7-6、用法 7-6-1、代码示例 7-6-2、结果输出 8、pandas.DataFrame.to_clipboard函数 8-1、语法 8-2、参数 8-3、功能 8-4、返回值 8-5、说明 8-6、用法…

C语言自定义类型——联合体、枚举

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、联合体&#xff08;一&#xff09;、联合体的声明&#xff08;二&#xff09;、联合体的特点&#xff08;三&#xff09;、联合体大小的计算&#xff01;&a…

提取重复数据

直接上控制台代码&#xff1a; Module Module1Sub Main()Console.WriteLine("请输入数据&#xff0c;以""&#xff0c;""相隔&#xff1a;")Dim str As String Console.ReadLineDim result From x In str.Split(",")Group By x Int…

【吊打面试官系列-MyBatis面试题】MyBatis 实现一对一有几种方式?具体怎么操作的?

大家好&#xff0c;我是锋哥。今天分享关于 【MyBatis 实现一对一有几种方式?具体怎么操作的&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; MyBatis 实现一对一有几种方式?具体怎么操作的&#xff1f; 有联合查询和嵌套查询,联合查询是几个表联合查询,只查询…

Springboot助农农产品销售系统-计算机毕业设计源码16718

摘要 SpringBoot助农农产品销售系统旨在通过利用SpringBoot框架开发一个便捷高效的农产品销售平台。该系统包括用户注册登录、商品浏览、购物车管理、订单生成、支付功能等模块。通过整合支付接口、地图定位、推荐系统等技术&#xff0c;提供给用户更好的购物体验。本文介绍了…

宿舍报修小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;基础数据管理&#xff0c;论坛管理&#xff0c;故障上报管理&#xff0c;新闻信息管理&#xff0c;维修人员管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;新闻信息…

B组亚太赛数学建模

问题1 1.对训练数据集进行数据清洗&#xff0c;处理缺失值和异常值。 2.采用散点图作为可视化手段。 3.采用皮尔逊相关系数进行相关性分析。 4.提出预防措施。 问题2 1.采用k-means聚类算法将洪水概率分为高中低三个群组。 2.通过线性回归模型计算特征权重。 3.选择特定…

SpringBoot | 大新闻项目源码打包

对于一个完成好的后端项目&#xff0c;如何进行打包发送给其他人&#xff0c;在电脑上进行查看 1.在pom.xml添加&#xff1a; <build><plugins> <!-- 打包插件--><plugin><groupId>org.springframework.boot</groupId><art…