好同学们好,我们开始上课。呃,上周四呢?那个就是字节挑的公司啊,发布了那个豆包,深度思考一点五这版本的模型。那么我觉得还是非常强大的,那么这里呢,给大家先介绍一下。那么首先呢,我们从这个评分来看啊,就是最左列这个深蓝色的就是豆包一点五的,它的一个评分。对吧,总共有四类测试, 第一类测试呢,就是数学就。三个AR me相关的就是数学能力的一个测试。第二个呢?就它的编码能力的测试就编程,让它去编程编码能力测试。那后面两个呢?就是它的一个科学能力就是物理啊,化学其他的一些非数学的那些科学领域的一个测试,那最后一个呢?就是我们通用人工智能测试那会发现啊。这个豆包一点五模型还是非常强大的,那么在数学领域那基本上就是或多或少可以和那些最前沿的,就我们经常讲的搜塔sota嘛。最前沿的那些模型能力相仿, 对吧?然后呢,更值得吃惊的呢,就是说在通过人工智能模型里面,它测试里面,它居然是把其他的都打败了。就远远超过了其他两,其他的三个竞争者。所以这个呢,就带来两个思考,第一个思考呢,就是说我们整个人工智能啊,大模型的发展进度非常快。所以呢,我们一定要走出课本, 走出课堂,多看看一些行业里面的一些新的产品,那这样的话对大家不管是学习还是以后的职业还是生活。都会有比较大的帮助,这是一个那第二个呢?就是说。这样的一个豆包的一点五的模型,那么其实像更加通用的人工智能又往前迈进了一步。所以呢,我是把这样的一个逗报一点模型呢呃,把它就是说适当夸张一下,把它叫成是叫睁眼看世界的聪明AI。有两个方面,第一个呢是睁眼看世界。那么这个呢, 主要是讲它是有一个多模态的能力,以前的话,我们讲deep seek它是依赖于文本输入的。对吧,它是对我们的文本书的文本进行解析解读,然后再基于这些文本再做一个逻辑推理,再做一个这样的一个输出。而豆包呢?这样的一点五模型一会儿会演示一下,它有一个非常强大的多模态功能,你可以直接把你的一张照片。输给他,或者你直接把你的作业题拍照输给他,那他会自动去给他解析,自动去给他解读去推理。 那这个能力就非常强大,结合我们之前讲的物联网对吧?就是说我们如果前面有一个传感器,它可以实时的去采集我现实中的这些照片。甚至其他的一些视频啊,一些音频都采集到了,那么这样的一个深度思考模型啊,会直接把这个输入直接输进去做推理。不需要我们再去转成文本,让它去读了,那么大家可以试一试,比如说我们在deep sick用它官方版本的模型,你给它输入一张图片。它是有可能是解析失败的,因为有可能图片里面是没有文字, 没有文字的话,他不会去感知,比如说这是棵树。这个座位他不会去解读,那这呢,相对来讲就是说官方版本deep seek呢,一定程度上它的多模态能力是比较弱的,而豆包呢?很好的把这个缺点补足了。就虽然说我们deepc卡它那个就是说呃,能力不是目前来看并不是可能都是顶尖的,但它出现时刻是最炸裂的。对吧,所以deep。那么刚好呢? deep seek现在的法定代表人培田是我们电力学院毕业的。对,我们都知道梁文峰,梁文峰的话,他相当于是创始人,但现在的法定代表人是我们电力学院的毕业生,培田。啊,稍微插一句啊。而豆包呢?它也是我们国内就是说之前呢,很多那个其他模型啊,包括那个,比如说腾讯,它的iMac or palette里面它自动集成了deep seek豆包呢, 它是唯一的国国产里面的模型中啊。没有去集成deeps的,它更加呢,可能走一种原始的创新的路。所以呢,就是说可以看到效果还是很惊艳的,让它参考借鉴了很多deep seek的一些底层技术。那么一会儿会具体讲,所以呢,就是说我把这样的一个豆包业务模型呢,叫成是睁眼看世界的聪明AI刚讲的是第一个呢,睁眼看世界。它是有一定的多模态能力的,可以直接对我的照片进行处理,它就睁眼了。 第二呢,它是一个聪明的AI。从这些评分来看,就是说它一定程度上,它已经超过人了。对吧,他比我们想象的更要聪明,那么比如说我们一般的水平呢,做这样的一个数学测试,以博士生为例,可能就到五六十分。那AI呢?它其实是远超于我们这些,就说人类的,但也有一个思考, 就这里面的话,就是说我们依赖于这些,就是说固定化的题库。去判断一个AI聪不聪明,一定程度上是不够的。对吧,就是说你光会做高考题,考满分750,但你以后一定有用吗?不一定,所以现在的问题呢,就是说我们之前讲的图灵测试。对吧,想区分人和机器,那么也要设定一定标准, 那么现在标准呢?是基于这些这样的一个测试集。那其实不够的,所以这样的一个研究方向就是说如何去判断这个AI是不是足够聪明?对吧,我们可能根据我们具体的应用,比如大家想,比如说把AI用进来,我们去学习,那么你应该设定一个,就是说你自己感知到,或者说你自己设定一个这样的一个测试集。就来判断AI是不是聪明,并不是说他那高考考的满分决定聪明就能够适应你自己的独特需求的。这样的一个相当于更加细分领域的一个测试, 这样的一个标准才更加实用的,目前呢,还是用的这样的一些通用标准。所以现在的一个比较潜在的研究呃,研究热点呢,就是说怎么去对有一个细分的应用去判断?这样的AI是不是聪明?你要去设定一定的标准。那么继续来讲,就是说那个豆包一点五呢,它还有一个就是说优势呢,叫那个低延迟。就它的那个延迟啊,差不多是在20毫秒左右,就是说它可以快速的去响应, 那么一定程度上呢,也可以跟我们互联网,物联网结合起来。对吧,我前面有一个传感器,对吧?感知到了一张图片,那么传给这样的一个深度思考模型,那么它很快可以做出反应。那么就更好的可以去,让我们去跟我们的现实世界进行互动。那么具体来看呢?这样的一个豆包业务模型。先讲一下它的一个优势,优势是什么呢? 它参数量差不多是200 BB呢,指的是building就11个参数。差不多,它是有2000亿个参数。对啊,200b。而deep sick呢?满血版deeps差不多是那个671b。对啊,而且。就相当于就是说6710。e个就b值b例码11个。那么,另外一个指标就是说,它的激活参数那豆包一点五呢? 是20b就200亿个参数deep seek呢?差不多是在370亿就37b。可以看到,就是说它参数量其实是比我们满血my deep seek啊,它降低很多的,降低很多有两个好处,第一个好处呢,就更加方便去部署。它轻量化了,对吧?你不需要那么多的那个显存内存,这一个第二的话就是它的那个,就是说训练成本呃,训练成本和能耗也降低了。对吧, 就是说我参数越少,我训练越容易,那么我的耗电量,我的能耗也越低,所以这是它的两个优势。那么再解释一下,什么叫参数量?对吧,我们大模型呢,就好比是一个大学,我们浙大有很多院系,对吧?但是呢,这些很多院系呢,就是说都有自己的一些任务, 就好比是就是说。我在这里面各个学院都都是一个专家,每个学院代表专家,所以它采用的是这样的一种混合专家模式,对我们学校相当于是有很多学院,每个学院是个专家。就有这样的一个概念,然后呢,比如说每过了一个任务,比如说我们国家,我们省里面给学校布置个任务,这时候呢,我们学校并不需要所有的院系都参与。比如说一个和那个,比如说我们电气工程相关的任务, 可能更多的是和我们电气学院自动化学院呃控制学院,或者说资源学院相关。那么,这些相关的这些部分,那么我们就认为它是要一个激活参数。就是我在做大模型,学习训练过程中,尤其做推理过程中啊,我真正要用到的那些参数,我们认为是就把它激活了和激活参数。所以可以看到,就是说虽然总整个的参数量很大,200币对吧?真正激活的就只有20币。就好比如说假设我们学校有40个院系, 对吧?每个任务呢,我就抽其中四个院系。对吧,那这就是我们的激活参数和我们的总参数的这样概念。然后这里呢,用的是一种混合专家模式,对吧?相当于什么呢?相当于就是说每个任务,比如说我们抽四个院系来完成。那四个院系呢,它的特特长都不一样,比如说我们电气工程学院,那么更加擅长的是一些我们电力对吧电电子相关的一些。 一些那个学习或者说一些科研任务,对吧?那就是说我们这个它每个专业都有特长。计算机学院呢,可能更多的是和我们人工智能的一些真正的技术应用技术相关,那么它有自己特长,就每个专家特长不一样。然后这个时候呢,就是说我们有一个任务,那么每个专家各抒己见,对吧?从自己角度提出解决方案,然后再由模型来混合,形成一个最终答案。就采用了这样的一种混合专家模式, 就激活少部分专家啊,再由他们的一个结果来综合进行最终答案。然后另外呢,这样的一个豆包一点五跟我们deep seek其实一样,采用了一种叫边想边搜的这样的方式。所以他会自己推理啊,就大家用deepc可以看到他有一个他有一整串那个推理过程,他一边想噢,我可能要怎么怎么考虑,然后一边再去搜那这方面的成果,哪些知识有哪些?我再去决定我这样的一个答案对不对?对它有一个自我批判过程。所以这样的一个逗包,一点五呢也是, 就是说它通过这样的一个全号学习来做一个边想边做的过程,而最终呢,就是说。他看起来更加像是一个聪明的人。就我们。比如说和deep seek啊,或其他的一些大模型对话,以前的话都需要通过一些提示词,有没有相对固定的结构,比如说相当于就以前有很多那个网上的。那个就教程啊,教大家怎么去设定这样的提示词就prop。就这样,提示词就以前大模型呢,更加的相当于是那种比较呆板, 就你必须通过这样的一个结构化提示词告诉他,你想要干什么?你想要输出什么?那这个呢,是以前的一种方式,所以过去一两年呢,这个方式很火,那么等到deep seek出来之后呢?它自带了这样的推理功能,所以它更加聪明,就好比什么呢?它是一个更加聪明的一个伙伴,你不用跟他讲特别多这么多这么多,那个结构化的这样输入啊。你就告诉他你要干什么, 对吧?他自己通过这样的一个强化学习来推理,那这里面怎么做怎么做怎么做,所以现在来看呢,就是说这样的提示词相关教程。就不是那么的适用了。那么后面有时间可以再给大家讲,到底怎么真正和我们的deep seek这样大模型啊?进行对话,那么这里面豆包也是一样的,就它是一个要聪明的人。你只要告诉他,你想要达成什么目标,对吧?就会告诉他其他一些细节过程, 就不需要用这么多结构词告诉他,比如说假设你是一个学生。你有什么什么东西不需要,他会自己帮你带入场景做推理。所以整个的这个过程呢,就是说更加的丝滑,对你就告诉他,对吧?你要做什么?他自己通过自己的视觉处理,对吧?多模态的功能。那么,包括他自己的快速反应能力去帮你实现。那么我提前录了两个视频, 大家可以看一看这视频呢,可以看到很多个问题和一些那个潜在的一些。就探索应用。就目前呢,这样的一个豆包,一点五模型呢,可以在那个火山方舟这样的网上就直接可以调用那火山方舟呢,它是一个比较好的大模型平台。你可以去集成很多其他的大模型,比如deep。然后这个呢,就是一点五版本的最新版的应用,它有两个,第一个呢叫那个主线模型。我说话暂停一下啊。 对它有两个。都是那个4月15号发布的。那第一个呢,相当于就是说它最主流的类似deep seek一样的,它只支持这种文本的输入,那么还包括一些比如说PDF,它主要处理这些字词文本。那第二呢,就是我们多模态。它有一定的,就是说视觉推理,这里给它输入一张照片,一段视频。那目前呢,主要是出照片为主啊, 那么他会自己去解读你的照片里面有什么去帮你,就是说补足那些文本书的不足。那这样的话更加便捷。所以我们这里呢,主要展示的是我们多模态的这样功能。比如说我们选择这边啊,多模态。那么我这里呢,主要做两个测试。就我上传一张照片。第一张照片呢,是我之前爬山对啊,去我们马家坞这观景平台爬山拍的照片拍的呢,是北高峰。这样的一个侧影, 那么我就问这样的一个豆包大模型,我说这个这是哪个城市的哪座山?对吧,没有任何提示啊,其中没有任何字啊,对吧,就我就这样的照这张照片,我就从那个马家坞的一个角度拍这北高峰。对吧,看起来只这只是一个非常小的一个缩影啊,哎,你看很聪明。对吧,他从这个推理上能看出来这是杭州的北高峰,对他有些逻辑啊, 比如说我考虑他能考虑到山顶有通讯塔。对吧,然后再综合它的植被的一个特征。对吧,就可以分析出来,这是北高峰。对,我没给他任何问,就任何文本提示他是完全通过这样的一个视觉推理推理出来的。那么,我们再用这样的一个就是说。火山方舟的这样的一个多报一点五模型。那这次呢?我是给他输入一道我们的题目,就之前的作业题啊。 就是我让他直接对我们图中的题目进行解答,大家以后可能也是可以同样这样操作,对你就把作业题给他拍个照发给他。对,我让他给出这其中答案。图中答案。对吧,然后再给出这个过程是这样一个题啊,是我们搜索问题,对吧?我们后面会讲到的搜索。那么你可以看到它的这个过程呢,还是比较规范的。对啊,这个会讲就说一步两步怎么做? 所以呢,就是说大家以后做作业啊,可以用大模型来帮助大家来学习,来处理,这没问题,但是一定要知道它存在幻觉。那么我们一会儿会看到,所以你要去辨别它答案到底对不对?那比较好的方式呢?就跟着他的这个思路去理解我们的这个知识点,对吧?我们有很多个知识点通过这个知识,它的一个过程呢?去串一串一下。然后真正的以后再自己根据这过程去体验一下, 去做一做。然后他给的那个答案也是头头是道。但是呢,很不幸这单不对。对吧,这三个题答案呢?有两个是不对的。所以呢,我相当于就是说我又那个重新把它那个刷新了一下,让它就是重新去生成这过程。那么,他再一次的给了这推理。就我第一次发现我答案不对,因为我知道答案。对吧, 所以我觉得他答案不对,我觉得他是不是就是说很多时候就是说他自己的内在推理啊,他是因为概率性的结果嘛?我就想就是说重新试一试,给它重新生成一下,看它会不会有一些改变,那么一会儿一会儿会看到它,确实答案变了。但这过程呢,还是非常严格的,一二三四怎么做,对吧的思路也是可取的,这答案不对刚才。对吧,整个过程, 它的就是过程非常详细,那么里面有很多个地方值得我们学习。对吧,它这个推理过程其实是非常那个繁杂的,虽然题目简单,但给的过程非常完备。呃,这次就是说它答案比刚才要更加对一点。对吧,就明显感觉这个答案跟刚才是不一样了,对吧,因为像第一个题答案呢,它变了,那第一个题呢,它是多个解的。 它这里只给了一个解,这个解是对的,上次给的答案也是对的。然后第三个呢?就是说他这次给答案呢,比上次要对,因为我们成本啊,就在后面,我给大家发一下这题。那算成本,这算出来成本呢?是11刚才给答案的成本是12,因为我是提前知道这些答案是。如果你有提前知道这些参考答案,就可以知道刚才的那个模型成的几啊, 它不对,所以又重新生成了一下。就两次,它的答案是不一样的,那这个呢?也是一个就它有本身,它的一个概率推理。导致的这样的一个幻觉问题,所以大家呢,也不能去盲信盲目的相信这些,那个大模型啊,它答案不一定对,那怎么去规避这样的一个后果呢?就怎么让它更加对呢?那么, 两个方面,第一个呢,就是说你不停的去给他那个试对吧?你比如说你自己给他跑个十次。如果八次答案形成了共识,有八答案是一样的,八次答案是一样的,那么就认为这可能是一个正确答案,因为大模型本质啊,它是一个概率统计过程。对不对?对它概率统计,那我相当于就不停的抽嘛,不能抽样,对吧? 抽的次数足够多,情况下它的一个正确答案一定会出现。就正确答案的次数一定是最多的,从这个角度呢,就是说你可以对同一个模型多次去这样做一个解答。对吧,比较它的最终答案来选择,其中覆盖面最多的这样的一个答案,作为最终解这一个,那第二个呢,你可以用其他模型来帮助他。对吧,比如说这是那个豆包一点五,那么你可以用那个deep seek,你可以用其他的都可以试, 你用其他的就是说。四五个模型做同一个题。他的思考过程,如果觉得是对的,你自己可以看看思考过程,然后最终再看,然后再看看答案也是一样的,这答案中就是出现次数最多的答案。很有可能就是正确答案。因为它本质上是一个概率推理问题,虽然我们刚才讲的是它是基于一个混合专家模式啊,它混合专家模式呢,它里面有一定的就随机抽样在里面。那举个例子,比如说我们。 讲比如说那个抽样,比如说抽的是那个举例子啊,比如说我们在。零和一之间,我做这样的一个均匀抽样是吧?如果我认为抽到的一个数,比如说一个。呃,比如说这个x吧。如果x。比如说小于等于零点四。我们认为它是结果a。那如果x。x在零点四和一之间。我们认为是b。 因为这过程它是随机抽的。它只是有40%的概率。落在a60%的概率落在b。真正的时候呢,真正的你做操作时候呢,你不知道它到底是a还是b,它只是一定概率呈现,那可能我们这里面必须正确答案。但它也只有60%的概率在b,所以它是一定的概率叠加,所以并不是说就是说我单取答案,它一定会抽到b。对吧,它里面其实是一个随机抽样过程,可以这么理解它, 只有60%。出现b那另外40%呢,可能是错误答案a那我多次抽多次抽多次抽,那我会发现我真实答案啊,真正的正确答案啊,它无限的趋近。正确答案,因为你就说它有一定的,就是说众数在里面嘛,大数在里面,所以呢,这个呢,也是我们概率统计里面的。它的一个就是说一个窍门吧,你不一定去试, 那有可能会试到最优解。那另外呢,就是说要注意一点,就是说我们大模型啊,其实现在也是真讲过是一种百团大战的,这样的格局。对吧,我们比如说看到我们这里面,比如说豆包一点五或之前的deep seek都很强大,但这是什么呢?他们主要是基于一些主流网页的。主流的一些参考资料的这样一个检索结,它的一个大模型推理和检索成果,那么其实还有很多呢,比如说我们的社交媒体, 比如说我们的微信。要我们微信有公众号,但这些公公众号呢?这些那个公众号的文章,它其实是封闭的,你不能通过外面的资源去调。所以腾讯呢,自己出了一个大模型,叫混元,它的优势呢,就是说可以去调这些,就是内部的这些,外面不公开的这些。公众号文章对我们直接搜的话,比如说搜谷歌, 搜百度很难搜到这样的一公众号文章,那其实对我们大模型来讲也是一样的。比如说你只能通过那个微信里面的搜一搜,才搜到这些公众号文章,其实是这样的,就是说它的一个生态。其实是两个生态是隔离的,一个是我们公开的开源生态就主流生态。找个粉笔擦啊。就它有一个是主流生态,一个呢,相对来讲是封闭的,比如说我们的社交网络,它是一个封闭生态。比如说我们主流生主流的, 比如说我们各种网页,各种公开资料,那么一般来讲,比如说通过我们的deep seek,对吧?包括豆包,包括其他的,比如gpt。它是一个,那其实这是不完备的,就是我们整个信息空间里面还有很多这种相对封闭的,对这种社区的社团那种生态。那比如这里面就是说,如果主流加上我们的,比如说我们社交媒体。 对啊,这deep seek呢,很多时候不知道社交媒体里面资料的,因为他只是更加关注的是这主流的,那么这时候呢,比如说我们用我们腾讯的。公园大模型。那同样大模型呢,可以解决我们的微信这样的一个生态的问题,那么在比如说国外那个twitter x,那么他们呢?自己有一个g Rock。观后模型。就它的优势啊。就是说可以对这些那个社交网络里面的一些闭源的生态, 它可以作为快速的处理。所以就是说他们之间的竞争呢,一定是比较错位的,更有优势,可能单个看,比如说会员也好g也好,跟deep seek跟gpt比。比不了它的一个优势是什么呢?它有这方面的社交网络,信息渠道,你只有通过这个活跃大模型,你才能去调这些,比如说公众号文章。通过这个g Rock,你才能调x里面的推文。 对吧,所以后面的话,我觉得整个的一个发展格局一定是就是说他们之间啊,会更加进一步的融合。包括我们可以做很多个,比如说工具或智能体啊,把这些工具啊统一用起来,那最终呢,可以实现一个一+1大于二的效果。所以这边呢,稍微科普一下。然后我们接着看我们上节课的主要内容。上节课呢,我们讲的是无信息搜索,或者说它是一定程度上的一个盲目搜索。 就它没有其他的一些提示,只能根据我们题目给的设定去做这样的一个简单的搜索。那么,重新来回忆一下。对啊,我们这样搜索问题,它其实是一个经典的,一个现实变成一个理论的问题,那么这里面呢,有两个步骤比较关键。第一个呢,就是说我们一定要设定一个比较好的目标。还有一个go。那第二呢,就是我们一定要对我们的整个问题进行设定, 对我们要知道。实现这个目标,我们需要求解的问题是什么?知道问题之后,我们才能去决定这个目标怎么去实现。对吧,我们的问题呢,一般来讲可以分为五个。组成对吧?首先呢,就是说我在哪里的初始点?对吧,知识点。叫initial state或者说state state。第二个呢, 就是说我的一个动作集合。对啊,我的actions。这里面的actions呢,一般是给我们的状态,动作跟状态,它是一个强力捆绑的关系,就说我在每一个状态下。能产生的动作集啊,它可能不一样。就好比什么呢?我有两个状态,对吧?这这第一状态。那么, 通过某个动作。可以到第二状态。就这动作啊,跟状态是捆绑的。对吧,然后通过这个动作到下一状态呢,整个这个呢,我们造成是转移模型,这个呢,就通过我的重动作转移到这状态了,所以它它是一个转移。condition对吧?所以有了这样的一个概念之后呢,我们的问题里面还要去设定。我这样的一个转移关系是什么? 呃,通过一系列动作转移,那最后呢?我们来判断我们这样的目标有没有达成,就它里面会有一个目标测试。ego test对吧?就是说我有很多目标对吧?我要去判断我当前状态。能达成目标,比如说我们文科的目标是大家通过考试,对吧?大家可能通过一系列学习,那最终判断。到底能不能通过考试呀?这就是你的目标。 所以第四个呢,是我们的目标测试,那么其实这里面还有第五个。就我在这过程中的它的一个成本。或者代价是什么?同样,比如说通过这门课的考试,那么你可以比如说花的时间可能比如说你这考前复习一周也是你可以选择,比如说从第一节课到最后一节课都好好听。他的目标都通过考试。这没问题。但是呢,你在过程中的代价是不一样的,那么在我们这样的搜索问题里面也是一样,对吧? 我们有很多条路径能够从我们的一开始的。从一开始的我们这样的一个初始点。对吧,但我们最终的它的一个目标点。那这是一条路径。对吧,那这也是一条路径。那这几条路径。它有很多个路径。所以我们讲的我们的解啊。解的话就是说是从我们的初始点到目标点,它一切状态的一个组成,它有一个顺序组成,它有一个sequence的actions。那这里面呢? 也是,就是说我有一条路径能够从我们的出生点到我的目标点。那这个路径就是一个解,但在过程中啊,可以发现有很多路径。对吧,每条路径呢,它的成本是不一样的。对吧,成本是不一样的。那么,我们在这里面选择一条最低成本的路径,那么这个路径呢?就我们讲的最优解。就是解很多个对吧? 这些都是解。比如说都要通过考试,对吧?目标通过考试。那这过程中呢,有各种学习方法。那每种方法都能通过考试,但是呢?肯定会有一种方法是最好的。对吧,最省时最经济的对不对?那目标呢?比如说我们之前某我们这个目标呢?比如说是通过考试,那么可以设定其他目标, 比如考那个100分对吧?那100分的话就不一样了。因为你的目标变了,你的这些整个的这些路径啊,也会跟着变,你的这些动作也会变,所以呢,就是说目标的好坏也很重要。选择一个合适的目标来设定一个问题背景,然后再去做求解。啊,最终得到一个最优解。在这里面记住,就是说目标测试很重要,那目标测试的情况下呢? 有两个需要注意,第一个能不能就是说达到目标,那第二呢?你可以根据这些路径上的成本。对吧,路线成本来决定当前这个目标是不是更好了?那我们继续往下看。那这个呢,都上节课讲过内容对吧?再回顾一下。就问题的五要素对吧?初始点动作集合转移模型目标测试路径成本。那么,根据我们这样的一个问题设定呢?我们去可以构建这样的一个状态空间图, 那状态空间图呢?有两个组成部分,第一个部分呢,就每个节点。对吧,每个节点呢,我们认为它是一个状态,那状态呢,又可以认为是我们整个世界的。一个抽象。就我们每个节点啊,都可以是个状态。那这状态呢,可以认为它是一个,就是说我们如果是把我们整个世界啊, 当成是一个世界模型,它是个参数化的,对吧?其中一组参数设定。就对应了我们这样的一个节点。那这这个节点呢,就是我们整个世界的一个状态,那怎么理解呢?比如说。那我们跟人跟世界啊,它是一个互动状态,对吧?比如说我们现在在杭州,我想去上海,那么可能我在上海的状态, 那世界的某个参数跟着变了。对吧,那这状态呢,就可以认为它是一个世界的一个缩影,它的一个参数化的设定,那么我们把它也可以称为是一个状态,一个节点。这是一个就说它是一个对我们世界的抽象,之后的一个参数化的设定。第二个呢,就是说我们这里面呢,有很多个连边一般呢,是有向箭头这箭头呢,代表的是我的一个动作转移状态,转移的方向对吧, 因为发生这个动作。状态从这一点到这一点,有向箭头那这里面呢,主要是讲两个,它有两个相当于就是说相对来讲就是说可以替换个词啊,应该叫link。那么后面呢,还会看到一个词叫arc。本质上是一样的,就这样的一个转移关系,对吧?它们之间的连边。t.那么,在我们后面讲的数搜索里面呢? 还有一个词叫branch对吧?其实也是一样的。就是在不同语境里面啊。它的意思是一样的,对吧?比如说我们后面会讲那个树搜索,那么它里面会有这些枝干,那枝干呢?就是这样一个转移关系。那么我这里面提前讲一下也是也是一样的,它其实是指的它们之间连边,所以同一组词代表意思是一样的。就大家以后看那个教材看论文啊,会发现这些词很多时候会混用。那么, 另外值注意的呢?就是说。整个这个世界模型里面,我们可以构建出一张比较完整的这样的状态空间图,但是很多时候是没必要的,我们只需要关注我们关注那部分。对吧,它是只需要有线的,不然的话存储量太大。那第二呢?每个状态,它只出现一次状态之间啊,它是互斥的,就好比我们整个世界的设定啊。都是不一样的对啊。 同样的位置,对吧?可能因为其他东西改变了那整个世界是不一样的。所以就是说每个状态只出现一次。那么,上节课举两个例子,第一个呢,就是这样的一个吸尘器,那第二个呢,就是这样的一个八个数字的,这样的一个书迷。那么,这里的一个。要知道的一个解呢,什么叫解呢? 就是说我们从我们的初始状态。到目标状态,它的一系列的动作转移。那么,我们把这样的一个动作转移呢?造成是一个解对吧?比如说我怎么操作这些?这些词片那会发现,操作词片的过程就是一个动作过程,对吧?我是发我就相当于我发生了一些动作。让我的整个状态发生改变了,那最终的状态达到这样目标状态,那么整个过程呢?最终它是一个解的过程。 那么,也根据统计,就是说有一半的初始点达不到最终的目标点,所以很有可能它的解是无效的或没有解。所以这个呢,也值得注意的。那么,再看一个经典例子。那这个例子呢?就是我们的就是说地图上的一个路径寻优问题,对吧?我要从比如说我们这里面的。a点a乘到这里面b乘。对吧,首先呢, 我们可以把这样的一个动态空间图出来,对吧?那我会发现那基本上跟这地图啊,是非常像的。对啊,这个地图一定程度上就代表了我们这样的一个状态空间。对吧,我们看看是不是?第一个,每个节点。对吧,代表的是一个它的一个呃问题的设定,就整个世界的设定,对吧?a×b乘。 在我们世界中,可能就是两个,就是说这样的一个状态。是吧,然后动作呢,就是说我从。这时呢,这个城发生的一些动作,这条路过去啊,他们之间有一定的,就是说动作转移关系。对吧,他们之间有路,我们就可以从这个城到那个城转移过去,所以这个连变呢, 代表着他们之间的转移关系。那么另外呢?这上面很多个代价对吧?比如说我从那个a城到s城,它转移成本,那比如说140。从a城到t城,它的一个路径成本呢,可能是118,就是它可以把我们很多的这种。现实问题抽样成这样的一个图的问题,那么这张图呢?刚好就是我们的状态空间图。那我们再对应一下我们的整个的问题,设定五个要素。 对吧,我们在这样的一个状态空间里面有20个城市,那么我们的初始点呢是a城。对吧,我们动作集合呢,就是我可以通过我的,比如说我开车从这个城到那个城,这个城到那个城去转移,那我会发现。它的动作啊,其实跟我们这个当前状态是紧密相关的,比如说我在b城,我下一步动作啊,只能去u城g城。p层和f层, 它不能是h层,因为它们之间是不连通的。所以我们讲就是说他们之间有个继承关系啊,一定要去直接连接你才能去转移,对吧你比如说b城和h城,他们就直接连接关系。那就可能就是说不能下一步直接到就它下一步可达的,一定是可以直接连接的那些点。所以这是一个我们再往后看。对我的转移模型,就是说我从当前的城市采取动作到下一城市,这关系呢,就叫做是一个转移模型。我再往后看。就说目标测试, 我整个这样的路径搜索的,它的目标是什么?目标是我要能够到b城。对吧yes or no的问题。对吧,比如说我通过一系列路径寻找。那么,最终能够从a城到b城,最终到b城了,那么就说明我达到目标了,那么我们从这张图上来看。有很多条路径,比如说我从a城到s城到f城到b城,这一条对吧?我从a城到s城到r城到p城。 到b城也是一条,那么我甚至我绕过弯,对吧?从a城到o城到s城到f城再到b城,它也是一条。所以会发现啊,就是说我们这样的一个解啊,它很多个。那如果我们考量一下我们整个的一个路径成本呢,比如说我们这里面它的路,它的一个里程数是不一样的,对吧?一百四九十九都不一样。那我们如果算一算,在我不同的解的上面去把它这些路径成本再叠加起来算一算, 然后再比较一下,那会发现。它有一个最优解。对吧,比如说我们这里面最优解,那么可能就是。总的a权到s权。到r城到p城,再到我的b城,它可能这样的一条路径。对吧,这路径为什么最优呢?因为它相关的一些路径成本最小。所以这是我们这样的一个路径搜索问题。那么, 我们再往下看。就是说我们刚刚讲了很多,就是说我们这些状态空间那状态空间呢,是我们的状态构成的。那我们做问题的第一步,对吧?把这些事件模型抽样成一个我们能够用的模型,对吧?我们需要去把那些无效信息啊,给它部除掉。我们只关键就我们只考虑我们。所关心的那些数信息,那比如说以这样的一个智能游戏来看,那么它里面如果我们考虑是整个世界模型啊,它里面会把各种细节都包含在里面。 对吧,我的那个位置,我的豆子大小,大豆小豆,我的豆在不在?在什么位置?包括我这里面障碍物。各种细节都有,但是呢,对于我们不同的问题啊,我们可以做的抽象不一样,比如说我们第一个,我们做一个它的一个路径搜索问题。对,好比就是说我的制作人要从这个点, 比如到这个点。对吧,那我们只需要关心什么呢?只需要关心影响我这解的结果的这些量,那这里面主要是就是说它的那个位置信息。因为我只关心从这一点到这一点,对吧?我可以无视其他的任何东西。对吧,我只关心这些坐标就行了。然后它的动作什么呢?动作就是说我可以采用的一个上下左右的,这样的一个工作就往上走,往左走,往前走。 那么最后呢?我们要。就是说我能不能从这点到这一点?所以说我们可以对整个问题啊进行简化,只要我能够到这一点,对吧?我前面的设定跟它相关就可以了。所以我们可以极大的去简化。那这是一个数,那个路径搜索问题,那另外一个问题呢?就我们目标不一样,就我们目标好坏啊,会决定我们整个的。芥末的颗粒度, 那这个目标呢?相对来讲可能要激进一点,对吧?所以说他要吃豆人,要把所有的豆子都吃掉。那这时候呢,我们需要做的。又抽象什么呢?第一个就还是一样,我们要把我们的这个状态定下来,在这里面呢,不光是它的一个位置了,就它当前的位置是什么?就很需很重要,那么还需要知道, 就是说我每一个豆的它的一个状态,这个豆被吃掉了,还是没吃掉,所以它有一个就是说澳元变量来代表我这样的一个豆。他到底在还是不在?那动作也是一样的,我可以上下左右随便走。那最后呢,我的目标是就是说我看看是不是所有的豆都被吃掉?就它不光要走,走的时候呢,还要去看我这个豆到底在不在?那所以这个问题呢?比刚才的问题要复杂一些,它的整个状态空间啊, 更就更大,它的搜索过程啊,就更复杂。那么,我们来看一看,就是说我们做这两个方向的抽样。到底有什么好处?那如果我们把整个世界模型写出来呢?那么它的一个状态,它是爆炸式的,对吧?首先呢,我的这个吃豆人。能够出现的位置,它是120个, 对吧?逗的状态30个,逗那么它的状态就二的30次方。那再往后看,这是我这个还有一些那个鬼怪鬼怪,可能有12个对吧?12个它的出现和不出现。那么,在12的二次方,然后另外呢,它车轮朝下,它朝左朝右,对吧?朝上朝下,它也是很关键的一个状态量。 对吧,那这里面呢,就说整个算起来,如果我们把整个的所有细节都涵盖了这个世界构建出来,那么需要这么多个。状态量来表示那么这么多个明显,就是说我们很难去存储啊,就是存储的很大,所以呢,很多时候是不需要的,那根据我们的问题来简化。那如果我们只做一个路径巡游问题,那么我只关心我当前车轮的位置,那么车轮出现位置呢?120个。 对吧,所以我们可以把其他无效信息啊删掉,我们只保留这一二十个位置,做它的状态量。那么,如果我们关心的是,就是说不能够把所有的豆子都吃掉,那这时候呢,我们只考虑两个,第一个呢,就是我们当前制作人的位置。它能够出现在120个可能的位置,然后乘以那些豆子的状态,豆子状态呢,就二的30次方。 对吧,我们比较一下,从这个到这个,那极大的简化了,从这到这个呢,也后面极大简化了。所以呢,就是说我们可以根据我们的需要对我们的问题进行简化,而不丧失它整个解的一个精度。那么,如果做一个搜索问题呢?我们一般来讲呢?我们是可以构建出一些相关的一些搜索树。刚刚讲过对吧?这不认识, 就是树里面的一个枝干。那搜索树呢?相对来讲有点反直观,就它的搜索数啊,它是倒过来长的。最底下呢,是它的叶子。对吧,最上面也是它的根,就我们一般呢,是把它扭转过来,比如转个180度,对吧,从根往上长叶子那搜索树呢?为了便于我们的一个就是说。 呃,数学习惯它倒过来写。上面是根。那么下面是叶子,那根代表什么呢?根代表的是我的处理状态。对吧,我的这枝干就是它的一个转移的路径啊,就比如就是它它这样一个branch呃,通过这个枝干连接的这些呢。都造成是叶子,对吧?它叶子很多层一层两层三层对吧?不同的层之间呢?通过我们这些枝干来连接。 就好比是我们的状态,对吧?状态转移之后呢?通过这样的一个转移路径。到下一状态,在我们树里面就是我从当前的这一层,比如说我的树根,那么通过枝干连接这样的一个树叶。那么,它们之间也是一一对应的,所以呢,我们一般呢,在搜索问题里面呢,会构建出这样的一个搜索树。那搜索树呢, 还有一个概念需要注意一下。有个概念呢,叫边缘那边缘呢,有两种翻译方式,第一个呢叫fringe,第二呢叫frontier,或者是边缘,边缘是什么意思呢?就是说我这些树啊。它有很多树叶,对吧?很多树叶呢?很多树叶是之前呢?还没有去,就是到达过的, 那么我下次就是说我可以把这个树叶再往下扩展一层。对吧,它可能长到这一层之后呢,它下面还有生长潜力,再往下扩展一层,那么能够被选中扩展的这个树叶节点。那么就认为它叫那个边缘,那么从我们这张图来看,就要更加明显一点,比如说我们把这样的一个搜索问题变成这样的一个搜索数。从这样的一个路径寻求h。那么在a群呢?当前能够。就是说扩展得到三个后续的叶子节点。对吧s×t乘和c乘那么这三个呢? 我们就认为它是要一个边缘就这三个啊,还有被进一步扩展潜力。对吧,比如说我们对s层进一步扩展,那么还可以到a层f层o层r层,所以我们这样通过这样的一个扩展关系,那么可以构建出来。对吧,它们之间呢,它们是一个一一对应的,所以呢,这些就是带扩展的这些节点,可以认为它叫一个边缘,就好比什么呢,就这些边缘啊, 把我们。图中这已知的跟未知的进行分割了,对吧?前面呢?我们可以认为是已知的a×s×t×c乘。这些呢,是已知部分对吧?后面这些呢,它是未知的,要成这些灰色的是未知的。那这边缘的好处呢?就是说可以把这些已知的未知的在这边缘节点上分隔开。那只要对我的边缘节点进行扩展,那么就可以探索那些未知区域,对吧? 对s全景扩展,那么以前这些是未知的,那么扩展完之后。它就那个被发现了,变成已知了。所以这呢,就是边缘的概念,然后呢,树叶呢,相当于就是说它可以去扩展嘛,就分枝散叶,所以这里面一个词呢叫。动呃动词呢,叫spend就是我可以把这个树叶啊扩展。对吧, 类似于这个呢,相当于是分枝散叶,对吧?叫扩展。所以它是一个非常形象的概念,就是我数页分支扩展就分支散页扩展。这里面呢,还需要注意,就是说我们做这样的搜索数啊,并不是就是说我一定要去,就是说到那个节点,就好比是我们去上海,对吧?我不一定真正到湖州之后再回头。对吧, 发现绕绕了远路再去嘉兴,再去上海,它这里面呢,更多的是一种,就是脑子中的一种规划,就我们之前讲那个智能体。它有一定的规划能力,就这些决策啊,就是说并不是需要我真正去到这一点的,它的假想模拟我到这一点之后,它是怎样的?比如说在当前点。它有两个动作,对吧?两个动作对两个状态, 然后再往下它的整个过程呢?在脑中是假想的,它是一个which if就假设我到这一点之后,后面会怎样?那我们先休息一下。好,我们继续上课啊。就刚刚讲过这样的一个搜索过程呢,它更多的是一个在脑海中的一个推理过程,对吧?这种假想式的,你不需要去真正的去一个要两个三个去真正去落实行动,去那边去。更多它是在脑海中的一个规划推演。就我们之前讲的那规划性agent智能体啊, 是这样的,他在脑海中去规划,我做这这动作之后,那么后面会有哪些潜在的后果?哪些影响?所以这里面呢?我们构建这样的一个搜索树,那其实一定程度上也是可以帮助我们去进一步的去做一个规划。对吧,去推理。那么,从这个层面来看呢?就是说,我们对每个节点做这样的一个expansion,这样的扩展, 那么潜在的这些结果。啊,都是在脑海中去假设出来的。对吧,就根据你的判断会有哪些情况会出现那么可能的情况,那么在这里面就是我们的状态,做我们他们的一个后续的节点。那么,这个这样的一个后续或者后期节点呢?在我们搜索树里面那么一般造成是叫live yes节点。对吧,叶子那么在其他的一些版本里面呢,也可以叫成叫那个子节点叫children。child叫子节点。本质上是一回事, 就是说它在上面这样的一个节点的一个扩展,它的一个后继。对吧,像那继承者对吧,所以叫那个live或者叫children。或者叫success跟你讲的后记叫success意思是一样的好,上面这样的一个节点呢,我们一般的教程是比如说。如果是我们搜索树最根部的,就我们根节点root,那么其他版本里面呢,还造成是那个,就是说那个父节点母节点的parent。对吧,the parent children, 它们对应关系对吧,又可以能把它叫成是an sister祖先和success和那个successor后继。就它的这词啊,都成堆出现的,那这里面呢?我们用的是一个live为主,因为这是个搜索树。用呢,更加直观一点,那其他版本里面会有那个children?就那种很形象的。然后我们来看一看这样的一个搜索数。对吧,搜索数的话,对每一个状态进行一个扩展, 那得到后面的一些状态,再逐步扩展。然后呢?我们可以从搜索树里面可以看到从我当前的输入节点到目目标节点啊,那么可以根据这一路扩展下来,对吧?比如说从这里面。我从s点出发,对吧?到d点那扩展到到e点一点进一步扩展呢?到r点再到f点再到g点。那基本上从s到d到erfg,这是一条路径,一个path是吧?那这样的一个路径呢? 那么我们从图里面可以看到。那么基本上也是一个可行的一个解,对吧?对吧,从s到d到e到r到f到g。所以这样的一个数呢,跟我们这个图呢,它们之间有一个对应关系,那么基本上在我们树里面的每一条这个路径。只要拖到我们的目标节点的,那么在我们的图里面那么也是一个可行的,这样一个路径可行可解。所以树和图啊,它是两种不同的存储方式,对吧? 它们之间也是一一对应的。但是呢,在不同的问题情况下,我们选用的这样存储方式会不一样,后面会具体讲到。那么,我们前面主要讲的呢是这样的一个数,那么数有什么问题呢?就是说我们假设这样的一个状态空间图。对吧,我们会发现就是说那么从s到a到b到g,它在a和b之间啊。它有一个双向的,一个箭头,它们之间可以相互相互转移, 双向转移。那么,如果我们根据这样的一张图来构建我们的树呢?会有什么后果?它的树啊?如果,比如说我到了a点。到了a点,它往下扩展,会到b点,那b点呢?从b点又可以到a点,这a到b啊。b回过来也可以到a。所以呢, 再往下扩展,它又会到a。说a点呢,又可以到b。所以会有什么问题?就如果只是单纯。只能构建这样的一个搜索树,那么这个树它是无限深度的,因为它有无限循环在里面,它死循环。对吧,所以就是说如果构建出这样的一个对应的搜索数,它是无穷个维度。对吧,因为你a和b之间相互转化, 只要你扩展a,那么下一步就扩展b,这扩展b下步就会扩展a。所以呢,就是说我们如果出现这种情况,就这种代词循环的过程啊,一般呢,我们不会对我们的搜索树进行直接构建。那么更多的呢,是构建一个这样的一个图,比如说我直接对这张图上做搜索。大家先有这样的一个概念,后面会具体讲到。对吧,就是结论呢, 就是说我们可以在这张图上直接做对它进行一个搜索。然后主要的目的呢,就是说我们通过这张图上去勾画出来哪个点被扩展过了,被扩展过了之后呢?那我的下一步就不再去碰了。对吧,每次呢,相当于是对我们图中的一个没扩展过的节点进行搜索。那树呢?不是那么直观,那图上的话,比如说这个节点被搜索过了,那么直接画个叉对吧?下一步这节点就不会被扩展了。所以这样的一个概念, 后面会具体讲到。所以呢,我们讲的这样的一个就无信息搜索,那么它只有一些图中的它,只有一些题目中本身带的一些信息,没有其他的一些假想。那么这里面呢?就是说我们可以构建出这样的一个搜索树,那么也可以对我们的图上直接做搜索,那比如说我们这个呢?就是对我们的图直接做搜索。对吧,这是一个状态,空间图就好,比如是刚才讲的一个路径搜索啊, 地图问题,然后上面进行那个分支散页。对吧,只是分支三页呢,它不是这么规则的数,它可能是这样的一个数。对吧,在图上直接进行一个分支算页,它就是带点扭曲的数你,比如这是一根根节点三个呢,它的子节点。对吧,可以直接这样扩展。然后边缘呢,就指的就是说我这些边缘节点把我的已知部分跟未知部分隔开, 那么这些边缘节点呢?下一步都可以扩展,就带扩展的那些节点。那么这个就是说可以把我们的整个搜索问题在图上做,这样的搜索就给它相当于搬过来了。那么也是一样的,每次呢,我往前动一步,那么动一步呢,就相当于是把这个节点啊,然后扩展一下,那扩展得到它,下一步潜在的一个状态。对吧,比如说这一节点再扩展, 就这个和这个,这是已知的。所以我们刚才讲了两个概念,第一个呢,就是我们的边缘就指的是那些带扩展的那些节点就可以把已知部分未知部分分割开的叫边缘。对吧,然后每次呢对这些边缘节点呢,我们做一个扩展。再把它进行分支散页,把它下一步的它叶子节点找到,那这过程呢?叫扩展。所以呢,我们从这个层面呢,我们去可以构建出整个的这样的一个搜索问题, 这里呢,我们比如说对我们这个的数进行搜索。用的这样的树状结构对吧?虽然刚才是讲一个图啊,但还是这样树状结构。对吧,虽然我们是在状态空间图上直接做搜索,但还是一个树的形状。所以呢,我们统称为是这样的一个树的搜索。然后每个节点上呢,我们会发现就是说它会有一些记录,每个节点上,比如说这状态对应的节点。对吧, 比如说我们刚才讲的那个八数字问题,比如说我当前的状态对的是这个。数字排列。而数字排列呢,它可以进一步的,就是说知道我在这一步上每个节点它能怎么动作,所以每个节点你可以认为它是一个存储的一个结构。那么,里面的第一呢,是把我当前状态进行存储了,第二呢,我们是把就是说它的一个潜在动作进行存储了。那么,以及可以存储一下它整条路径上的代价。那么可以看到, 就是说我们整个的一个数。对吧,在这样的一个分支散热过程中,到底哪个点先去扩展?对吧,它的策略是不一样的,那么这呢,就对应到我们整个的一个搜索策略。对吧,我们到底是对这个点先扩展呢,还是对我们这个点扩展呢?你的优先选选择顺序不一样,我们带来的一个搜索理念和结果也不一样。那总结一下呢,就是说我们这样的一个数据搜索, 那就是说找到那些可以扩展的节点,然后进一步去扩展。然后每次呢,扩展得到一个点之后呢,去看看它有没有到我们的目标节点,就能不能通过目标测试,能通过那说明我们整个搜索完成了。所以从这个层面上来看,我们整个的这样的一个搜索的过程啊,更加像是一个判断yes or no的过程,对吧?如果到了我这样的目标点。那么认为它yes,如果没到就是no,如果no呢, 它再进一步的去循环迭代啊,最终达到这样的目标点。那么接下来呢,介绍一些基本的概念。这对我们整个搜索策略啊,它有很多种。那么在你这里面呢?我们主要讲三种,最基本的搜索策略就是深度优先搜索,广度优先搜搜索以及一致代价搜索。那这些搜索策略的好和坏呢,一般可以通过四个维度的评价指标来实现,第一个呢就是完备性。叫completion ness完备性。这完备性的很好理解, 就是说如果存在一个解,我能不能找到?这甚至呢,存在多个解我能不能找到其中的一个解?这呢,只要能够有解的情况下,找到解都算作是完备的。对吧,所以他也很也很容易理解有解,能找到就完备。那第二个性质呢?叫那个最优性。那这个呢?从字面上来看,这意思啊, 要更加的就是说强一点。就是说能不能找到最优解?对吧,前面是有解,能找到一个解对吧?那这个呢?就能不能找到它的最优解?这不光是能找到一个解了,它应该最优的。那最优解呢,一般来讲是我们带最小的,它的一个pass CS最低的。对吧,所以这里面就它的一个最优性,大家知道这个概念, 第三个呢,叫那个时间复杂度。最后一个呢,叫它空间复杂度。那时间复杂度呢,主要讲的就是说我这样的搜索快不快?对吧,我到底就是说我需要花几秒钟还是几天还是几年?那这个呢,是用我们的时间复杂度来衡量的。那最后一个呢,是空间复杂度,这指的是就是说我在做这搜索过程中啊,我需要用到多少的那个存储空间?对吧, 因为它影响到的是我们这个硬件设备的,它的一个就是性能,对吧?如果我需要的存储空间够多,那么我这个设备可能支持了。那这时候呢,可能就需要去更新我的内存。所以这里面呢,相当于是四个维度来刻画了整个这样的搜索策略的一个好坏。那另外呢,我们讲的是那个数搜索这里面对吧?数搜索的话,我们会发现就是说还有一些就是说参数设定。对吧,这里呢, 也是带有一定的假,那种假想假设的这种理想情况,比如说第一个就我们那个做那个扩展啊,那种分支三个过程啊。我们都认为就是说每个节点最多能只能扩展到b个节点。对吧,这每个节点只能扩展到b个子节点。这一个设定。那第二个设定呢?就是说我整个数的深深度就是我的那个数的层数啊?就说我扩展得到一层再一层再一层再一层,总共的层数我们认为是,比如说m层。这是我们假想设定好了。第三个呢, 就是说假设我这个目标节点啊,出现在我的d层。对吧d呢?一般呢,可能就是说不会在最低,不会在m层,可能稍微偏中间一点的d层。那么这三个呢?是一个基本设定,然后呢?我们可以看一看,就是说如果是这样的一棵树。总共有多少个节点?那第一层。一个对吧, 第二层。b个呃b个第三层呃b的平方个对吧?所以呢,我们可以做这样的一个。等比数列叠加那会发现这里面最大的数是b的m次方就最底层,它有b的m次方个。节点就我这一棵树啊,分枝散叶扩展到最后,那最终呢?最底层是b的m次方个叶子节点。那然后呢?我们这里面的概念就复杂度的概念,它是一种抽象的概念,就是说它既然最大的数呢是b的m次方。那么我就认为它的复杂度, 那么就是认为是和b的m次方相关,前面都忽略了。所以我们写复杂度的时候呢,一般是只关注里面最大的那个。就罪恶的情况下,最恶恶的哪个就是所以这里面呢是?把复杂度呢叫成大o,所以这里面的叶子节点的整个数量呢,基本上叫b的m4方个。就换句话讲呢,就是说我这样的复杂度啊,是和b的m次方成比例关系。简写一下,叫b的N次方大o。那么, 首先我们介绍一下那个深度优先搜索。那一句话的概括呢,就搜索方法呢,相对来讲比较死板,就一条路走到黑,对吧?不见棺材不掉泪。那具体来看一下。那同样呢,我们用这样的缩小数来表示。对吧,它的策略是什么呢?就每次对我最深层的那个节点进行扩展。那比如说我们从a点出发,那第一次扩展得到b和c。 对吧,然后我们选择对b扩展。啊b扩展呢,再到d和e那记住啊,它对最深的那个节点就最深层的那个节点进行扩展。那这里面最深层的。是d,所以在我们的d的情况下,进一步扩展,那这里面。比如说已经到最底层了。那么先到h对吧?来看看有没有它是不是目标节点?那发现不是那再到I它是不是发现也不是那这个时候呢?它会回过去, 因为这两个最深层的。相当于是都被否定了。这个层呢?就这个呢,相当于就是说我们在这个状态下,它有四个边缘节点,对吧?hie和c那它先对最深层的边缘节点h和I。进行一个他的一个评判,发现不是目标节点,所以他会回过去,对吧?这两个被去掉了,在这个状态下,那只有。 e和c的两个带扩展的边缘节点对不对?所以在一点呢,会发现它的深层,它的层数啊,比c要深。所以在e和c中呢,选择一点,再进行一个扩展。好到现在就是说一点扩展完之后JK k。那这里面j和k都比c要层入深,所以呢,它依次是对我们j和k进行一个。评判对吧?评判完之后发现jak都不行,那再回过头来, 那当前只有两个点了,就这个和这个。这一点是只有一个边缘节点了,对吧?这一点呢?再对它进行一个扩展,那么发现扩展得到f和g。再去评判。对吧,先对f否定扩展。然后这个LM的评判发现都不对,然后再回过头来发现。所以说只有一个节点能够扩展了,就g而g本身呢,就是它的一个目标节点, 到此为止停止了。就总结一下,就一般来讲,就是说它是对一个最深层的边缘节点,先扩展你层数越深,你是边缘节点,那么你越先越扩展。这一个那么第二个呢?我们会发现。就是这里面啊,就是说我们在做过程中啊,往往只需要关注这一条路径上的节点以及。它所相邻的这些边缘节点。就好比就是我们这样的一个。图它已知空间。 这是我们需要去存储的,那基本上这条路径和它的一个相邻的,这样的一个子节点。对吧,然后每次得到一个节点之后呢,发现这个东西,比如说这个低。它扩展完之后发现不是的,那么其他的信息。所以可以看到啊,从这一点到这一点那么低相关信息啊,都会被删去。那这里面只保留了我这一条路径上的节点,以及它的一个相邻的子节点,对吧? 所以它有一个非常好的优势是什么呢?就是说它有一个存储优势。我每次只需要存储我这条路径上的节点和它相邻的子节点。就它不需要存储全部的。对啊,这条路径上的节点。全部评估完之后,那整条路径都可以被删,去看下一条路径。所以这是它的一个存储优势。然后另外呢,我们从计算机的一个存储方式来看,之前大家学那个C语言程序设计,应该记住个概念,叫堆栈, 叫stick。我们这样的一个深度优先呢,更加像是一个叫后进先出。就last in。first out.就后进先出的这样堆栈。那什么意思呢?比如说我们做搜索。对吧,我们是一步一步往下搜索的,那一步一步往下扩。那么,先得到的肯定是BD。eh呃,这个按照顺按照顺序啊, 肯定是bde hi对吧,但是呢,我们先扩展的是h。就好比什么呢?我的堆栈。对吧,这是个堆栈。我最后是比如说h和I,那么这简写一下就是h对吧?我h是明明是先放在里面,最后放在里面的,但是呢,我是先对h。先取出来对吧?它最后一个放进去, 但我第一个取出来,这里面是不是也是一样?我最后一个扩展得到,但我第一个去把它扩展。对吧,所以这里面就是说它是一个后你先出的对战过程。然后结合我们动画来看,会发现啊,它是一条路走到黑的,对吧?它是从左往右,从上到下。对吧,一步一步一步这样去搜索过去。相当于这样去。 不停的去切片,切片,切片都切到底为止。然后我们来评估一下它的四个特性。对吧,第一个特性呢,就是说它到底是不是完备的?让大家看看是不是完备的?对结合刚才的这样的一个搜索过程。可以考虑一下。那么这里面呢?就是说我们要有一个假设假定,那如果这个状态空间呢?它是一个就是说没有出现过这种。重复的循环, 那么任务它可以是完备的,就我们在刚才讲的,就是说我们搜索问题里面很有可能我这个数啊它。它是无限深度的。它无限深度的对啊,无限深度的话,我既然是深度优先,我是不停的一条路走到黑的,它如果有无数层,那么它会跟着走到无数层。对吧,那这个情况下。它也就跳不出来当前那条路径啊,那么这就找不到最优解了。是不是啊呃, 甚至找不到一个解,因为它的解呢,有可能比如说在这边。对吧,它是在那个,我们是从左往右,从上到下搜索嘛,它的企业可能是在靠在靠右边这个点。而我如果是层数无数层,那么他一直在这条路径上走到黑,一直不回头,所以他不会找到这个点。所以如果出现这种情况,那么它就是不完备的,除非它的层数。 是固定的,是给定的,是有限的,这种情况下一般来讲是完备的。所以要避免一个情况,就是说它要把我们这些循环的这种情况给它排除在外,如果没有这种情况,那我的树的深度一般是有限的。那这样的话,它是可以找到一个解的。所以它它的完备性啊,是有是有条件的,我们再看那是不是最优的?那么,既然它是从左往右搜, 对吧?从上往下搜,那么基本上很难得到一个最优解,那么最优解呢?它可能是在这个地方。就好比我们比如说从a点到b点,它很多条路径啊,比如说我们a点到b点有有两条路径。那b类就比如说这一点的路径的成本比这一点的路径成本要高,所以呢,我们通过深度优先呢。既然是从上到下,从左往右,它能搜到这个点,那这个点它确实是一个解。 对吧,但它不是最优解,所以这个点呢,路径成本可能比这个高。深度搜索呢,它是一个yes or no的问题,它只要找找到一个这样的一个解它,停止了它没有去评估它的路径成本。对吧,那我们最后去做后评估的时候呢,会发现我们是否看一看这个点,它确实是个解,但成本更高,所以呢,它的最优性。 也是不能够满足的。那我们我们再看一下它的一个时间复杂度。对吧,时间复杂度呢,就是罪恶的情况,我们看它罪恶的情况。最后的情况呢,就是说它深度搜索啊,它需要一层一层一层一层。然后不停的去那个搜索,那这块情况就是从上往下,从左到右全部给它遍历完假设,比如说这样的一个。那个节点啊,它的一个这样的一个解的节点啊, 它可能是在这个最边上最底部的这个角上。那么,它需要对我的所有的节点全部都扩展一遍,去探索一遍,是不是就这块情况?那最底层多少节点呢?b的m次方个。就假设它节点它的一个最优解啊,或它一个解在这里,那么它需要对所有的节点用从左往右嘛,从上到下。都去遍历一遍。所以它的时间复杂度。是大o的b的m次方。然后看看它的空间复杂度, 空间复杂度呢,相对来讲,深度搜索是有优势的,刚讲过,那么它只需要去存储。我的路径上的点以及它相邻的那些子节点。对吧,我们每一层。比如说它的子节点三零子节点有b个,然后呢m层,所以就是b的m次方,而不是那个。必成研磨。所以它的一个空间复杂度啊,就是大o的。 b×m。因为每一层它有b个相邻的。子节点对吧,然后也不成就一条路径啊。就它有m层的这条路径,那上面一串一串,每一串上面只有b个。教链节点,所以我存储的规模是大o的hm。这个呢,就是我们的深度优先搜索,所以它的问题很多,但优势是它的存储空间需求量很小。然后我们再看另外一种搜索那一个呢,叫深度优先, 就我最底下的先搜索另外一个,我一层一层推过去。就跟我们刀削面一样的,它一层一层平着推的,对吧?平着平就平着这样切的。在我们这里面呢,就叫那个广度优先或者宽度优先,就它是一个平均主义的,我从左往右。必须要齐步走。这样的一个搜索方式。那结合我们的这样搜索出来看。对吧,比如说我们还是从a点出发, 那扩展一下,得到b和c。那b和c呢?我先对b进行扩展一下。d和e但发现呢,就是说我因为平均主义啊,我b扩展完之后c还没扩展。所以呢,我下一步呢,是对c进扩展表头f和g,我再往下,再从d和ef和g这样去搜索。所以一定程度上呢,它是扩展的,是我最浅层的那个边缘节点就反过来了, 对一个呢,就是我。越往下的越深的越鲜,一个呢,相当于是我要相当于一个都不能少平均主义,我最浅层的不能落下。它要先被那个扩展。所以相对来讲呢,这样的一个宽度优先呢,它是一个先进先出的,这样的一个对战。t.对吧,这个也很好理解。对啊, 我的这些边缘节点啊。对啊,就是我先那个,比如说b先进去。然后再c那,所以这里面呢,就是说我b先扩展。然后在c扩展就虽然后面b扩展得到了d和e啊,但是后面进去的,所以我是后面再出来。所以它是一个先进先出的对战。跟我们刚才讲的那个深度游戏啊,是反过来的。那么,再结合我们这样的一个图的过程, 可以看到,比如说我还是从s点出发。那么我一层一层这样平均的推。对吧,先第一个s呢,我们从图上可以看到s下一步可以到。d可以到e可以到p对吧?这是它的第一层。而d呢,可以到BC ee呢,可以到h和r。对吧,训练到q那么这一层全部都一个不能少的,给它扩展完那么再往下再逐一的去扩展。所以看到就跟我们刀削面一样, 一层一层的削过去,对吧?平均主义。然后呢,我们再看看它的一个四个性质。对吧,一般的我们讲那个最优点啊,或者它的一个解啊,一般的可能是在d点,可能是在这个位置,对吧,这个位置呢,我们会发现。前面呢,我们深度优先, 它是从左往右,不停到底之后再过来的,而这个深度优先呢,而这个宽度优先,这个广度优先呢,它是一层一层一层一层。往下切的,所以如果这个点它足够浅,比如说在这里,那么这个深度优先啊。它会很费时。对吧,可能直到最后这一点的时候才发现哦,这样的一个广度优先呢,就很容易发现。 对吧,所以它的整个呢,就是说它的一个时间复杂度可能会小很多。因为它的一个就需要变的点啊,更少。那这里呢,有两种情况。第一种情况呢,就是说。我什么时候做目标测试,就是我每次那个。就说我每次就是说做扩展时候啊,比如说我是a点。这b点,这c点。 有两种方式。第一种方式呢,就是说我对a进行扩展的时候。扩展得到b和c啊。在扩展的时候就对a进行,扩展的时候我就对b做一个目标测试。这是前面的情况,一就说我这个节点刚生成的时候就对它做一个,就对它做一个这样的一个目标测试,那这是一种那第二种呢?可能a还有很多其他的那个相邻节点。呃,相邻节点这里面呢,就还有一个词叫呃siblings,就他的兄弟姐妹啊。 就比如说还低节点,比如前面。在d节点。有可能就是说第二种情况呢,就等到我所有的。a的所有的它的一个。相邻节点全部被扩展完之后,然后再去决定对下一层哪个进行扩展,那这个时候呢,就是说我需要可能前面做目标节点的做目标测试节点更多了。这第二种情况就是说我是等到它真正要去被扩展的时候,我再去做目标测试,那这里面呢,会差一点时间复杂度。对啊, 比如说我们对第一种情况。对吧,第一种情况。对啊,我在对这个点进行做这样的一个测试的时候呢,可能只需要遍历到b的第次方个节点。而第二种情况呢?就是说我需要等到前面的所有的它的一个上层的,它的一个相邻节点全部被扩展完之后再来决定我这个要不要去做目标测试?对吧,所以这个呢,一般来讲是b的d+1次方会差一层节点数。所以它这条复杂度呢?略有区别。但我们呢, 更加关注的呢,是什么呢?更加关注的是。因为d啊,可能很大,所以b的d+1次方和d啊认为它是没差别的,所以呢,我们一般可能简写一下,就认为它是b的d次方。就差别不大。但是呢,它是本质上搜索过程中啊,大家如果编程它是有区别的。我再看一下,就是说它那个。 存储的空间量。对吧,它需要把所有带扩展的节点啊,都在里面去存储。是吧,那么我的b的如果是我的解出去的d层,那么它就需要对我的b的d次方个节点啊进行存储。对吧,前面所有的都可能是它的一个,就说边缘节点那么都要给它重新组组起来。所以它的存储空间量也是b的第一次方。我再看一看它是不是完备的。大家可以考虑一下。那这个呢?可以看到, 就是说图上也可以很容易看到,那么因为呢?一般呢?它的一个呃,就是说解出现在有限层。对吧,解不可能不存在,如果存在解的话,一定是在有线层,那我一层一层平推过去啊,那基本上它是。可以找到的,所以它完备性一般来讲,只要有解,那么就肯定会有一个能找到一个解, 所以它是一个。就是完备的一个搜索搜索策略,所以它是完备的。那再看它是不是最优的?这当前呢,我们都认为就是说我们做深度优先和广度优先搜索啊,都认为就是说它每一层扩的时候啊,代价是一致的。都是以同一个代价均一化代价,我们并没有代入那些实际的数值,比如说每次我做一层这样的一个扩展,我们都认为这代价。都是一致的,都是一。对吧, 在这种情况下呢?我们的广度优先搜索啊,它是可以得到一个最优解的,因为它肯定是在最浅层找到这个解,对吧?那它就是一个最优解,因为你在最深更深层的地方找到解。那代价,因为它层数更多了,代价一定更大。所以在我们这样的均一成本的情况下,那么我们的广度优先一般来讲是有最优先保证的。但实际情况呢,往往不是实际情况呢,可能就是说我不同层的时候, 它的扩展代价是不一样的,那这个呢,我们后面再说。再总结一下我们这样的一个广度优先搜搜索算法。那么,它的时间复杂度相对来讲。第一点对吧?大o的b的d次方。那如果是它的空间复杂度呢?就更高一点。大额的b的d次方一样的,就是说它的任何算法都是有利有弊的。对吧,深度优先搜索回忆一下,它是时间复杂度很高, 但是空间复杂度低。而这样的一个广度优先呢?它是正好反过来,对吧?时间复杂度稍微低一点。对吧,那空间复杂度高一点,它需要存储量更大嘛。所以我们就在想,那既然两者各有优势,我们想办法把它们俩结合,合二为一结合起来呢?那么这个呢,就是我们讲的叫那个。叫迭代式的, 这样的一种深度优先算法。深度优先搜索。那什么意思呢?就我们刚才讲,就是说广度优先,它为什么就是说它的那个存储量和它的那个就是时间复杂度低呢?因为它相当于是每次都限定层数啊。就它是一层一层推过去的是吧?那么我们这里面也是一样的,我就给我们的深度优先搜索啊,写限定层数,比如说我第一次我就只扩展一层。然后看它能不能到最优解。对吧,第二次我看了两层。 对吧,每次扩展完之后呢,我限定这个层的深度啊,然后也是按照我们深度线算法,从左往右,从上到下。一步一步过去,那这里呢?相当于是我可以不停的对我的层数进行加深。对吧,比如说第一次那么。一层发现没有解没关系,再往下扩展一层两层,所以它是什么呢?我们从这个。 动画来看。对吧,我第一步我扩展一层嘛,那只有这样的一个三个节点在里面。对吧,发现没有解我再往下一层对吧,这样的大三角这样大三角。就不停的给它去加深层数,然后做这样的一个深度优先算法。所以可以看到,就是说这里面那基本上因为它的解的深度啊,它有限的。所以通过这样的一种方法呢,那基本上可以找到它的一个解。所以它是个晚辈的。 那么一定程度上的话,它是把我们的深度优先跟广度优先综合起来了。那这个过程也是一样的,就类似啊,就是说每一次。我限定层数之后,做这样的一个一个深度优先。对吧,不停的去搜。直到出现它的一个最优解。然后可以看看,就是说它搜索的节点数。那么,比如说我们一开始我只扩展一层。那它是。 一个对吧?那第二次那它是一层b个?另外一层是b的平方个。第三次呢,比一个加b的平方个加b的三次方个。它也是这样的,不停的去那个增长的。对吧,所以它整个的这样的迭代过程呢?它的节点数啊,你会发现有些节点啊,它会被来回被去那个扩展到。对吧,相当于它很多次循环,对吧, 每一次相当于就是说都会对这两个这些节点啊,进行一个扩展。所以它整个的它的一个所需要的节点数。那么可以把它进行加和,比如说我们搜索到低层。解出一下d层,那么把这些所有的加起来。对啊,这加起来。对,加起来,那这是我们这边的一个表达式,对吧?就说我这样的一个第一层的就是我们这一层啊,它出现了第一次, 我再往下一层呢,就要理减一次。对啊,就这样加和过程。然后呢?我们把这样的一个过程,它的一个它的一个求和啊求出来,比如带入我们的数值,假设b=10 d=5。那通过我们这样的一个搜索方式呢?会发现。它所需要扩展的节点数啊,可能是12万个。那如果我们只用我们的深度优先,如果我们只用的广度优先呢, 那就没这么复杂,不需要这样去做来回的重复的这种扩展。算一算,可能还只要11万个。所以我这个层数限定的好和坏,你如果限定的。但如果这样一个解的数学层数啊,如果过于深。有可能这样的一个迭代加深的深度优先啊,它所计算复杂度更高。对吧,是因为就是说它需要去重复的去遍历这些呀。所以呢,这个呢,就是它的一个问题, 有些时候呢,它可能是就是说无效的去做来回的计算。就虽然我们是想把两个的优势啊进行结合。那前面呢?我们都讲的是这种军医代驾的,就每次动作,每次扩展,大家是一样,都是一那么真正的生活中的话,更多的可能是一个实际成本,成本大小是不一样的。所以呢,就是我们讲那个广度优先算法呢,它一定程度上就是说只能找到一个均一代价情况下的最优解,但这个解往往是跟我们真实的。 最优解啊,是相背的。那如果我们把我们的这样的一个代价带进去。那么整个解的过程啊,就不一样了。对啊,如果我们只是一个传统的这样的一个深度优先,广度优先搜索,那么这些呢,他是不管这些代价的。它就往前,比如说扩展一次。对啊,两次三次,因为每次扩展大家是一样。 那如果要解决这些实际问题呢,就需要我们讲的,这里讲的就是均一代价搜索。所以叫一致代价搜索。就相当于就是说我在做这搜索过程中啊,我可能就是说不是去一层一层平推过去,也不是就是一条路走到黑。我可能是根据我这样的一个价格信号来指引我,对吧?代价信号来指引我去做搜索。那这个就是我们讲的,就是说一致代价搜索。那这里面怎么去评估它的一个它的一个代价呢?就是我把我所有的就是说累积的成本累累积代价。合到一起来指导我的搜索, 比如说。我们从s点到d点。对吧,那路上代价是三。那么我就认为就是说累计代价到低点为止是三。我再往后,比如说我一点到一点。再加上12,所以我可以认为从。那个s点到d一点累计单价三+2=5。它是对以前的所有发生过的这个路径和代价成本进累加。然后加完之后呢,我再去测试对吧?我当前这个点到底是不是最优点?是不是目标点? 要先看是不是目标点,那如果是了,那么可能还先放一放,还要去评估一下有没有其他节点路径上的成本更低?如果有更低的,我先去把那些点先找到。合到最后再看这个点到底是不是最优点。就比如说,以这样的一个例子,比如说同样是一个地图问题,搜索从s点到b点吧。对啊,我从s。可能一开始找到的一条路径是从s到f到b,那你算一算路径成本是300亿。 对吧,这个呢,确实到了b点,但它的解呢,不是那么的好,所以这个呢,先搁置,因为这310啊。你去在做过程中会发现很多其他还没那个扩展的那些边缘节点的值啊,比上面要小。那比如说我在那个r点,它的质量比这个要小,然后我再根据我这个r点的扩展,结果一步步往前推。我推到一个底278。 然后再可以比较一下278和310,那会发现278它其实要更加优,对吧?更加好。所以呢,它相当于是一致代价搜索呢,所以它就是说得到一个目标点之后啊,要先等一等,还要比较一下它的代价,说代价只有就是说没有其他代价,比它更低的情况下。它才是最终答案,才最优解。那么,结合我们这样的一个例子来看。 再比如说我们左边的这样的一个图,对吧?从s点出发。对吧,到底点到e点到p点那会发现。在p点这个时候呢,我的累积成本最小。对啊,就说我从s点到p点,我路上经过的代价成本累积成本最小,所以我第一步。针对我的p点进行扩展。然后再往下看呢。我如果对p点。对吧, 如果对我p点扩展,它这个到q点,它这是16,然后再比较一下三九十六。对吧,会发现。这个三最小,就他每次找这个累积成本最小那个点扩展。那这样三最小。那么再往下,对那个d扩展得到那个bce,然后再比较这些点里面bce。那这也是个一,这是16那会发现哦,从d到b这个四最小。 我再往下扩展。得到这个六对吧?然后再对这些直径比较,对吧?六十一五九十六发现这个五最小。所以这条路再下来再扩展,然后再去比较。所以他每次比较呢,就是说那个累积成本,累积代价最小那个点去扩展。然后再到r点到f点。你看到f点的时候啊,这里面它的g其实是那个出现了。但这个代价是十。好, 这个十呢可以看到啊,就是说。一次找到了,而且这个十呢,其他的可以扩展节点啊,代价都比它大。对啊,那这个就是它的自由点。所以他找到目标点之后啊,还判断一下其他节点有没有还没扩展,而且路径上成本更低,如果有的话,先去把其他节点去给它扩展完。那么可以看到它是这样的一个相当于是那种等高线一样的,等高线里面什么内容呢? 它代价。对吧,它其实不是像我们的广度优先这样一层一层的,你带入它的时间的话,它的代价,它可能就是发生畸变。以前是一层一层的,然后现在变成这样的一个等高线。对吧,那这一点就是它是也是相对来讲,就是说呃,深度是有限的,那么所以它是一个最优解。然后我们再来看它的四个性质。啊, 首先看一看它是不是完备的,对它有解,我们找到它的解。对它一定程度上对吧,也类似于是我们的广度优先,只是呢,它的代价可能是就是说实际成本实际成本呢,它可能是一个稍微扭曲的这样的一个平均化的东西。是吧,所以呢,也基本上可以保证它能找到一个最优解,因为它的深度是有限的。那第二个那是不是最优的?对我们带入了成本。对吧, 每次相当于就是说对它的成本进行考量,每次扩展节点的时候呢,考察一个成本最累积,成本最低的那个点去扩展。那所以基本上也能保证它最优的,当然我们可以通过反证法,就是反就是假设我还有个点。成本比它更低,主要找到的是那个a点,但最优点是在b点。那其实可以通过反证发现,就只要我成本更低啊,那b点肯定是比a点先去扩展。那困难时候呢,也会比较它成本啊, 所以这种情况不存在。然后我们再看。它的一个时间复杂度和空间复杂度。那这里呢,有个概有个那种就估算,因为它成本啊,它是就是它是那种有差异的不一样的。那我们就假设,比如说每一个。扩展的成本至少波斯龙。然后呢,它的解的成本呢?它是CC星。所以相当于什么呢?就是我为两个两个数啊, 进行一个上下取整。这大概可能会出现在它的最优解啊,可能会出现在这样的层数,所以我向下取整。然后比如说我们的c举个例子c星可能比如说举例子是九点九。那epsilon可能是比如说e。那往下取整就等于九。然后呢?我们一般呢?就是说向下取整呢,因为它有一定的误差嘛,它可能会牺牲一个层数。所以呢,就是说我们还会对它加个一。就类似于是向上矩阵了。 所以它的一个时间复杂度和空间复杂度啊,都基本上跟这个值相关。那我们先下课啊。
Loading...