人工智能:搜索策略

article/2025/10/24 5:27:34

一、无信息的搜索策略

1.宽度优先搜索

2.一致代价搜索

当每一步的行动代价都相等时宽度优先搜索是最优的,因为它总是先扩展深度最浅的未扩展结点。

一致代价搜索( uniform-cost search)扩展的是路径消耗(gn)最小的结点n。这可以通过将边缘结点集组织成按g值排序的队列来实现。算法如图3.14所示
在这里插入图片描述

3.深度优先搜索

4. 深度受限搜索

5. 迭代加深的深度优先搜索

5.双向搜索

双向搜索( bidirectional search)的思想是同时运行两个搜索个从初始状态向前搜索同时另一个从目标状态向后搜索—希望它们在中间某点相遇,此时搜索终止(图3.20)。理由是 b d 2 + b d 2 b^{\frac{d}{2}}+b^{\frac{d}{2}} b2d+b2d要比 b d b^d bd小很多,或者可以看图,两个小圆的面积相加比以起点为中心到达

无信息搜索策略对比

在这里插入图片描述
一致代价搜索由路径代价而不是深度来引导,所以算法复杂度不能简单地用b和d来表示。引入 C ∗ C^* C标识最优解的代价,假设每个行动的代价至少为 ϵ \epsilon ϵ

那么最坏情况下,算法的时间和空间复杂度为 O ( b 1 + [ C ∗ / ϵ ] ) O(b^{1+[C^*/\epsilon]}) O(b1+[C/ϵ]),要比b大得多。这是因为一致代价搜索在探索包含代大的行动之前,经常会先探索代价小的行动步骤所在的很大的搜索树。当所有的单步耗散都相等的时候, O ( b 1 + [ C ∗ / ϵ ] ) O(b^{1+[C^*/\epsilon]}) O(b1+[C/ϵ])就是 b d + 1 b^{d+1} bd+1。此时,一致代价搜索与宽度优先搜索类似,除了算法终止条件,宽度优先搜索在找到解时终止,而一致代价搜索则会检査目标深度的所有结点看谁的代价最小;这样,在这种情况下一致代价搜索在深度d无意义地做了更多的工作。

二、有信息的搜索策略

1. 最佳优先搜索

最佳优先搜索(best- first search)是一般TREE-SEARCH和 GRAPH- SEARCH算法的一个实例,结点是基于评估函数f(n)值被选择扩展的。评估函数被看作是代价估计,因此评估值最低的结点被选择首先进行扩展。最佳优先图搜索的实现与一致代价搜索类似,不过最佳优先是根据f值而不是g值对优先级队列排队. 以下的贪婪最佳优先搜索和A*搜索时最佳优先搜索的两个特例(具体实现)。

2. 贪婪最佳优先搜索

该算法(greedy best-first search)试图拓展距离目标最近的结点。即评估函数 f(n) = h(n) (heuristic) = estimate of cost from n to goal

完备性:不完备的(也就是说不一定能找到问题的解)

算法复杂度:

(1)时间复杂度: O ( b m ) O(b^m) O(bm)
(2)空间复杂度: O ( b m ) O(b^m) O(bm)

其中,b是邻居节点的最大数量,m是搜索空间的最大深度。

缺点:不完备的,可能会卡在循环中,例如,我们考虑从lasi到Fagaras的问题,从直线距离上讲,lasi的邻居中Neamt距离Fagaras最近,因此会走到Neamt,而Neamt只有一个邻居,因此会重新回到Iasi,因此会陷入死循环 I a s i → N e a m t → I a s i → N e a m t Iasi\rightarrow Neamt\rightarrow Iasi\rightarrow Neamt IasiNeamtIasiNeamt
在这里插入图片描述

3. A*搜索

(1)A*搜索的算法流程

该算法流程与一致代价搜索类似(如下所示),除了A*使用的代价函数是g+h而不是g

//优先队列为小根堆
WHILE 优先队列不为空取出队头并扩展将扩展节点以估价值+当前值为优先级入队
END WHILE

补充:一致代价搜索的过程:
在这里插入图片描述
而一致代价搜索它的算法流程又跟优先队列搜索相关。在图3.15的搜索中都起到了作用,图中的搜索是从 Sibiu到 Bucharest。 Sibiu的后继包括 Rimnicu Vilcea和 Fagaras,代价分别为80和99。最小代价结点为 Rimnicu Vilcea被选择扩展,此时加入了 Pitesti代价为80+97=177。所以这时的最小代价结点为 Fagaras,扩展它得到 Bucharest代价为99+211=310。目标结点已经生成,但是一致代价搜索算法还在继续,选择 Pitesti扩展得到到达 Bucharest的第二条路代价为80+97+101=278。现在算法则需要检查新路径是不是要比老路径好;确实是新的好,于是老路径被丢弃。 Bucharest, g代价为278,被选择扩展算法返回。

启发式函数是:

f(n) = g(n) +h(n)

g(n)是从开始结点到节点n的路径代价,而h(n)是从节点n到目标结点的最小代价路径的估计值。

(2)保证最优性的条件

i. 可采纳性(Admissibility)
一个可采纳的启发式是指这个启发式从不会过高估计到达目标的代价,也就是f(n)永远不会超过经过节点n的解的实际代价。

定理1: 如果h(n)是可采纳的,那么A*的树搜索版本是最优的

举例说明: 需补充

ii. 一致性(Consistency)
如果对于每个节点n和通过任一行动a生成的n的每一个后继节点n’,从节点到达目标的估计代价不大于从n到n’的单步代价与从n’到达目标的估计代价之和:

h ( n ) ≤ c ( n , a , n ′ ) + h ( n ‘ ) h(n) \leq c(n,a,n') + h(n‘) h(n)c(n,a,n)+h(n)

一致性规定了启发性函数的特点(也就是让我们在设计启发性函数的时候满足以上不等式)

可以看到,在一致代价搜索中,h(n)即为距离目标的直线距离,可以看到,如果所有节点到目标的直线距离满足上述一致性公式,则图1所示的无法找到解的状况将不复存在。该性质确保了在搜索的过程中不存在往回走的情况,因此,我们可得到第二个定理。

定理2: 如果h(n)是一致的,那么A*的图搜索版本是最优的,即一定能找到最优解

(3)算法分析

i. 算法复杂度:

复杂度结构十分依赖于状态空间的定义。对于只有一个目标状态的状态空间,A*的时间复杂度是指数级的。

对于那些每步骤为常量的问题,时间复杂度的增长是最优解所在深度d的函数,这可以通过启发式的决定错误和相对错误来分析。绝对误差定义为 △ = h ∗ − h \triangle=h^*-h =hh,其中 h ∗ h^* h是从根节点到目标节点的实际代价,相对误差定义为 ϵ = ( h ∗ − h ) / h ∗ \epsilon = (h^*-h)/h^* ϵ=(hh)/h. h是对代价的估计,h比 h ∗ h^* h越小,那么在找最优解的过程中误判(错走到不是实际代价最小的路径)的几率就越大。

对于简单状态空间的问题,A*的时间复杂度可以用 O ( b △ ) O(b^{\triangle}) O(b)标识,考虑每步骤代价均为常量,我们可以把这记为 O ( b ϵ d ) O(b^{\epsilon d}) O(bϵd),其中d是解所在的深度。

(1)时间复杂度: O ( b ϵ d ) O(b^{\epsilon d}) O(bϵd)
(2)空间复杂度:Keeps all nodes in memory

ii. 优缺点:

优点:是完备的,而且能找到最优解

缺点:需要花费大量内存,常常在计算完之前就耗尽了它的所有内存。

4. 存储受限的启发式搜索

(1)IDA*算法

IDA算法,也就是迭代加深的A算法,可以在一定程度上减少对存储的浪费。

(2)递归最佳优先搜索(RBFS)

递归最佳优先搜素(RBFS)是一个简单的递归算法,它试图模仿标准的最佳优先搜索的操作,但只使用线性的存储空间。算法如图3.26所示。它的结构和递归深度优先搜索类似,但是它不会不确定地沿着当前路径继续,它用变量fimi跟踪记录从当前结点的祖先可得到的最佳可选路径的∫值。如果当前结点超过了这个限制,递归将回到可选路径上。
在这里插入图片描述
IDA和RBFS的问题在于它们使用的内存过于小了。在两次迭代之间,IDA只保留1个数字:当前的f代价界限值。RBFS在内存中保留的信息多一些,但也只用到线性空间即便有更多可用的内存,RBFS也没有办法利用。因为两个算法都忘记了它们做过什么所以算法终止时有些状态可能重复扩展多次。更坏的是,图中的冗余路径会带来复杂度的潜在的指数级的增长(见3.3节)。

RBFS具体示例:
在这里插入图片描述

(2)MA*

内存受限A*(MA*),简化的MA*(SMA*)

SMA算法很像A算法,扩展最佳叶结点直到内存耗尽。就是说,要在搜索树中加入新结点就得抛弃个旧结点。SMA总是丢弃最差的叶结点即f值最高的结点。像RBFS一样,SMA把被遗忘结点的值回填给父结点。这样,被遗忘子树的祖先结点可以了解子树的最佳路径。有了这个信息,当所有其他路径看来比被遗忘路径要差的时候,SMA*可以重新生成该子树。换句话说,如果结点n的所有子孙结点都被遗忘了,我们不知道从n该走哪条路,但是我们知道从n去别处是否值得。

三、局部搜索算法

局部搜索算法适用于那些关注解状态而不是路径代价的问题。

1. 爬山法

2. 模拟退火搜索

模拟退火算法的内层循环(图4.5)与爬山法类似。只是它没有选择最佳移动,选择的是随机移动。如果该移动使情况改善,该移动则被接受。否则,算法以某个小于1的概率接受该移动。如果移动导致状态“变坏”,概率则成指数级下降一一评估值△E变坏。这个概率也随“温度”7降低而下降:开始ア高的时候可能允许“坏的”移动,T越低则越不可能发生。如果调度让T下降得足够慢,算法找到全局最优解的概率逼近于1。
在这里插入图片描述

3. 局部束搜索(local beam search)

4. 遗传算法

  1. 使用字符串(基因)标识状态空间,初始状态称之为种群
  2. 计算每个个体的适应度函数
  3. 依照适应的函数成正比的概率进行杂交,得到新的状态
  4. 随机选择变异点(某个字符)进行变异。
    在这里插入图片描述

http://chatgpt.dhexx.cn/article/JmT1emKa.shtml

相关文章

人工智能中的搜索

最近在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被禁,…

如何构建一个自己的代理ip池

一、默认自动切换IP 登录线程IP池客户端时,默认情况下会自动切换IP。 如果不想自动切换IP,或者还没有准备开始使用,请在客户端右侧将“在IP过期前几秒自动申请切换”设置为“0”。 0无效。 二.默认情况下不需要授权 默认情况下&#xff0c…

搭建代理IP池

目录 爬取前的准备 爬取有IP内容 检查IP的可用性 上一期讲到在爬取豆瓣电影Top250时,出现ip被封的情况,解决方案给出了两种: 1. 换个WiFi或者热点; 2. 搭建代理IP池。 那么这期就来搭建代理IP池。通常来说,搭建代理…

python搭建ip池

在爬取网站的时候我们有时候会遭受封ip等显现,因此我们需要搭建自己的ip池用于爬虫。 代码过程简述: 1、爬取代理ip网站信息 2、将获取的信息处理得到ip等关键信息 3、保存首次获取的ip信息并检测其是否可用 4、检测完毕将可用ip保存,搭…