人工智能——图搜索

article/2025/10/24 3:04:17



一.数据驱动和目标驱动搜索

以下情况建议使用目标驱动搜索:

(1)目标或假设是在问题陈述中给出的。例如定理的证明,目标就是定理。

(2)与问题数据匹配的规则非常多,会产生大量分支。

(3)问题数据不是给定的,目标驱动搜索可以引导如何获取数据。

以下情况建议使用数据驱动搜索:

(1)问题的初始陈述给出了所有或大部分数据。

(2)潜在目标的数量非常庞大。

(3)难以组成目标或假设。

总而言之,要考虑的主要因素就是分支因子(即每个方向新状态的平均数量)。

二.盲目搜索

1.回溯搜索

回溯搜索就是从起始状态出发沿一条路径前进,要么达到目标,要么到达死端。如果到达死端,它便回溯到路径上含有尚未分析过兄弟的最近节点。这种回溯思想被应用到其他算法。

2.宽度优先搜索

算法如下:

(1)把起始节点放到OPEN表中;

(2)如果OPEN表是个空表,则失败退出,否则继续;

(3)把第一个节点nOPEN表中取出,放入CLOSE表中;

(4)扩展节点n,如果没有后继节点,则转向(2);

(5)把n的后继节点中不在OPENCLOSE表中的放到OPEN表的末端,这些后继节点要有指向父节点n的指针;

(6)如果n的任意一个后继节点是一个目标节点,成功推出;否则,转向(2)。

显而易见,宽度优先搜索方法能够保证找到一条到目标节点的最短路径。

递归形式的宽度优先搜索略。

3.深度优先搜索

含有深度界限的深度优先搜索:

1)把起始节点放到OPEN表中;

2)如果OPEN表是个空表,则失败退出,否则继续;

3)把第一个节点nOPEN表中取出,放入CLOSE表中;

4)扩展节点n,如果节点n的深度等于最大深度,或者n没有后继节点,则转向(2);

5)把n的后继节点中不在OPENCLOSE表中的放到OPEN表的首端,这些后继节点要有指向父节点n的指针;

6)如果n的任意一个后继节点是一个目标节点,成功推出;否则,转向(2)。

可以看出,与宽度优先的唯一区别就是新节点放在open表的开始还是结尾。

分支过程:如果含有多条路径,要找最优,则可以简单地利用分支过程降低复杂度。找到目标后,记录下路径长度为MIN,若搜索到的节点路径大于MIN,则放弃搜索,回溯到其他节点;如果小于MIN,这把较小值赋给MIN

递归形式的深度优先搜索算法:
OPENCLOSE为全局变量;

Depthsearch(){

如果OPEN表为空,return fail

current=OPEN中的第一个值;

If(current==goal)  return success;

else{

OPEN表中移除current,放入CLOSE表中;

current的孩子节点中的不是OPENCLOSE表中的添加到OPEN的开头;

}

Depthsearch();

}

还可以进一步简化这个过程:用递归本身来组织状态空间中的状态和路径,而不用显式的OPEN表,用全局变量CLOSE来探测重复状态并防止死循环:

CLOSE为全局变量;

Depthsearch(){
if (current==goal)  return success;

Add current to CLOSE;

While(current has unexamined child){

Child =next unexamined child;

If (child not a member of closed){

If(depthsearch(child)==success) return success;

}

}

Return fail;

}

4.等代价搜索

寻找具有最小代价的解答路径,是宽度优先搜索的推广:

(1)把起始节点放入OPEN表中,如果是目标节点,则成功退出,否则令g(s)=0

(2)如果OPEN是空表,则失败退出;

(3)从OPEN表中选择一个g(i)最小的节点,如果几个节点都合格,有目标节点就选目标节点成功退出,否则选一个节点iOPEN表中移出放入CLOSE表中;

(4)扩展节点i,如果没有后继节点,则转向第(2)步;

(5)对于节点i的每个后继节点j,计算g(j)=g(i)+c(i,j),并把所有后继节点j放入OPEN表中,提供回到节点i的指针;

(6)转向第(2)步。

5.与或图搜索

与常规的图搜索相比,与或图搜索需要多保存一些记录。检查或后继节点的方法与回溯中一样:一旦找到了沿或节点把目标连接到起始节点的一条路径,那么这个问题就解决了。如果一条路径失败,那么算法可以回溯并试验另一个分支。在检查与节点时,要证明与节点为真就必须证明这个节点的所有与后继都为真。 

下面给出目标驱动的深度优先的与或图搜索算法:

先定义节点:

class Node{

Node Parent;  //指向父节点指针

Int Value;  //False=0,True=1,不确定=2

Int type;  //当前节点类型,与=0,或=1

Int child_number;  //子节点数目

Int child_check;  //已检查子节点数目

}

在建立图时,把节点转换成纯粹的与节点或者或节点,例如:

 

(1)把头结点放入OPEN表中,如果头结点为真或假,则成功退出;

(2)如果OPEN为空则失败退出,如果头结点为真或假,则成功退出;

(3)移出OPEN中第一个元素i,放入CLOSE中,current=i

(4)如果current为真:

a.父节点是与,把父节点已检查子节点数目加一,如果父节点已检查数目等于父节 点的子节点数目,则current=父节点,返回(2);

b.父节点是或,父节点为真,current=父节点,并删除currentOPEN表中的所有 子节点,返回(2);

(5)如果current为假:

a.父节点是与,父节点为假,current=父节点,并删除currentOPEN表中的所有子节点,返回(2);

b.父节点是或,把父节点已检查子节点数目加一,如果父节点已检查数目等于父节点的子节点数目,则父节点为假,current=父节点,返回(2);

(6)如果current不确定:

a.如果还有子节点,把子节点放入OPEN表中,返回(2);

b.如果没有子节点,则让current为假,返回(5);

三.启发式搜索

1.估价函数f(n)

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

其中,g(n)是从任意状态n到起始状态的路径长度,h(n)是状态n到目标距离的启发性估计。估价函数的g(n)分量是这种搜索带有更多的宽度优先性,这防止了搜索被错误的评估所误导:如果启发对一条无法到达目标的路径上的状态连续给出“好的”评估,那么g值会上升来控制f,从而迫使搜索返回一条较短的解路径,这保证算法不会永久迷失。

当然,也可以让g(n)=0,来更快地找到目标;或则让h(n)=0,就是宽度优先搜索。

2.A算法

算法如下:

与宽度优先搜索不同之处就是:要对对OPEN表中的所有元素按照f进行排序,如果某个节点已经存在于OPENCLOSE表中,如果f值较小,则修改已存在节点的f值。还可以把OPENCLOSE表维护为堆或左撇子树来提高效率。

3.A星算法

我们定义一个估价函数:f星(n)=g星(n)+h星(n)

其中:g星(n)是从起始节点到节点n的最短路径代价,h星(n)是从n到目标的最短路径的实际代价。这样f星(n)就是从起始节点经过节点n到达目标的最优路径的实际代价。

可采纳的算法:如果在任何图中只要存在从起始节点到达目标状态的最优路径,搜索算法就可以找到这样的路径,那么这个算法就是可采纳的算法。

算法:如果在A算法中使用的评估函数满足h(n)<=h星(n),这种算法就称为A星算法。

所有的S星算法都是可采纳的。

四.博弈中的启发式搜索

1.可穷举搜索的极小极大过程

在状态可以穷举的博弈中,主要难点是如何考虑对手的动作。一简单方式是假定对手具有相同的关于状态空间的知识。MAX代表棋手,MIN代表对手,MAX总是最大化他的优势,MIN总是使MAX的优势最小。

如下图所示,每个叶子节点有一个01的值,代表MIN取胜或MAX取胜。极小极大搜索根据下面的规则沿连续的父节点向上传播这些值:

如果父节点是一个MAX节点,那么把孩子中的最大值赋给它;如果父节点是一个MIN节点,那么把孩子中的最小值赋给它。于是赋给每个状态的值表示了这个棋手可以期望达到的最佳状态值,算法就按此值来选择移动方法。

 

2.固定层深的极小极大过程

即探索到n层,然后给每个叶子节点赋一个启发值。

3.a-b过程

即对固定层深的极小极大搜索过程进行修剪。

 

它与分支过程思想类似:先沿着一条路径搜索到底,比如搜索完A,B,E,K,L后,E的值为3,由于F最小为5,故F的另一个分支就不用再搜索。同样,由于B的值为3,而C的值最大为0,故C的另一个分支也不用再搜索,D的另一个分支也不用再搜索。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


http://chatgpt.dhexx.cn/article/0a47aH9G.shtml

相关文章

人工智能搜索策略:A*算法

人工智能搜索策略&#xff1a;A*算法 目录 人工智能搜索策略&#xff1a;A*算法A算法1.全局择优搜索2.局部择优搜索 A*算法1. A*算法的可纳性2. A*算法的最优性3. h(n)的单调限制A* 算法应用举例对A*算法的一点思考熟练掌握A*算法的性质A*算法的性质A*算法的最优性h(n)的单调限…

智能搜索框

html部分 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, i…

Artificial Intelligence 人工智能 AI search AI 搜索

文章目录 前言一、Uninformed Search (无信息搜索&#xff09;二、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时间…

搜索技术——群智能

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

人工智能之搜索算法

通过搜索来解决问题 文章目录 通过搜索来解决问题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学习人工智能&#xff1a;模型于算法&#xff0c;下面记录课上的例子和学到的东西。 首先&#xff0c;人工智能搜索是从海量的信息源中通过约束条件和额外信息运用算法找到问题所对应的答案。 正所谓&#xff0c;你见&#xff0c;或者不见我&#xff0c;我就在那里不…

人工智能——搜索技术

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

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

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

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

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

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

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

ProxyPool 爬虫代理IP池(分享)

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

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

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

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

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

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

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

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

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

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

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

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