【人工智能】1.问题求解:状态空间图和盲目搜索

2023-05-16

什么是问题求解?问题求解可以理解为利用知识,尽可能有效的找到问题的解,或者最优解的过程,主要包括:
1)问题描述方法:状态空间法,与或树表示法;
2)搜索方法(搜索策略):盲目搜索,启发式搜索。

一、状态空间问题描述

1.问题表示

1)初始状态集合:当前所处的环境的集合。
2)操作符集合:把一个问题从一个状态变换为另一个状态的动作集合。
3)目标测试函数:确定一个状态是否是目标。
4)路径费用函数:从一个状态到另一个状态的代价等。

2.状态空间法

状态空间法是以状态算符为基础来表示和求解问题的。
1)状态:状态用于描述问题求解过程中任一时刻状况的数据结构,用一组变量的有序组合表示:SK=(SK0,SK1,…)
2)操作符(算符):把问题从一种状态变换为另一种状态的手段。走步、过程、规则、数学算子、运算符号或逻辑符号。
3)状态空间:(S,F,G)表示,其中S为初始状态的集合,F是操作符的集合;G是目标状态的集合。
4)状态空间图:用状态标识节点,用操作标识有向边,有向边的方向由操作的施加对象状态指向操作的结果状态。

3.二阶汉诺塔问题的表示

二阶汉诺塔问题:设有1、2、3三根钢针,在1号钢针上穿有A、B两个金片,A小于B,A位于B的上面。要求把这两个金片全部移到另一根钢针上,而且规定每次只能移动一片,任何时刻都不能使B位于A的上面
1)状态:SK=(SK0,SK1),SK0表示A所在的钢针号,SK1表示B所在的钢针号:在这里插入图片描述
2)操作:A(i, j)表示把金片A从i号钢针移到j号钢针;B(i, j)表示把金片B从i号钢针移到j号钢针。
在这里插入图片描述
3)组成状态空间图:
在这里插入图片描述

二、盲目搜索

1.什么是搜索

人工智能所要解决的问题大部分是结构不良非结构化的问题,对这样的问题一般不存在成熟的求解算法可供利用,而只能是利用已有的知识一步步地摸索着前进。
搜索就是:根据实际问题,不断寻找可用知识确定推理路线,从而构造一条代价尽可能的少的路线,而问题又能得到圆满的解决

2.什么是盲目搜索

预先规定好控制策略进行搜索,在搜索过程中获取的中间信息不影响或改变控制策略,由于搜索总是按预先规定的路线进行,没有考虑到问题本身的特性,所以这种搜索具有盲目性,效率不高,不便于复杂问题的求解。
尽管盲目搜索的性能不如启发式搜索,但由于启发式搜索需要抽取与问题本身有关的特征信息,而这种特征信息的抽取往往又比较困难,因此盲目搜索仍不失为一种有用的搜索策略。

3.问题求解的性能

1)完备性:是否能找到解
2)最优性:找到最优解
3)时间复杂度:找到一个解花费时间
4)空间复杂度:需多少存储空间

4.一般的图搜索

1)基本思想:
先把问题的初始状态作为当前扩展节点对其进行扩展,生成一组子节点,然后检查问题的目标状态是否出现在这些子节点中。若出现,则搜索成功,找到了该问题的解;若没出现,则再按照某种搜索策略从已生成的子节点中选择一个节点作为当前扩展节点。重复上述过程,直到目标状态出现在子节点中或者没有可供扩展的节点为止。
2)数据结构:
Open表:
用于存放刚生成的节点,由于这些节点还没有进行扩
展,因此 也称为未扩展节点表;
Closed表:
用于存放已经扩展的节点,因此Closed表也称为已扩展节
点表。
在这里插入图片描述
3)搜索过程
①把初始节点S0放入OPEN表,并建立目前只包含S0的图,记为G。
②检查OPEN表是否为空,若为空则问题无解,退出。
③把OPEN表的第一个节点取出放入CLOSED表,并记该节点为节点n。
④考察节点n是否为目标节点。若是,则求得了问题的解,退出。
⑤扩展节点n,生成一组子节点。把其中不是节点n先辈的那些子节点记作集合M,并把这些子节点作为节点n的子节点加入G中。
针对M中子节点的不同情况,分别进行如下处理
A、对于那些未曾在G中出现过的M成员设置一个指向父节点(即节点n)的指针,并把它们放入OPEN表。
B、对于那些先前已在G中出现过的M成员,确定是否需要修改它指向父节点的指针(计算是否需要修改,涉及到节点和路径的代价,每次计算都要从S0算到目标节点)
C、对于那些先前已在G中出现并且已经扩展了的M成员,确定是否需要修改其后继节点指向父节点的指针(对于C这种情况,针对的是已扩展节点的后继节点不只一个父节点时,到后继节点的总代价可能因为B中修改而变化。即对于C这种情况,要先进行B的修改。)
按某种搜索策略对OPEN表中的节点进行排序
⑧转第(2)步。

5.关于一般图搜索的说明

1)状态空间搜索有通用性,之后的各种搜索策略都是特例,主要体现在Open表中节点排序不同,另外对于广搜这种一层一层的搜索,代价相同的情况下,也不涉及指针的修改。
2)一个节点经过一个算符只生产一个子节点,但是因为对于这个节点来说有很多个算符,此时就会有一组子节点,其中就有可能有父节点,祖父节点等,此时不能将这些先辈节点作为当前扩展节点的子节点。除此之外的节点记为集合M,加入图G中。
3)依据代价修改指针(表中的父节点)。
4)注意:搜索得到的图G和状态空间图时不一样的,由搜索图中所有节点以及反向指针构成的集合是搜索树
5)到目标节点的反向指针构成路径。
6)盲目搜索仅适用于状态空间是树状结构的问题,因此对于盲目搜索而言,不会出现修改指针的情况,每个子节点都是第一次出现的。

三、广度优先搜索

1.基本思想

从初始节点S0开始,逐层地对节点进行扩展并考察它是否为目标节点,在第n层的节点没有全部扩展并考察之前,不对第n+1层的节点进行扩展。OPEN表中的节点总是按进入的先后顺序排列,先进入的节点排在前面,后进入的排在后面。

2.搜索过程

①把初始节点S0放入OPEN表。
②如果OPEN表为空,则问题无解,退出。
③把OPEN表的第一个节点(记为节点n)取出放入CLOSED表。
④考察节点n是否为目标节点。若是,则求得了问题的解,退出。
⑤若节点n不可扩展,则转第②步。
⑥扩展节点n,将其子节点(不含先辈节点)放入OPEN表的尾部,并为每一个子节点都配置指向父节点的指针,然后转第②步。

3.优劣

①缺点:盲目性较大,当目标节点距离初始节点较远时将会产生许多无用节点,搜索效率低。而且写出Open表可以发现,若目标节点已经被扩展出来,但是没有判断(判断和扩展时在将节点放入Close表时进行的),在执行到判断目标节点的时候,多余已经执行了很多扩展的操作。
②优点:只要问题有解,用广度优先搜索总可以得到解,而且得到的是路径最短的解。

四、深度优先搜索

1.基本思想

从初始节点S0开始扩展,若没有得到目标节点,则选择最后产生的子节点进行扩展,若还是不能到达目标节点,则再对刚才最后产生的子节点进行扩展,一直如此向下搜索。当到达某个子节点,且该子节点既不是目标节点又不能继续扩展时,才选择其兄弟节点进行考察。

2.搜索过程

①把初始节点S0放入OPEN表。
②如果OPEN表为空,则问题无解,退出。
③把OPEN表的第一个节点(记为节点n)取出放入CLOSED表。
④考察节点n是否为目标节点。若是,则求得了问题的解,退出。
⑤若节点n不可扩展,则转第②步。
⑥扩展节点n,将其子节点放入到OPEN表的首部,并为其配置指向父节点的指针,然后转第②步。

3.深度优先局限性

深度优先相当于对优先某一个分支进行搜索,如果这个分支上没有解,或者时无限分支,那么就很难得到解或者根本得不到解,解得到了解有可能不是最优解。并不是一种完备的搜索算法。

4.有界深度优先搜索

1)对深度优先搜索引入搜索深度的界限(设为dm),当搜索深度达到了深度界限,而尚未出现目标节点时,就换一个分支进行搜索。搜索过程如下:
①把初始节点S0放入OPEN表中,置S0的深度d(S0)=0。
②如果OPEN表为空,则问题无解,退出。
③把OPEN表中的第一个节点(记为节点n)取出放入CLOSED表。
④考察节点n是否为目标节点。若是,则求得了问题的解,退出。
如果节点n的深度d(n)=dm,则转第②步。
⑥若节点n不可扩展,则转第②步。
⑦扩展节点n,将其子节点放入OPEN表的首部,并为其配置指向父节点的指针,并指定每一个子节点的深度为d(n)+1然后转第②步。
2)优化:
dm的选择:
先任意给定一个较小的数作为dm,然后进行上述的有界深度优先搜索,当搜索达到了指定的深度界限dm仍未发现目标节点,并且CLOSED表中仍有待扩展节点时,就将这些节点送回OPEN表。
最优解:
为找到最优解,可增设一个表(R),每找到一个目标节点后,就把它放入到R的前面,并令dm等于该目标节点所对应的路径长度,然后继续搜索。由于后求得的解的路径长度不会超过先求得的解的路径长度,所以最后求得的解一定是最优解。
在这里插入图片描述
例如如果S3和S5是目标节点,找到S3后,取Dm=3,R表中增加S3,继续搜索;找到S5,取Dm=2,R表中增加S5,解为S5。

五、代价树搜索

1.代价计算

1)代价树:边上标有代价(或费用)的树称为代价树。
2)代价树中,用c(x1,x2)表示从父节点x1到子节点x2的代价。
3)用g(x)表示从初始节点S0到节点x的代价。
4)代价计算公式:g(x2)=g(x1)+c(x1,x2)

2.代价树的广搜和深搜

代价树的搜索也只是Open表内的排序不一样,要先计算代价,然后根据一定规则进行排序。
1)广度搜索:OPEN表中的节点在任一时刻都是按其代价从小至大排序的,代价小的节点排在前面,代价大的节点排在后面,而不管节点在代价树中处于什么位置上。
2)深度搜索:刚扩展出的子节点中选一个代价最小的节点送入CLOSED表进行考察

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【人工智能】1.问题求解:状态空间图和盲目搜索 的相关文章

  • NuttX实时操作系统

    NuttX 是一个实时操作系统 RTOS xff0c 其重点遵从特定的标准并且尽量小型化 可伸缩良好且可适应从8位到32位单片机环境 xff0c Nuttx主要遵循的标准是 Posix和ANSI标准 其他的一些来自于Unix或者其他常规的实
  • STM32 CAN 配置、收发结构定义 留存...

    分布式系统项目需要 xff0c 这次弄个CAN总线来布局 xff0c 仅见CAN的冰山一角 本次使用扩展帧模式 STM32 对CAN的定义 库 CAN结构体定义 说明 xff1a 寄存器映射 xff1a typedef span class
  • cortex-M3 的SVC、PendSV异常,与操作系统(ucos实时系统)

    文章目录 SVC和PendSVSVC xff1a PendSV xff1a 操作系统 xff0c 上下文切换 实例 xff1a ucos 关于 PendSV 异常的应用 上下文切换时机 怎样满足实时性 xff1a 中断 异常处理通用模板 x
  • STM32+IAP方案 实现网络升级应用固件

    关注了这个概念有些日子了 xff0c 这段时间总算有机会实战 61 61 网络升级应用固件 xff0c 这里记录下遇到的问题 xff0c 及解决方案 原理与网上流传的串口作为传输手段 一致 xff1b 不同之处 xff0c 无非我这里使用了
  • IAR版本不兼容导致无法正常打开工程文件--解决方法

    嵌入式开发 学习过程中 xff0c 难免需要借鉴别人的工程 xff0c 但是开发环境的匹配始终是个问题 61 61 版本不匹配 无法正常的打开工程文件 一般官方标配的开发环境包括 xff1a MDKIAR 这里描述IAR环境下 xff0c
  • STM32中GPIO的8种工作模式

    概念解释 xff1a 复用功能 xff1a 即片内外设 xff0c 包括UART SPI CAN I2C等等 xff0c 开启这些外设的功能 xff0c 就是使用了系统的复用功能 复用功能有两种 xff1a 没有重映像 重映像 xff08
  • 再读 ucosII源码(邵贝贝):任务之间的通讯与同步--邮箱

    邮箱简介 xff1a 邮箱是 C OS II中另一种通讯机制 xff0c 它可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量 该指针指向一个包含了特定 消息 的数据结构 为了在 C OS II中使用邮箱 xff0c 必须将O
  • 阿里云ubuntu 16.04安装图形界面

    1 VNC的安装与配置 安装之前先输入 span class pln apt span span class pun span span class kwd span class hljs keyword get span span spa
  • cmake/makefile 获取git版本信息并传入源码输出

    CMake获取git commitId CMakeLists txt cmake minimum required VERSION 2 8 project test set SRCS main cpp 执行git命令 xff0c 并把结果重
  • 为什么使用static的类方法不需要new

    文章目录 JAVA加载过程static静态成员从static学习java编译过程JVM加载顺序摘要 xff1a 稍稍延申一下 xff1a 对于此java给出了两个解决方案 xff1a 总结static下面说说静态的特点 xff1a 实例变量
  • CMake引入三方库

    做移动端的NDK开发经常需要引入三方库 xff0c 本文以常见的JSON库为例进行说明 jsoncpp源码下载地址https github com open source parsers jsoncpp 下载1 9 5的tag 1 纯源码依
  • C++中泛型算法详解5:面向泛型算法的迭代器类别

    前言 任何算法最基本的特性是要求迭代器提供那些操作 根据算法要求的迭代器操作 xff0c 可以分为如下迭代器类别 xff1a 1 input iterator 2 output iterator 3 forward iterator 4 b
  • CMake&CMakeList.txt

    1 各种关系 在各种开源项目中 xff0c 经常会发现项目中除了代码源文件 xff0c 还包含了 CMakeList txt Makefile 文件 xff0c 在项目的编译时候需要用到的命令有 cmake make 我们本次想搞清楚他们之
  • 使用Docker制作镜像并推送到镜像仓库

    本文会告诉你如何使用docker从远端下载一个镜像 xff0c 然后对镜像做修改 xff0c 最后再把镜像推送到你自己的镜像仓库 1 安装Docker 这个没啥说的 xff0c 根据你自己的环境下载对应的安装包安装就是了 docker官网下
  • Mac上几款免费的MySql客户端

    由于开发需要在Mac上连接MySql数据库 xff0c 虽然命令行也能用 xff0c 但是我还是喜欢用带UI的客户端去连 就用过的mysql客户端来说 xff0c 最好用的是Navicate xff0c 不过后来收费了 xff0c 还收的贼
  • Mac M1芯片安装 Numpy Pandas

    本文教你如何简单的在M1芯片的MacBook上安装Numpy和Pandas 刚入手了一个Mac Pro xff0c 是M1芯片的 xff0c 结果在安装Numpy和Pandas时遇到了各种莫名奇妙的问题 第1种报错 xff0c 很长 xff
  • addr2line

    1 符号表 1 1什么是符号表 符号表是内存地址与函数名 文件名 行号的映射表 符号表元素如下所示 xff1a lt 起始地址 gt lt 结束地址 gt lt 函数 gt lt 文件名 行号 gt 1 2为什么要配置符号表 为了能快速并准
  • 一些有用的Python库

    1 制作动态排序图的库 做出来像这种效果 https mp weixin qq com s DQf35t7PUcFmi3j942Q7A 2 基于matplotlib轻松绘制漂亮的表格 比自己在ppt或者excel中搞出来的表格好看多了 像这
  • Android创建杀不死的Service

    在Android开发中我们经常会遇到一些特殊的需求需要让我们的服务常驻内存 xff0c 但是会遇到各种清理软件或者用户在设置中手动停止程序的情况而导致我们的服务被异常的终止掉 虽然没有办法保证绝对的常驻内存 xff0c 但是通过策略我们还是
  • Mac 从Bash切换到Zsh的注意事项

    1 第一步要安装Zsh xff0c 可以参考现成的文章 xff0c 推荐一篇https zhuanlan zhihu com p 19556676 2 安装完成之后退出命令行重新进入 xff0c 就可以看到Zsh的效果啦 3 及得切换默认的

随机推荐

  • 数组求实际长度(逻辑长度)

    有很多情况下 xff0c 比如我们定义了一个数组 xff0c byte a 61 new byte 100 但是给数组赋值的时候只赋了10个 xff0c 虽然这个数组在内存中的长度仍然是100 xff0c 但是我们想得到的确实数组的实际长度
  • java清空数组

    定义一个数字byte a 61 new byte 20 如果给数组赋值后又想让数组恢复到初始的状态 xff0c 那如何做呢 xff0c 其实很简单 xff0c 直接上方法 将byte数组置空 public static byte reset
  • 使用gazebo的官方模型库文件

    首先下载所有的gazebo模型库文件 xff0c 我已经打包上传到csdn了 xff0c 可以从如下链接中下载 xff1a 下载link 然后将下载好的文件存放在如下目录 xff1a cd gazebo models 如果没有上述目录就自行
  • 作为一个普通的程序员,到底应不应该转型AI工程师?

    动不动就是50万的毕业生年薪 xff0c 动不动就是100万起步价的海归AI高级人才 xff0c 普通员到底应不应该转型AI工程师 xff0c 普通程序员到底应该如何转型AI工程师 xff1f 下面就分享几个特别典型的普通程序员成功转型AI
  • 树莓派Odroid等卡片式电脑上搭建NAS教程系列1-Ubuntu系统安装

    我用的是韩国hardkernel公司做的Odroid XU板子 xff0c 类似于树莓派香蕉派 xff0c 看下它的真面目 相关参数点他 gt Odroid XU 搭建NAS之前先来安装好Ubuntu系统 下载安装文件 在Odroid里安装
  • 立创eda学习笔记一:pcb板基础知识

    整理了一下零基础学习pcb板画图需要了解的一些基础知识 xff0c 否则后面画图很困扰 什么是pcb板 xff1f PCB xff08 Printed Circuit Board xff09 xff0c 中文名称为印制电路板 xff0c 又
  • 立创eda学习笔记二:画pcb板流程(极简入门版)

    一般PCB基本设计流程如下 xff1a 前期准备 gt PCB结构设计 gt PCB布局 gt 布线 gt 布线优化和丝印 gt 网络和DRC检查和结构检查 gt 制版 一 画原理图 完成后检查元件的封装 连线是否正确 核实电路结构 xff
  • 立创eda学习笔记十一:立创eda、立创商城、嘉立创的区别

    简单来说 xff1a 立创eda是一个画原理图和pcb的eda软件 xff0c 类似于ad 立创商城是一个卖元器件网上平台 xff0c 类似于淘宝 嘉立创是一个生产pcb板 给pcb板贴片的生产厂家 一般情况下 xff0c 你可以在立创ed
  • 立创eda学习笔记十七:铺铜

    铺铜是pcb设计很常用的指令 xff0c 或者是必然用到的指令 xff0c 很多时候布线的时候不去画gnd的线 xff0c 把其他线画好了之后 xff0c 再统一铺铜作为gnd xff0c 这样方便很多 铺铜这个概念可以理解为大面积的布线
  • 立创eda学习笔记二十六:手把手教你使用立创eda的官方教程

    可以通过以下办法找到教程 xff1a 1 xff0c 在软件界面点帮助 使用教程 2 xff0c 在网站首页 帮助 教程进入 如何使用教程 xff1a 这里是一级目录 xff0c 其实对新手最有用的是前面3个部分 xff0c 后面的仿真先不
  • 立创eda学习笔记二十四:拼板

    这里主要是两部分 xff1a 自带拼板和手动拼板 xff0c 软件自带拼板功能 xff0c 那么手动拼板当然就是自己重新画图拼板了 一般用自带拼板功能就可以了 xff0c 把单板画好之后很容易就拼好了 xff0c 完全不用动任何器件和丝印编
  • Prometheus实战教程:监控mysql数据库

    今天我们使用prometheus 43 Grafana 43 mysql exporter实现监控mysql数据库各项指标数据 mysql exporter xff1a 采集mysql数据库各项指标数据 prometheus xff1a 获
  • prometheus常用exporter下载地址大全

    1 node exporter下载 https github com prometheus node exporter releases 2 blackbox exporter下载 https github com prometheus b
  • 论文润色 ‖ 一分钟教你如何写好SCI论文里的主题句,事半功倍

    今天 xff0c 小编来分享一下论文润色 xff0c SCI论文的主题句 xff08 Topic Sentences xff09 怎么写 xff1a 01什么是主题句 xff1f 主题句通常是段落开头的一句话 xff0c 是整个段落的小主题
  • Go xml文件处理

    在开发中会常遇到xml数据序列化和反序列化 xff0c 这里我们介绍go语言处理xml数据 encoding xml 包实现了一个简单的xml 1 0解析器 xff0c 可以理解xml名称空间 读取xml 示例 xff1a package
  • UC/OS-III 消息队列

    消息队列 一 消息队列基本概念讲解1 消息队列基本概念2 消息池2 1 消息池概念2 2 消息池初始化2 3 消息队列的运作机制2 4 消息队列的阻塞机制2 5 消息队列的应用场景 二 消息队列创建步骤1 定义消息队列2 创建消息队列 三
  • Altium Designer绘制stm32f103c8t6最小系统原理图

    文章目录 前言芯片封装自定义封装原理图绘制总结 前言 本文提供了初学者绘制stm32最小系统 xff0c 同时初学者的同学可以跟着小白学习绘制原理图哦 芯片封装 提示 xff1a 下载安装好Altium Designer之后才能进行以下操作
  • Jetson Xavier NX安装opencv3.x以及踩过的坑

    Jetson Xavier NX默认安装的是opencv4 x xff0c 在很多项目中其与opencv3 x xff0c 其中opencv3与opencv4中有部分函数是完全不同的 xff08 例如点一些Point的定义 xff0c Cv
  • 【导航算法】无人机路径跟踪L1导航算法

    L1导航算法是非常经典的非线性无人机路径跟随算法 xff0c 最早由MIT于2004年提出 xff0c 论文为 A New Nonlinear Guidance Logic for Trajectory Tracking xff0c 其导航
  • 【人工智能】1.问题求解:状态空间图和盲目搜索

    什么是问题求解 xff1f 问题求解可以理解为利用知识 xff0c 尽可能有效的找到问题的解 xff0c 或者最优解的过程 xff0c 主要包括 xff1a 1 xff09 问题描述方法 xff1a 状态空间法 xff0c 与或树表示法 x