人工智能原理复习--搜索策略(一)

文章目录

  • 上一篇
  • 搜索概述
  • 一般图搜索
  • 盲目搜索
  • 下一篇

上一篇

人工智能原理复习–确定性推理

搜索概述

问题求解分为两大类:知识贫乏系统(依靠搜索技术解决)、知识丰富系统(依靠推理技术)
两大类搜索技术:

  1. 一般图搜索、启发式搜索
  2. 基于问题规约的与或图搜索

求解问题包括:1. 目标表示 2.搜索 3.执行
初始状态集合和操作符集合定义了问题的搜索空间

搜索策略评价标准:

  1. 完备性
  2. 最优性
  3. 时间复杂性
  4. 空间复杂性

一般图搜索

状态空间搜索是一般图搜索的代表形式,用状态空间搜索来求解问题的系统均定义一个状态空间,并通过适当的搜索算法态空间中搜索解答路径

状态空间表示法:定义状态的描述形式,将一切状态表示出来,再定义一组操作算子,通过他们将问题由一种状态转变为另一个状态。问题求解过程就是不断通过操作作用于状态的过程,得到操作状态到目标状态所用的操作序列的过程。

而使用操作最少或较少的解称为最优解,采用不同的搜索策略得到的结果顺序也可能不同。



状态空间可表示成二元组(S, O):
S:表示所有可能到达的合法状态构成的集合
O:表示操作算子的集合
状态就用一个矢量来表示某一时刻问题现状的快照

状态空间图:1. 结点:状态 2. 有向弧:状态的变迁 3.弧上的标签:导致状态变迁的操作算子
问题的状态空间是一个表示该问题的所有可能状态及其变迁的有向图

状态空间表示例子在这里插入图片描述

  1. 状态:(1, 0, 1) 表示状态位(正,反,正)
  2. 操作算子:
    a:表示翻转第一个钱币
    b:表示翻转第二个钱币
    c:表示翻转第三个钱币

在这里插入图片描述
传教士与野人问题
描述:N个传教士带领N个野人划船过河;
需要满足三个约束条件:

  1. 船上人数不得超过载重限量,设为K个人
  2. 任意时刻(包括两岸、船上)野人数量不得超过传教士
  3. 允许在河的某一岸或者在船上只有野人而没有传教士

求解当N = 3,K = 2时的状态空间有向图
解:
状态表示:
(m, c, b)表示(传教士在左岸的实际数量,野人在左岸实际数量,船是否停在左岸(0/1))
共有 4 x 4 x 2 = 32中状态
其中合法状态:

  1. 左岸传教士和右岸传教士人数大于野人
    m = 1, c = 1; m = 2, c = 2;
  2. 左岸只有野人没有传教士
    m = 0, c = 0, 1, 2, 3
  3. 左岸只有传教士没有野人
    m = 3, c = 0, 1, 2, 3

不可能达到的合法状态:

  • (0, 0, 1)人过去了船飘了回去
  • (0, 3, 0) 传教士过去不带野人不符合目的
  • (3, 0, 1) 野人过去但是船回来了
  • (3, 3, 0) 只有船过去了

操作算子:
L(x, y)表示从左岸向右岸划船,x表示传教士人数,y表示野人数量
R(x, y)表示从右岸向左岸划船,x表示传教士人数,y表示野人数量

x, y取值为(1, 0) , (2, 0), (1, 1), (0, 1), (0, 2)
可以看出野人自己也会划船

在这里插入图片描述
而整个状态空间搜索可以用五元组表示:
SE=(S,O,E,I,G)
E–搜索引擎(搜索策略/算法)
I–问题的初始状态
G–问题的目标状态

基本思想:通过搜索引擎E寻找一个操作算子的调用序列,使问题从初始状态I变迁到目标状态G之一。
解答路径就是从初始状态到目标状态的操作算子的调用序列。

搜索树:
一般图的搜索过程是或图,操作算子之间时一种“或”的关系

搜索术语:

  1. 节点深度:根节点指示初始状态,不同情况对应的操作顺序长度
  2. 节点扩展:应用操作算子将上一状态转变到下一状态而拓展出节点
  3. 路径:要求路径是无环的
  4. 路径代价:

符号说明:
s – 初始状态节点
G – 搜索图
OPEN – 存放待扩展节点的表
CLOSE – 存放已被扩展的结点的表
MOVE-FIRST(OPEN) – 取OPEN表首的节点作为当前要被扩展的节点n同时将结点n移至CLOSE表

分为两个阶段:

  1. 初始化
    • 建立只包含初始结点s的搜索图G:={s}
    • OPEN:={s}
    • CLOSE:={}
  2. 搜索循环
    • MOVE-FIRST(OPEN)-取出OPEN表首的结点n作为扩展节点,同时将其移到close表
    • 拓展n的子节点,插入图G和OPEN表
    • 适当标记和修改指针
    • 排序OPEN表

扩展的节点分为3类:

  1. 全新节点(直接加入到OPEN表中)
  2. 已出现在OPEN表中的节点(在OPEN表排序,找最短搜索顺序)
  3. 已出现在CLOSE表中的节点(当前确定的路径)

盲目搜索

提高搜索效率的关键是优化OPEN表中节点的排序方式

BFS
扩展当前节点后生成的子节点总是置于OPEN表的后端,及OPEN表作为队列,先进先出,是搜索优先向横向方向发展。

性质:

  1. 当问题有解时,一定能找到解
  2. 当问题为单位代价时,有解时,一定能找到最优解
  3. 效率较低,具有通用性,属于图搜索方法

优缺点:

  1. 找到目标节点的路径最短
  2. 时间和空间复杂度都比较高,无用节点较多

DFS
扩展当前节点后生成的子节点总是置于OPEN表的前端,即OPEN表作为栈,后进后出,使搜索优先向纵深方向发展。

由于人工智能中一条路径的深度不可测,所以这样做不一定找得到最佳解,甚至可能找不到解,所以为了保证能找到解所以应加上深度界限(有界DFS),或者采取不断加大深度界限的办法,反复搜索(迭代加深DFS)。

DFS的性质:

  • 不能保证找到最优解
  • 当深度限制不合理时,可能找不到解
  • 最坏情况下相当于穷举,是一个通用的与问题无关的方法

优缺点:
优点:比BFS使用较少的空间
缺点:既不是完备的,也不是最优的

BFS与DFS的比较

DFSBFS
适用场合当问题有多个解且只需要找到其中一个时,往往对深度进行限制确保搜索到的是最短路径
共同优缺点优点:不需要设计排序方法,简单易行,适用于复杂度不高的问题缺点:节点排序的盲目性,白白搜索了大量无关的状态节点

有界DFS
按深度优先算法进行,但是要给深度一个限制

深度dm很重要,当dm过小时可能找不到解是不完备的,当dm过大时,搜索过程会产生过多的无用节点,即浪费了计算机资源,又降低了搜索效率

主要问题就是深度限制值dm的选取

迭代加深搜索
先任意给定一个较小的数作dm,然后按有界深度算法搜索,若在此深度限制内找到了解,则算法结束,否则增大深度限制dm,继续搜索。

相对于整个树的结点来说,距离根节点的节点就是很少的,对这些节点反复扩展对于整个树来说是很小的,所以相对看了负担实际很小。

四种方法的比较

  • 四种方法都可以用于生成和测试后面改进的算法的性能
  • 宽度优先搜索需要指数数量的空间,深度优先搜索的空间复杂度和最大搜索深度呈线性关系
  • 迭代加深搜索对一颗深度受控的树采用深度优先的搜索,它结合了宽度优先和深度优先的优点,和宽度优先搜索一样,它是最优的,也是完备的。但对空间要求和深度优先搜索一样是适中的。
标准宽度优先深度优先有界深度迭代加深
时间 b d b^d bd b m b^m bm b d m b^{dm} bdm b d b^d bd
空间 b d b^d bd b ∗ m b*m bm b ∗ d m b*dm bdm b d bd bd
最优
完备如果 d m > d dm > d dm>d

b是分支系数,d是解答深度,m是搜索树的最大深度,dm是深度限制

下一篇

未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/231630.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT有什么新奇的使用方式?

2023,ChatGPT几乎席卷了所有行业,并且具有不可测量的巨大潜力等着我们去挖掘。 越来越多人对ChatGPT的应用产生兴趣,知乎上“ChatGPT有什么新奇的使用方式?”这一个热门话题的兴起就是最好的证明。 写作,毫无疑问&…

Numpy数组的去重 np.unique()(第15讲)

Numpy数组的去重 np.unique()(第15讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

13 RT1052的中断应用概览

文章目录 13.1 异常类型13.2 NVIC13.2.1 NVIC一些概念13.2.2 NVIC的SDK支持13.3 优先级的定义13.3.1 AIRCR13.3.2 优先级分组 13.4 中断编程13.4.1 中断服务函数 RT1052 中断非常强大,每个外设都可以产生中断 13.1 异常类型 异常响应系统,分为系统异常和…

【c语言指针详解】复杂数据结构的指针用法

目录 一、动态内存分配 1.1 使用malloc和free函数进行内存的动态分配和释放 1.2 内存泄漏和野指针的概念和解决方法 二、复杂数据结构的指针用法 2.1 结构体指针和成员访问操作符 2.2 指针数组和指向指针的指针 2.2.1 指针数组 2.2.2 指向指针的指针 2.3 动态内存分配与结构体指…

React面试题(1)

1、什么是React? React是一个用于构建用户界面的JavaScript库。 2、React的特点是什么? React的主要特点包括: 组件化虚拟DOM单向数据流JSX语法高效的性能生态系统丰富 3、什么是JSX? JSX是一种JavaScript的语法扩展&#x…

C语言数据结构-----二叉树(1)认识数、二叉树、堆及堆的代码实现

前言 本篇文章讲述数、、二叉树、堆的基本概念和知识,以及堆的代码实现。 文章目录 前言1.树概念及结构1.1 树的定义1.2 树的基本概念1.3 如何区分树?1.4 二叉树1.5 二叉树的分类1.6 二叉树的存储结构 2.堆2.1 堆的基本概念2.2 堆的代码实现2.2.1 堆的…

【计算机网络】URL概念及组成

目录 前言 一. URL是什么 二. URL的组成 三. encode和decode 结束语 前言 本系列文章是计算机网络学习的笔记,欢迎大佬们阅读,纠错,分享相关知识。希望可以与你共同进步。 本篇讲解使用浏览器不可或缺的部分——URL 一. URL是什么 域…

前端使用视频作为背景图的方法

实现思路 通过 video source 引入视频&#xff0c;并对视频播放属性进行设置&#xff0c;再通过 css 使视频覆盖背景即可。 代码 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>有开发问题可联系作者</title>…

小白学java栈的经典算法问题——第四关白银挑战

内容1.括号匹配问题2.最小栈3.最大栈 1.括号匹配问题 栈的典型题目还是非常明显的&#xff0c;括号匹配、表达式计算等等几乎都少不了栈&#xff0c;本小节我们就看两个最经典的问题 首先是LeetCode20,链接 本道题还是比较简单的&#xff0c;其中比较麻烦的是如何判断两个符…

LeetCode刷题--- 求根节点到叶节点数字之和

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏&#xff1a;http://t.csdnimg.cn/ZxuNL http://t.csdnimg.cn/c9twt 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回溯算法&#xff0c;所以下面题目主要也是这些算法做的 我讲述…

正则表达式:字符串处理的瑞士军刀

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

C++ Qt开发:字符串QString容器

在Qt框架中&#xff0c;QString 是一个强大而灵活的字符串容器&#xff0c;专为处理 Unicode 字符而设计。它提供了许多方便的方法来操作和处理字符串&#xff0c;使得在跨平台开发中能够轻松地进行文本操作。QString 是 Qt 开发中不可或缺的一部分&#xff0c;它的灵活性和强大…

Java9及之后关于类加载器的新特性

为了保证兼容性&#xff0c;JDK9没有从根本上改变三层类加载器的架构和双亲委派模型&#xff0c;但为了模块化系统的顺利运行&#xff0c;仍然发生了一些值得被注意的变动。 一、变动1 由于引入了模块化概念&#xff0c;所以不同的类加载器回去加载属于不同模块的类 启动类加…

打工人副业变现秘籍,某多/某手变现底层引擎-Stable Diffusion简介

Stable Diffusion是2022年发布的深度学习文本到图像生成模型,它主要用于根据文本的描述产生详细图像,尽管它也可以应用于其他任务,如

使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题

文章目录 一、 篇头二、 操作步骤2.1 编译AOSP AS工程文件2.2 将AOSP导入Android Studio2.3 切到Project试图2.4 等待index结束2.5 下载缺失的JDK 1.82.6 导入完成 三、 导入AS的好处3.1 本文案例演示源码编译错误AS对比同文件其余地方的调用AS错误提示依赖AS做错误修正 一、 篇…

字符串函数strtok

1.调用格式&#xff1a; 2.调用形式&#xff1a;char*strtok(char*p1,const char*p2),其中第二个是由分隔符组成的字符串&#xff0c;第一个为需要分隔的字符串 3.调用目的&#xff1a;将分隔符之间的字符串取出 4.调用时一般将源字符串拷贝后调用&#xff0c;因为此函数会将…

键盘打字盲打练习系列之循序渐进——4

一.欢迎来到我的酒馆 盲打&#xff0c;循序渐进&#xff01; 目录 一.欢迎来到我的酒馆二.继续练习二.矫正坐姿 二.继续练习 前面的章节&#xff0c;我们重点向大家介绍了主键盘区指法和键盘键位。经过一个系列的教程学习&#xff0c;相信大家对盲打这项技能已经掌握得差不多了…

金融量化交易:使用Python实现遗传算法

大家好&#xff0c;遗传算法是一种受自然选择过程启发的进化算法&#xff0c;用于寻找优化和搜索问题的近似解决方案。本文将使用Python来实现一个用于优化简单交易策略的遗传算法。 1.遗传算法简介 遗传算法是一类基于自然选择和遗传学原理的优化算法&#xff0c;其特别适用…

数据分析实例:基于电力大数据的中小型企业运营发展分析

前不久&#xff0c;帆软发起了【2023BI数据分析大赛】的活动&#xff0c;老李我也是这个大赛的评委。   今天跟大家分享的是基于电力大数据的中小型企业运营发展分析。 当我们去解读一份数据分析报告时&#xff0c;首先要了解这份报告的主要目的是什么&#xff0c;作者通过分…

mapbox使用v3版本,v2的样式切换不同时间段

创建DayAndNight.js /*** 使用方式* const dayNight new DayAndNight({ map: map // map 地图对象}) * 修改类型* dayNight.setConfigProperty(value)*/ class DayAndNight {constructor (sdMap) {this.map sdMap.mapthis.initStyle()}// 初始化时添加必要样式initStyle () {…