Artificial Intelligence 人工智能 AI search AI 搜索

article/2025/10/24 3:08:35

文章目录

  • 前言
  • 一、Uninformed Search (无信息搜索)
  • 二、Data structure for search tree
  • 三、Breadth-first search (广度优先搜索)
    • 1. Pseudocode for a BFS
  • 四、Depth-first search (深度优先搜索)
    • 1. Pseudocode for a DFS
  • 五、Measuring performance
  • 六、BFS和DFS时间和空间复杂度
  • 七、Iterative deepening search(迭代加深搜索)
  • 八、Branching factor (分支因子)
  • 九、Reference(参考文献)
  • 总结


前言

介绍(个人吐槽):本人是一个大二的计算机科学的在读生,这一篇文章相当于复习笔记一样的。
为什么要写这个文章?
一,是因为我发现计算机科学要学的东西太多太多了,我实在顶不住了!!!大一的知识的话还可以通过我聪明的小脑袋瓜学着混混。但大二的知识越来越难而且越来越多。所以我需要一个笔记将他们总结记录下来,以后方便复习。
二,是发布到网上可以让各位大佬们帮我看看我理解的正不正确,欢迎各位大佬与我讨论。
三,是以后毕业找工作时,还可以把我拥有的这个博客写入我的简历,想想就美滋滋!(加分加分)
提示:本片文章是本人上课后通过自己的理解总结下来的一些笔记。不一定是完全正确的。只是个人的片面之词。这也是本人第一次写这样的文章,我也不知道格式和书写语言是否合适,和正规。还请各位读者请多包涵,在这我先谢谢你们了。还有如果有大佬能发现文章中的理解错误的,虽然我不想耽误你们时间但如果可以帮我指出,我十分感谢。(在我眼里,能帮我指出我的错误的人都是我的大佬!!!)我也希望我的文章当你读完后可以对你有一点点帮助!


一、Uninformed Search (无信息搜索)

  • Agents have no additional information beyond that provided in the definition of the search problem.
  • Uninformed search algorithms do not have additional information about state or search space other than how to traverse the tree, so it is also called blind search
  • 无信息搜索算法意味着算法搜索时除了便利树之外,没有关于状态或者搜索空间的额外信息。

二、Data structure for search tree

  • Every node of our search tree has an associated data structure:           (id,state,parent_id,action,path_cost,depth)

    where:


    -id is the unique integral identifier of the node(1 for root). id 代表着每个节点有着自己的数字号码表示他本身。


    -state is the associated state from the state space (initial state for root). state是状态空间中的相关状态,如在根节点的state就为x0


    -parent_id is the identifier of the parent of the node in the search tree (empty for root). parent_id 就是父节点自身的id数字。根节点没有它的父节点,所以根节点没有parent_id的。


    -action is the action which enabled the transition from the parent-node to the node in question (empty for root). action是允许从父节点转换到相关节点的操作。


    -path_cost is the cumulative cost of the step-costs in the path from the root to the node in question (0for root). path_cost是从根节点到相关节点的累计花的步骤。


    -depth is the depth of the node in question (0for root). depth是根节点到相关节点的深度。

三、Breadth-first search (广度优先搜索)

  • Given the fringe of the search tree, every node on the fringe is expanded in each phase
     i.e., a node with smallest (search-tree) depth is expanded.
  • termination occurs when a goal-node appears on the fringe.
  • 基本过程,BFS 是从根节点开始,沿着树(图)的宽度遍历树(图)的节点。如果所有节点均被访问,则算法中止。一般用队列数据结构来辅助实现 BFS 算法。对于下面的树而言,BFS 方法首先从根节点1开始,其搜索节点顺序是 1,2,3,4,5,6,7,8。
    在这里插入图片描述

1. Pseudocode for a BFS

下图是BFS的伪代码表示:
在这里插入图片描述

BFS 使用队列 queue 来实施算法过程,queue有着先进先出 FIFO (First Input First Output)的特性。

四、Depth-first search (深度优先搜索)

  • given the fringe of the search tree, a node of greatest depth is expanded.
  • 其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。在这里插入图片描述

1. Pseudocode for a DFS

  • DFS is implemented by identical code to that implementing BFS except that the queue is now a lifo queue: “last-in first-out” (also called a stack).
  • 下图是DFS的伪代码表示:
    在这里插入图片描述
  • DFS的实现代码与BFS的实现代码完全相同,不同的是,该队列现在是后进先出(lifo)队列:“后进先出”(也称为堆栈)。

五、Measuring performance

  • We evaluate a search strategy using four concepts. 无信息搜索策略可以按照如下4个特点来评价:
  • Completeness(完备性):是否总能找到一个存在的解。
  • Optimality(最优性):是否总能找到最优的解。
  • Time complexity(时间复杂度):花费多长时间找到这个解。
  • Space complexity(空间复杂度):需要多少内存。

– Time/space complexity associated with specific notions of “size” or “difficulty”

  • b: the “branching factor”, namely the maximum number of children of a tree-node. b 为分支因子。后面有一个补充说明关于这个分支因子。
     maximum number of state-action successors of any state.
  • d: the depth of the shallowest goal-node in the search tree. d 是搜索树中最浅目标节点的深度
     smallest number of transitions from the initial state to a goal in the state space.
  • m: the maximum length of a path from the root in the search tree. m 是从搜索树的根结点开始的路径的最大长度
     the maximum length of a walk in the state space.
  • Time: the number of tree-nodes generated ( or revealed). 是生成(或显示)的树节点的数量。
  • Space: number of tree-nodes held in memory at any one time. 在任何时候存储在内存中的树节点数。

六、BFS和DFS时间和空间复杂度

  • 下面是我从其他博客里找到的内容,我认为它很好介绍了BFS和DFS的时间和空间复杂度:

DFS和BFS时间复杂度:O(n)
因为这是树 遍历,我们必须触摸每个节点,使这个O(n),其中n是树中的节点数。

BFS空间复杂度:O(n)
BFS必须至少存储队列中整个树的级别(样本 队列实施)。使用完美的完全平衡二叉树,这将是(n / 2 + 1)个节点(最后一个级别)。 最佳案例 (在此上下文中),树严重不平衡,每层只包含1个元素,空间复杂度为O(1)。 最坏的情况下 将存储(n-1)个节点与一个相当无用的N-ary树,其中除根节点之外的所有节点都位于第二级。

DFS空间复杂度:O(d)
无论实现(递归还是迭代),堆栈(隐式或显式)都将包含d个节点,其中d是树的最大深度。使用平衡树,这将是(log n)节点。 最坏的情况下 对于DFS来说,这将是BFS的最佳案例 最佳案例 DFS将是BFS最糟糕的情况。
————————————————
版权声明:本文为CSDN博主「Better-1」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/caihuanqia/article/details/111740236

  • 以下是我自己对这两个的理解:
  • DFS 是的内存是可以少于BFS的。因为DFS 作为运用栈的算法,当算法便利完左边的节点后没发现目标节点时,DFS是完全可以删除那些没有的节点的,如下图:
    在这里插入图片描述
    -所以这就是为什么BFS和DFS的空间复杂度的不同。BFS 是 O(bd),而DFS是O(bm).这里的bd其实就是n,节点的数量。bm就和d一样是最大深度。

七、Iterative deepening search(迭代加深搜索)

  • 其实就是将DFS和BFS结合起来一起用,对于一个树图进行分层,在每层使用DFS来找目标节点,如果没有到下一层,继续使用DFS 来寻找。如同:在这里插入图片描述

八、Branching factor (分支因子)

  • 因为我刚开始也不太知道什么是分支因子或对于一个树如何去求它的分支因子。我通过查阅发现维基百科很好的介绍什么是分支因子和如何对于一个树求分支因子。以下是引用从WIKIPEDIA:

In computing, tree data structures, and game theory, the branching factor is the number of children at each node, the outdegree. If this value is not uniform, an average branching factor can be calculated.

The average branching factor can be quickly calculated as the number of non-root nodes (the size of the tree, minus one; or the number of edges) divided by the number of non-leaf nodes (the number of nodes with children).

  • 简单来说Branching factor就是一个节点分支出多少个子节点。
  • 而一般来说对于一个tree来说,是求它的平均分子因子,这样更方便计算和使用。而平均分支因子就是用除了根节点的总节点数量除以总非叶子节点的数量。
  • 以下是一个简单的例子:在这里插入图片描述如同所示,这个树图的大小为10,则它的非根节点的节点总数为10-1=9,它的非叶子节点的数量为5。 所以它的平均分支因子为9/5,在1到2之间。

九、Reference(参考文献)

1,分支因子(百度)
2,分支因子(WIKIPEDIA)
3, 广度优先搜索
4,广度优先搜索原理与实践
5, 深度优先搜索
6,广度优先和深度优先树遍历的时间和空间复杂度是多少?
7,无信息搜索


总结

本篇写了无信息搜索,BFS和DFS分别是什么,和对比它们的时间和空间复杂度。还有简单描述了于他们相关的迭代加深搜索。(这是本人第一次写这样的文章,为了记录我的学习内容。如果幸运的你读到了这篇,希望对你有帮助。也希望大佬的你可以帮我看看我的理解是否正确。十分感谢。祝大家学业有成,工作顺利!!!)


http://chatgpt.dhexx.cn/article/9kRoBUAb.shtml

相关文章

搜索技术——群智能

如果有兴趣了解更多相关内容,欢迎来我的个人网站看看:瞳孔空间 一:初识群智能 1.1:粒子群算法 粒子群算法,也称粒子群优化算法或鸟群觅食算法(Particle Swarm Optimization),缩写…

人工智能之搜索算法

通过搜索来解决问题 文章目录 通过搜索来解决问题1. 什么是算法?2. 什么是搜索?3. 搜索算法3.1 如何做路径规划?3.2 搜索过程3.3 通用搜索算法3.4 盲目的搜索算法3.4.1 深度优先遍历(Deep First Search)3.4.2 广度优先遍历(BFS)3.4.3 Dijkstra 算法3.5 启发式搜索算法(有信息…

人工智能:搜索策略

一、无信息的搜索策略 1.宽度优先搜索 2.一致代价搜索 当每一步的行动代价都相等时宽度优先搜索是最优的,因为它总是先扩展深度最浅的未扩展结点。 一致代价搜索( uniform-cost search)扩展的是路径消耗(gn)最小的结点n。这可以通过将边缘结点集组织成按g值排序的队列来实现…

人工智能中的搜索

最近在mooc学习人工智能:模型于算法,下面记录课上的例子和学到的东西。 首先,人工智能搜索是从海量的信息源中通过约束条件和额外信息运用算法找到问题所对应的答案。 正所谓,你见,或者不见我,我就在那里不…

人工智能——搜索技术

转载:https://blog.csdn.net/Sun7_She/article/details/40344329 AI-3的80~84不懂 A*算法不懂 引言: 什么是搜索: 根据问题的实际情况不断寻找可利用的知识,构造出一条代价较少的推理路线,使问题得到圆满的解决的过程称…

新一代智能搜索引擎,让搜索一击即中

什么是搜索? 搜索引擎的英文为search engine。 搜索引擎是一个对互联网信息资源进行搜索整理和分类,并储存在专属网络数据库中供用户查询的系统,包括信息搜集、信息分类、用户查询三部分。 从使用者的角度看,搜索引擎提供一个包含…

浅谈人工智能搜索技术论文

摘要:本文简单阐述了人工智能中的智能搜索技术的概念以及启发式搜索算法,介绍了几种启发式搜索函数的选择及其研究中遇到的难题,并从中求解来探讨解决问题的思路。 关键词:智能搜索;状态空间;与/或树&…

Python搭建代理IP池(三)- 检测 IP

在获取 IP 时,已经成功将各个网站的代理 IP 获取下来了,然后就需要一个检测模块来对所有的代理进行一轮轮的检测,检测可用就设置为满分,不可用分数就减 1,这样就可以实时改变每个代理的可用情况,在获取有效…

ProxyPool 爬虫代理IP池(分享)

GitHub - jhao104/proxy_pool: Python爬虫代理IP池(proxy pool)https://github.com/jhao104/proxy_pool/ProxyPool 爬虫代理IP池项目,主要功能为定时采集网上发布的免费代理验证入库,定时验证入库的代理保证代理的可用性,提供API和CLI两种使用方式。同时…

python爬虫设置代理ip池【源代码】(存入数据库)

python爬虫设置代理ip池【源代码】 在爬取各大网站时,经常遇到一些由于访问次数过多或者访问频率过高,而导致你的ip被“封”。所以我们运用 代理ip池 来解决这个由于访问频率过高而终止爬取进行。 下面介绍一下免费获取代理ip池的方法: 一…

python3之爬虫代理IP的使用+建立代理IP池

爬虫代理IP的使用建立代理IP池 代理IP的使用建立代理IP池完整代码 代理IP的使用 先了解一下百度百科定义的IP 为什么要使用代理IP? 反爬(反网络爬虫) 示例: 测试网址 http://httpbin.org/get 用浏览器先访问测试网址下看看 再用我们写的代码简单请求一下网页看看 impo…

教你创建一个免费的代理IP池(txt存储版本)

教你创建一个免费的代理IP池(txt存储版本) 很多人可能会为爬虫被ban,IP被封等反爬机制苦恼,接下来我就教给大家如何白嫖做一个代理IP池。 准备工作 首先是准备工作,因为是第一个版本,因此我打算先用txt存…

什么是代理IP池,如何构建?

什么是代理ip池? 通俗地比喻一下,它就是一个池子,里面装了很多代理ip。它有如下的行为特征: 1.池子里的ip是有生命周期的,它们将被定期验证,其中失效的将被从池子里面剔除。 2.池子里的ip是有补充渠道的&…

Python爬虫——怎么搭建和维护一个本地IP池

目录 背景 一、什么是本地代理IP池 二、代理IP池功能架构图 三、各个组件功能说明及示例代码 1. IP池管理器 2. 代理IP获取器 3. IP质量检测器 4、数据存储器 5、API接口层 6、应用程序 总结 背景 在我们进行爬虫工作时,经常需要使用代理IP。大多数代理…

搭建代理IP池的方法

突破次数的限制就可以使爬虫更高效的工作,代理IP是突破次数限制,提高爬虫高效工作的最好的工具。所以,很多人都想通过建立IP池的方法,实现换IP突破限制,那么这IP池如何进行搭建呢? 一,免费搭建代理IP池的方法 1.主要用途 当进行数据爬取的时候,有一部分网站是设置了一些…

scrapy中添加ip池的方法

scrapy中添加ip池的方法 我使用的是scrapy2.2 setting 中写下ip池 IPPOOL [{ipaddr:221.230.72.165:80}, {ipaddr:175.154.50.162:8118}, {ipaddr:111.155.116.212:8123},]在在中间件midllewares添加代码 from mypython.settings import IPPOOLfrom scrapy import signals …

Python爬虫 教程:IP池的使用

一、简介 爬虫中为什么需要使用代理 一些网站会有相应的反爬虫措施,例如很多网站会检测某一段时间某个IP的访问次数,如果访问频率太快以至于看起来不像正常访客,它可能就会禁止这个IP的访问。所以我们需要设置一些代理IP,每隔一…

如何建立爬虫代理ip池

目录 一、为什么需要建立爬虫代理ip池 二、如何建立一个爬虫代理ip池 原文地址:https://www.cnblogs.com/TurboWay/p/8172246.html 一、为什么需要建立爬虫代理ip池 在众多的网站防爬措施中,有一种是根据ip的访问频率进行限制的,在…

requests模块代理IP池搭建视频爬取

requests模块&代理IP池搭建 一 requests模块使用1.1 get请求1.2 url编码和解码1.3 携带请求头1.4 携带cookie1.5 发送post请求1.6 requests.session1.7 Response1.8 获取二进制数据1.9 解析json 二 使用代理三 django后端获取客户端ip地址四 爬取视频网站五 爬取新闻六 Bau…

Python之爬虫 搭建代理ip池

文章目录 前言一、User-Agent二、发送请求三、解析数据四、构建ip代理池,检测ip是否可用五、完整代码总结 前言 在使用爬虫的时候,很多网站都有一定的反爬措施,甚至在爬取大量的数据或者频繁地访问该网站多次时还可能面临ip被禁,…