盲目搜索
- 格式:doc
- 大小:41.00 KB
- 文档页数:3
第五章状态空间搜索策略搜索是人工智能的一个基本问题,是推理不可分割的一部分。
搜索是求解问题的一种方法,是根据问题的实际情况,按照一定的策略或规则,从知识库中寻找可利用的知识,从而构造出一条使问题获得解决的推理路线的过程。
搜索包含两层含义:一层含义是要找到从初始事实到问题最终答案的一条推理路线;另一层含义是找到的这条路线是时间和空间复杂度最小的求解路线。
搜索可分为盲目搜索和启发式搜索两种。
1.1 盲目搜索策略1.状态空间图的搜索策略为了利用搜索的方法求解问题,首先必须将被求解的问题用某种形式表示出来。
一般情况下,不同的知识表示对应着不同的求解方法。
状态空间表示法是一种用“状态”和“算符”表示问题的方法。
状态空间可由一个三元组表示(S,F,Sg)。
利用搜索方法求解问题的基本思想是:首先将问题的初始状态(即状态空间图中的初始节点)当作当前状态,选择一适当的算符作用于当前状态,生成一组后继状态(或称后继节点),然后检查这组后继状态中有没有目标状态。
如果有,则说明搜索成功,从初始状态到目标状态的一系列算符即是问题的解;若没有,则按照某种控制策略从已生成的状态中再选一个状态作为当前状态,重复上述过程,直到目标状态出现或不再有可供操作的状态及算符时为止。
算法5.1 状态空间图的一般搜索算法①建立一个只含有初始节点S0的搜索图G,把S放入OPEN表中。
②建立CLOSED表,且置为空表。
③判断OPEN表是否为空表,若为空,则问题无解,退出。
④选择OPEN表中的第一个节点,把它从OPEN表移出,并放入CLOSED表中,将此节点记为节点n。
⑤考察节点n是否为目标节点,若是,则问题有解,并成功退出。
问题的解的这条路径得到。
即可从图G中沿着指针从n到S⑥扩展节点n生成一组不是n的祖先的后继节点,并将它们记作集合M,将M中的这些节点作为n的后继节点加入图G中。
⑦对那些未曾在G中出现过的(即未曾在OPEN表上或CLOSED表上出现过的)M中的节点,设置一个指向父节点(即节点n)的指针,并把这些节点加入OPEN 表中;对于已在G中出现过的M中的那些节点,确定是否需要修改指向父节点(n 节点)的指针;对于那些先前已在G中出现并且已在COLSED表中的M中的节点,确定是否需要修改通向它们后继节点的指针。
启发算法与盲目算法一、盲目搜索对一个图进行搜索意味着按照某种特定的顺序依次访问其顶点。
在所有搜索方式中,广度优先算法和深度优先搜索算法都十分重要,因为它们提供了一套系统地访问图数据结构的方法。
我们着重讲解广度优先搜索算法。
1.深度优先搜索深度优先搜索算法(简称DFS)是一种用于遍历或搜索树或图的算法。
沿着树的深度遍历树的节点,尽可能深的搜索树的分支。
当节点的所在边都己被探寻过,搜索将回溯到发现节点的那条边的起始节点。
这一过程一直进行到已发现从源节点可达的所有节点为止。
由于深度优先搜索不是接下来最短路径算法的基础,因此这里不做拓展。
2.广度优先搜索广度优先搜索算法(简称BFS)又称为宽度优先搜索从起点开始,首先遍历起点周围邻近的点,然后再遍历已经遍历过的点邻近的点,逐步的向外扩散,直到找到终点。
在执行算法的过程中,每个点需要记录达到该点的前一个点的位置—父节点。
这样做之后,一旦到达终点,便可以从终点开始,反过来顺着父节点的顺序找到起点,由此就构成了一条路径。
以上两种算法的不同搜索策略可以通过下面网页查看动图,这是两种相邻节点之间的移动代价相等时用到的算法,图中的边不设权值。
3.Dijkstra算法Dijkstra算法是由计算机科学家Edsger W.Dijkstra在1956年提出的。
考虑这样一种场景,在一些情况下,图形中相邻节点之间的移动代价并不相等。
例如,游戏中的一幅图,既有平地也有山脉,那么游戏中的角色在平地和山脉中移动的速度通常是不相等的。
在Dijkstra算法中,需要计算每一个节点距离起点的总移动代价。
同时,还需要一个优先队列结构。
对于所有待遍历的节点,放入优先队列中会按照代价进行排序。
在算法运行的过程中,每次都从优先队列中选出代价最小的作为下一个遍历的节点。
直到到达终点为止。
对比了不考虑节点移动代价差异的广度优先搜索与考虑移动代价的Dijkstra算法。
可以看出当图形为网格图,并且每个节点之间的移动代价是相等的,那么Dijkstra算法将和广度优先算法变得一样。
实验二搜索问题形式化和无信息搜索(2学时)一实验目的熟悉和掌握搜索问题形式化方法与步骤,使用Python语言实现搜索问题形式化;掌握基本无信息搜索算法,实现算法并验证。
二实验原理搜索问题形式化即把要解决的问题描述为搜索问题,主要包括确定状态空间,初始状态,后继函数,目标测试及耗散等5方面内容;对于搜索问题可以应用通用的搜索算法求解,主要包括无信息(盲目)搜索和有信息搜索两大类,基本的无信息搜索有广度优先搜索和深度优先搜索。
三实验条件1 Python解释器,及IDLE等程序开发调试环境。
2 本实验所提供的几个Python文件,包括:mazeworld.py 用于构造、编辑、显示迷宫问题,以及对迷宫进行简单搜索;search.py 编写搜索算法代码。
实验要求的所有搜索Agent将通过改写本文件中类SearchAgent的solve方法来实现;util.py 实现搜索算法可能使用到的一些数据结构;eightpuzzle.py 用于构造、编辑、显示8数码问题;maze1.txt maze2.txt maze3.txt 迷宫文本文件。
四实验内容1 搜索问题形式化2 广度优先搜索3 深度优先搜索五实验步骤1 建立文件夹,将实验提供的4个Python文件和3个文本文件拷到文件夹中,注意整个文件夹路径不能有中文字符2 构造、编辑、显示迷宫问题运行Python IDLE,在>>>提示符下输入import mazeworld此时会出现错误提示,分析为什么出错#之所以会出现错误,是因为在sys的导入路径(path)中没有mazeworld.py文件的路径,这是用户自定#义的的路径,需要手工导入,即使用下面的方法import syssys.path['D:\\Python27\\Lib\\idlelib', 'C:\\WINDOWS\\SYSTEM32\\python27.zip','D:\\Python27\\DLLs', 'D:\\Python27\\lib', 'D:\\Python27\\lib\\plat-win','D:\\Python27\\lib\\lib-tk','D:\\Python27','D:\\Python27\\lib\\site-packages']#这里是你sys初始导入路径>>> sys.path.append('D:\QQPCmgr\Desktop\BlindSearchProject')#这里是你sys新增的导入路径>>> sys.path['D:\\Python27\\Lib\\idlelib', 'C:\\WINDOWS\\SYSTEM32\\python27.zip','D:\\Python27\\DLLs', 'D:\\Python27\\lib', 'D:\\Python27\\lib\\plat-win','D:\\Python27\\lib\\lib-tk', 'D:\\Python27','D:\\Python27\\lib\\site-packages', 'D:\\QQPCmgr\\Desktop\\BlindSearchProject']#新增导入路径后确认路径导入成功>>> import mazeworld此时,不再有出错提示,成功,分析成功原因#由于此时系统具有了mazeworld.py文件所在文件夹的路径,故当使用import命令时,系统会自动来到#这个文件夹进查找,当然就可找到而不会出错了#同时还有可能是因为版本问题出现报错,因为python2和python3要求的输出语言的代码不同#python2系列可以支持 print “xxxx”,python系列需要使用print("xxx") simpleMaze = mazeworld.Maze([['#', ' ', ' ', ' '], ['~', 'S', ' ', 'E']])print simpleMaze理解迷宫的表现形式#输出的迷宫为- - - -|# ||~ S E|- - - -#迷宫最典型的表现形式便是矩阵,而此处的迷宫也同样如此。
一、实训背景随着互联网的普及和信息技术的发展,搜索引擎已成为人们获取信息的重要工具。
然而,在信息爆炸的时代,如何在海量信息中快速、准确地找到所需信息,成为了一个亟待解决的问题。
为了提高信息检索的效率,我们开展了盲目搜索实训,通过模拟实际搜索过程,探索有效的搜索策略。
二、实训目的1. 熟悉搜索引擎的基本操作和功能;2. 掌握信息检索的基本原则和技巧;3. 提高在海量信息中快速、准确地找到所需信息的能力;4. 培养批判性思维和信息素养。
三、实训内容1. 搜索引擎的选择与使用实训过程中,我们选择了百度、谷歌、搜狗等国内外主流搜索引擎进行实践。
通过对比分析,我们发现百度在中国市场占有率较高,且具有强大的中文搜索能力;谷歌则在全球范围内具有较高的搜索精度;搜狗则具有独特的语音搜索功能。
在实际操作中,我们根据需求选择合适的搜索引擎,并熟悉其操作界面和功能。
2. 信息检索的基本原则(1)相关性:搜索结果应与用户需求具有较高的相关性,避免无关信息的干扰;(2)准确性:搜索结果应准确反映用户需求,避免误导;(3)全面性:搜索结果应涵盖用户需求的相关领域,避免遗漏;(4)时效性:搜索结果应关注最新动态,避免过时信息的影响。
3. 信息检索的技巧(1)关键词优化:选择合适的关键词,提高搜索精度;(2)逻辑运算符:使用逻辑运算符(如AND、OR、NOT)进行组合搜索,提高搜索效果;(3)高级搜索:利用搜索引擎的高级搜索功能,如筛选时间、网站类型等,提高搜索效果;(4)搜索结果分析:对搜索结果进行筛选、排序和去重,提高信息质量。
四、实训过程1. 阶段一:搜索实践在实训过程中,我们针对不同的主题进行搜索,如科技、教育、娱乐等。
通过实践,我们发现:(1)关键词优化对于提高搜索精度至关重要;(2)逻辑运算符在组合搜索中具有重要作用;(3)高级搜索功能可以帮助我们更精确地找到所需信息。
2. 阶段二:案例分析我们选取了几个具有代表性的案例进行分析,如“人工智能”、“区块链”等。
5.1 .什么是搜索?有哪两大类不同的搜索方法?二者的区别是什么?根据实际情况,按照一定的策略或规则,从知识库中寻找可利用的知识,从而构造出一条使问题获得解决的推理路线的过程,就称为搜索搜索一般分为盲目搜索和启发式搜索。
盲目搜索又称为无信息搜索,即在搜索过程中,只按预先规定的搜索控制策略进行搜索,而没有任何中间信息来改变这些控制策略。
由于这种搜索的控制策略都是预定的,不管什么问题都采用这样的控制策略,这就使得搜索带有盲目性,效率不高。
只适用于解决较简单问题。
启发式搜索又称有信息搜索,它是指在求解过程中,根据问题本身的特性或搜索过程中产生的一些信息来不断地改变或调整搜索的方向,使搜索朝着最有希望的方向前进,加速问题的求解,并找到最优解。
启发式搜索由于考虑到问题本身的特性并利用这些特性,从而使搜索求解的效率更高,更易于求解复杂问题5.2 什么是启发式搜索,什么是启发信息?启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。
为减小搜索范围而需要利用某些已知的,有关具体问题领域的特性信息。
5.3 请阐述状态空间的一般搜索过程。
OPEN表与CLOSED表的作用是什么?有何区别?1) 把初始节点S0 放入OPEN表,并建立只含S0的图,记为G2) 检查OPEN表是否为空,若为空则问题无解,退出3) 把OPEN表的第一个节点取出放入CLOSE表,记该节点为节点n4) 观察节点n 是否为目标节点,若是,则求得问题的解,退出5) 扩展节点n,生成一组子节点。
把其中不是节点n 先辈的那些子节点记作集合M,并把这些节点作为节点n 的子节点加入G中。
6) 针对M中子节点的不同情况,分别进行如下处理对于那些未曾在G 中出现过的M成员设置一个指向父节点( n)的指针,并把它放入OPEN 表对于那些先前已在G中出现过的M成员,确定是否要修改指向父节点的指针对于那些先前已在G中出现,并且已经扩展了的M成员,确定是否需要修改其后继结点指向父节点的指针7) 按某种搜索策略对OPEN表中的节点进行排序8) 转第2 步OPEN表:用于存放刚生成的节点CLOSE表:用于存放将要扩展或已扩展的节点区别:存放节点节点不同,open 表存放未扩展的节点,closed 表存放已经扩展的节点。
盲目搜索
搜索的含义
依问题的实际情况寻找可利用的知识,构造代价较少的推理路径从而解决问题的过程
离散的问题通常没有统一的求解方法
搜索策略的优劣涉及能否找到最好的解、计算时间、存储空间等
搜索分为盲目搜索和启发式搜索
盲目搜索:按预定的策略进行搜索,未用问题相关的或中间信息改进搜索。
效率不高,难求解复杂问题,但不失可用性
启发式搜索:搜索中加入问题相关的信息加速问题求解,效率较高,但启发式函数不易构造
盲目搜索也叫无信息搜索,只适合用于求解比较简单的问题。
我们没有指定问题的任何推理信息,例如要搜索这一部分而不是另一部分,就像到目前为止的只要发现一条到目标的路径即可。
这种过程被称为是盲目的。
盲目搜索过程只把算子应用到节点,它没有使用问题领域的任何特殊知识(除了关于什么动作是合法的知识外)。
最简单的盲目搜索过程就是广度优先搜索。
该过程把所有的算子应用到开始节点以产生一个显式的状态空间图,再把所有可能的算子应用到开始节点的所有直接后继,再到后继的后继,等等。
搜索过程一律从开始节点向外扩展。
由于每一步将所有可能的算子应用到一个节点,因此可把它们组成一个叫后继函数的函数。
当把后继函数应用到一个节点时,产生一个节点集,该节点集就是把所有能应用到那个节点的算子应用到该节点而产生的。
一个节点的后继函数的每一次应用称为节点的扩展相同代价搜索是广度优先搜索的一种变体,在该方法中,节点从开始节点顺着代价等高点向外扩展,而不是顺着相同深度等高线。
如果图中所有弧的代价相同,那么相同代价搜索就和广度优先搜索一致。
反过来,相同代价搜索可以看作是下一章要讲的启发式搜索的一个特殊情况。
广度优先和相同代价搜索方法的简要描述只给出了它们的主要思想,但是要解决其他复杂的情况则需要技术改进
深度优先搜索一次对节点应用一个算子以产生该节点的一个后继。
每一个节点都留下一个标记,用来指示如果需要时所必需的附加算子。
对每一个节点,必须有一个决策来决定哪个算子先用,哪个次之等等。
只要一个后继产生,它的下一个后继就会被生成,一直向下传下去,等等。
为了防止从开始节点的搜索过程深度太深,需要一个深度约束(depth bound)。
超过这个深度约束时不再产生后继(假定没有任何目标节点超过这个深度约束)。
这种限制允许我们忽略搜索图的一部分,这些部分已经确定不能高效地到达目标节点。
深度优先算法使我们只保存搜索树的一部分,它由当前正在搜索的路径和指示该路径上还没有完全展开的节点标志构成。
因此,深度优先搜索的存储器要求是深度约束的线性函数。
深度优先搜索的一个缺点是当发现目标时,我们不能保证找到的路径是最短长度。
另一个缺点是如果只有一个很浅的目标,且该目标位于搜索过程的后部时,也必须浏览大分搜索空间。
无信息图搜索过程
深度优先搜索(纵向搜索)
宽度优先搜索(横向搜索)
均一代价搜索
1.深度优先搜索
•定义
首先扩展最新产生的(即最深的)节点。
深度相等的节点可以任意排列。
这种盲目(无信息)搜索叫做深度优先搜索或纵向搜索。
•特点
扩展最深的节点的结果使得搜索沿着状态空间某条单一的路径从起始节点向下进行下去;只有当搜索到达一个没有后裔的状态时,它才考虑另一条替代的路径。
2. 宽度优先搜索
•定义
以接近起始节点的程度逐层扩展节点的搜索方法(breadth-first search),这种盲目(无信息)搜索叫做宽度优先搜索或横向搜索。
•特点
一种高代价搜索,但若有解存在,则必能找到它。
•算法
这种搜索是逐层进行的;在对下一层的任一节点进行搜索之前,必须搜索完本层的所有节点。
宽度优先搜索算法是一种“先进先出”的算法。
3. 均一代价搜索
•是横向搜索的一种推广,不是沿着等长度路径断层进行扩展,而是沿着均一代价路径断层进行扩展。
•搜索树中每条连接弧线上的有关代价,表示时间、距离等花费。
若所有连接弧线具有相等代价,则简化为横向搜索算法。