人工智能:一种现代的方法 第三章 经典搜索 上

news2025/1/3 2:09:18

文章目录

    • 人工智能:一种现代的方法 第三章 经典搜索 上
      • 3.1 问题求解智能体
      • 3.2 问题实例
        • 3.2.1八数码问题
        • 3.2.2八皇后问题
      • 3.3 搜索
        • 3.3.1搜索树
        • 3.3.2 树搜索
        • 3.3.3 图搜索
        • 3.3.4 问题求解算法的性能
      • 第三章 经典搜索 上 总结

人工智能:一种现代的方法 第三章 经典搜索 上

3.1 问题求解智能体

环境假设:单Agent、确定的、可观察的、离散的、已知的

问题求解智能体的工作流程通常如下:

  • 目标设定:首先,问题求解智能体需要有一个明确的目标或需要解决的问题。
  • 问题形式化:然后,智能体需要将这个目标或问题形式化为一个搜索问题。这通常涉及到定义一个初始状态(即问题的起始点),一个或多个目标状态(即问题的解决方案),以及一组可能的操作(即从一个状态移动到另一个状态的方法)。
  • 搜索策略:接下来,智能体需要选择一个搜索策略,以便在可能的解决方案中找到一个有效的解决方案。这可能涉及到使用一种或多种上述提到的搜索算法。
  • 解决方案执行:最后,一旦找到一个解决方案,智能体就会执行相应的操作或步骤,以达到其目标状态。

良定义的问题及解

在人工智能中,一个良定义的问题是指一个问题,其有明确的初始状态、目标状态和可行的动作集合。这些元素共同构成了问题的解决方案空间,其中搜索算法可以在此空间内寻找解决方案。是人工智能中问题形式化的一个重要部分

  • Agent的初始状态Init
  • Agent的可能动作Action(s)
  • Agent的目标状态target
  • 转移模型Result(s,a)
  • 目标测试函数
  • 路径耗散函数

以迷宫为例

在迷宫问题中,我们从入口(初始状态)出发,通过向上、下、左、右移动(动作),根据转移模型确定新的位置,直到达到出口(目标状态)。我们用步数或通过特定区域的成本(路径成本函数)来评估解决问题的效率。这个问题就是一个良定义的问题,可以用搜索算法来解决。

请添加图片描述

解:从初始状态到目标状态的动作序列,解的质量由路径耗散函数度量
具有最小路径耗散值的解即为最优解

3.2 问题实例

3.2.1八数码问题

八数码问题:在这个问题中,我们有一个3x3的格子,其中8个格子包含数字1到8,一个格子是空的。初始状态是数字的一个特定排列,目标状态是数字的另一个特定排列(通常是12345678x)。动作是将数字移动到相邻的空格子。转移模型根据选择的动作和当前状态决定新的状态。目标测试检查当前状态是否为目标状态。路径成本函数可以是移动的步数。

八数码BFS实现

int bfs(string state)//初始状态
{
    queue<string> q;
    unordered_map<string, int> d;//耗散函数

    q.push(state);
    d[state] = 0;

    int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};//动作集

    string end = "12345678x";
    while (q.size())
    {
        auto t = q.front();
        q.pop();

        if (t == end) return d[t];//目标测试集

        int distance = d[t];
        int k = t.find('x');
        int x = k / 3, y = k % 3;
        for (int i = 0; i < 4; i ++ )
        {
            int a = x + dx[i], b = y + dy[i];//转移模型
            if (a >= 0 && a < 3 && b >= 0 && b < 3)
            {
                swap(t[a * 3 + b], t[k]);
                if (!d.count(t))
                {
                    d[t] = distance + 1;
                    q.push(t);
                }
                swap(t[a * 3 + b], t[k]);
            }
        }
    }

    return -1;
}
3.2.2八皇后问题

八皇后问题的描述:

  • 状态:描述8个棋子在棋盘上的分布
  • 初始状态:任何状态均可
  • 目标条件:检测是否为给定的目标状态
  • 动作:每个棋子或空格的滑动Left、Right、Up、Down
  • 状态转移函数(后继函数)
  • 路径耗散函数(略)

八皇后DFS实现

void dfs(int x, int y, int s)
{
    if (s > n) return;
    if (y == n) y = 0, x ++ ;

    if (x == n)
    {
        if (s == n)
        {
            for (int i = 0; i < n; i ++ ) puts(g[i]);
            puts("");
        }
        return;
    }

    g[x][y] = '.';
    dfs(x, y + 1, s);

    if (!row[x] && !col[y] && !dg[x + y] && !udg[x - y + n])
    {
        row[x] = col[y] = dg[x + y] = udg[x - y + n] = true;
        g[x][y] = 'Q';
        dfs(x, y + 1, s + 1);
        g[x][y] = '.';
        row[x] = col[y] = dg[x + y] = udg[x - y + n] = false;
    }
}

八皇后问题的改进描述

  • 状态:描述0-8个皇后在棋盘上的分布,满足最左侧每列放置一个皇后,无法相互攻击
  • 动作:在最左侧空列中的任一空位放置一个皇后,无法相互攻击

八皇后DFS

void dfs(int u)
{
    if (u == n)
    {
        for (int i = 0; i < n; i ++ ) puts(g[i]);
        puts("");
        return;
    }

    for (int i = 0; i < n; i ++ )
        if (!col[i] && !dg[u + i] && !udg[n - u + i])
        {
            g[u][i] = 'Q';
            col[i] = dg[u + i] = udg[n - u + i] = true;
            dfs(u + 1);
            col[i] = dg[u + i] = udg[n - u + i] = false;
            g[u][i] = '.';
      }
  }

改进的版本在定义问题的方式上更加明确和约束,这使得搜索解决方案的过程更加高效。这说明搜索的效率与顺序有关。

3.3 搜索

3.3.1搜索树

搜索树

  • 树结点:状态
  • 边:动作/可选动作
  • 根结点:初始状态
  • 满足目标条件的叶结点:目标状态

解:从初始状态到达目标状态的动作序列

3.3.2 树搜索

树搜索的基本步骤:

  • 初始化:将初始状态作为根节点放入一个待处理节点列表(通常称为“开放列表”或“边缘表”)。
  • 节点选择:从开放列表中选择一个节点。选择的方式取决于具体的搜索策略。
  • 目标测试:检查选定的节点是否为目标状态。如果是,那么搜索成功,返回从根节点到该节点的路径。否则,继续下一步。(部分算法的目标测试也可在扩展阶段)
  • 扩展:将选定节点的所有后继节点(即通过应用所有可能的动作得到的新状态)添加到开放列表中。
  • 重复:返回第二步,继续选择新的节点。如果开放列表为空,那么搜索失败,说明没有找到从初始状态到目标状态的路径。
3.3.3 图搜索

在图搜索中,我们将每个访问过的节点添加到一个已访问节点列表中(通常称为“关闭列表”)。当我们考虑扩展一个节点时,如果它已经在关闭列表中,那么我们就跳过它。这样可以避免无限循环和不必要的重复搜索。

图搜索的基本步骤:

  • 初始化:将初始状态作为根节点放入一个待处理节点列表(通常称为“开放列表”),并且创建一个空的关闭列表。
  • 节点选择:从开放列表中选择一个节点。选择的方式取决于具体的搜索策略。
  • 目标测试:检查选定的节点是否为目标状态。如果是,那么搜索成功,返回从根节点到该节点的路径。否则,继续下一步。(部分算法的目标测试也可在扩展阶段)
  • 扩展:将选定节点的所有后继节点(即通过应用所有可能的动作得到的新状态)添加到开放列表中,前提是它们不在关闭列表中。
  • 更新关闭列表:将当前节点添加到关闭列表中。
  • 重复:返回第二步,继续选择新的节点。如果开放列表为空,那么搜索失败,说明没有找到从初始状态到目标状态的路径。
3.3.4 问题求解算法的性能

评价算法的性能

  • 完备性:问题有解,算法一定能找到
  • 有效性:算法找到的解,是问题的解
  • 最优性:问题有解,算法一定能找到最优解
  • 时间复杂度:时间开销
  • 空间复杂度:空间开销

树搜索/图搜索的复杂度

  • 分支因子b
  • 目标结点的深度d,结点的最大深度m

第三章 经典搜索 上 总结

本文我们主要讲述了问题求解智能体的工作流程,良定义的问题和解,数据结构搜索树。这方面很重要的良定义的问题和解 和搜索树,现实中很多问题都可以抽象成图的问题,然后进行搜索求解,良定义的问题和解提供一种思路来如何抽象。同时搜索树也发挥出重要作用,将状态转化为节点,边作为动作可选动作,以及搜索策略:选择哪个结点进行扩展。

接下来我们将继续讲述具体的搜索策略,敬请期待!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【kali忘记密码解决办法】

&#x1f9cb;1、kali忘记密码 &#x1f9c9;2、重启不停的按【E】&#xff08;输入法为英文状态&#xff09;键进入启动前编辑命令&#xff08;若系统没有出现这个页面&#xff0c;尝试重启以此来进入引导界面&#xff09; &#x1f379;3、进入启动前编辑命令界面后&#x…

Colab: 运行Python代码的一个平台

网站&#xff1a; https://colab.sandbox.google.com/ 该网站默认情况下已经安装了tenorflow和tensorflow_probably。 Colab是运行Python代码的一个平台&#xff0c;当你的笔记本中没有安装任何Python环境&#xff0c;而又需要安装Python时&#xff0c;可以在Colab上轻便的运…

反转链表OJ题

反转链表OJ题 文章目录 反转链表OJ题题目&#xff1a;分析及代码实现:循环思想递归思想 题目&#xff1a; 分析及代码实现: 循环思想 ①新开辟一个空链表&#xff0c;我们将原链表里的元素进行头插&#xff0c;实现反转。 struct ListNode* reverseList(struct ListNode* he…

面试题:你知道 Java 中的回调机制吗?

文章目录 调用和回调机制1.同步调用2.异步调用3.回调 回调的种类同步回调例子 异步回调 调用和回调机制 在一个应用系统中, 无论使用何种语言开发, 必然存在模块之间的调用, 调用的方式分为几种。 1.同步调用 同步调用是最基本并且最简单的一种调用方式, 类A的方法a()调用类B…

LSTM缓解梯度消失问题

为何LSTM缓解梯度消失问题 为什么LSTM会减缓梯度消失&#xff1f; - 知乎 LSTM引入长短期记忆&#xff0c;cell state和hidden state&#xff0c;解决梯度消失关键是对长期记忆cell state的保留和更新 LSTM解决梯度消失的本质是在Cell state 的更新中引入输入门和遗忘门 通过…

Java 语言环境搭建

JDK 是一种用于构建在 Java 平台上发布的应用程序、Applet 和组件的开发环境&#xff0c;即编写 Java 程序必须使用 JDK&#xff0c;它提供了编译和运行 Java 程序的环境。 在安装 JDK 之前&#xff0c;首先要到 Oracle 网站获取 JDK 安装包。JDK 安装包被集成在 Java SE 中&a…

linux 启动引导找不到内核修复

问题现象 选中内核按e 看到引导内核信息 挂载ISO映像进入救援模式&#xff0c;查看boot目录 与 引导文件内容不一致 再次重启引导系统&#xff0c;按e 修改内核引导项与boot目录一致&#xff0c; crtl - x 继续执行 登录系统 mount /dev/sdm1 /mnt 挂载vfat 引导目录 纠…

Cannot run program “D:\c\IntelliJ IDEA 2021.1.3\jbr\bin\java.exe“

如果你的idea在打开后出现了这个故障 Cannot run program "D:\c\IntelliJ IDEA 2021.1.3\jbr\bin\java.exe" (in directory "D:\c\IntelliJ IDEA 2021.1.3\bin"): CreateProcess error2, 系统找不到指定的文件。 打开IDEA的设置 file --> settings --&…

ADS安装问题

1、已有老版本&#xff0c;需要安装新版本&#xff0c;自动跳过证书安装目录设置 解决办法&#xff08;ADS2019-2023版本都适用&#xff09;&#xff1a; ADS2019安装细节以及需要避免的坑 2、安装报错 解决办法&#xff0c;删除C盘里面的隐藏文件Zero G Registry&#xff1…

倒计时丨3天后,我们直播间见!

倒计时3天&#xff0c;RestCloud 零代码集成自动化平台重磅发布 ⏰11 月 9 日 14:00&#xff0c;期待您的参与&#xff01; 点击报名&#xff1a;http://c.nxw.so/dfaJ9

Banana Pi BPI-P2 Pro Rockchip RK3308开发板启动及设置

Banana -Pi BPi-P2 Pro 是一款采用RockChip Arm 处理器的新型开发板。 64 位四核 Arm Cotrex-A35&#xff0c;使用 RockChip RK3308512 GB DDR3&#xff08;在这篇博文中&#xff0c;我的设备只有 256GB&#xff09;8 GB 板载 eMMC 存储40 PIN GPI 和 12 PIN 侧&#xff08;包…

深入分析常规ROS机器人如何使用Navigation导航包实现实时定位

本篇文章主要分析&#xff0c;常规的ROS机器人是如何使用Navigation导航包实现实时定位的&#xff0c;定位精度的决定性因素等内容&#xff0c;结构上分为详细介绍、概括总结、深入思考三大部分。 注&#xff1a;本文首发于古月居&#xff0c;原文链接如下&#xff1a; – htt…

Visual Studio Code将中文写入变量时,中文老是乱码问题

对于这个问题&#xff0c;我也是弄了很久才知道&#xff0c;编码格式的问题 在此之前我们要先下载个插件 照这以上步骤&#xff0c;最后按F6运行即可&#xff0c;按F6是利用我们刚刚下载的插件进行编译&#xff0c;唯一有一点不好就是&#xff0c;用这种插件运行的话&#xff…

Mean-Shift聚类方法

刘玉琪 跟随 出版于 台湾人工智能学院 一、说明 上一篇介绍了基于密度的分群方法——DBSCAN&#xff0c;本篇会介绍另一个分群方法——Mean Shift&#xff0c;与DBSCAN一样不需要预先知道欲分群的数量&#xff0c;而对于分群的形状也没有限制。 然而&#xff0c;这个方法是基…

使用Scrapy的调试工具和日志系统定位并解决爬虫问题

目录 摘要 一、Scrapy简介 二、Scrapy的调试工具 1、Shell调试工具 2、断点调试 三、Scrapy的日志系统 四、实例解析 1、启用详细日志 2、断点调试 3、分析日志 4、解决问题 五、代码示例 总结 摘要 本文详细介绍了如何使用Scrapy的调试工具和日志系统来定位并解…

0基础学习VR全景平台篇第118篇:利用动作录制器功能避免重复操作 - PS教程

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 嗨&#xff0c;大家好。欢迎收看蛙色VR系列教程之PS利用动作记录器节约补地时间。 大家拍摄在补地的时候&#xff0c;利用插件选择输入输出选项的时候&#xff0c;每次重复操作…

完美解决RuntimeError: expected scalar type Long but found Float

文章目录 一、错误解释RuntimeError: expected scalar type Long but found Float二、错误分析三、解决办法总结 一、错误解释RuntimeError: expected scalar type Long but found Float RuntimeError&#xff1a;应为标量类型Long&#xff0c;但找到了Float 二、错误分析 我…

开源一个房屋租赁平台

前言 哈喽兄弟们&#xff0c;好久不见哦&#xff5e; 最近整理了一下之前写过的一些小项目/毕业设计。发现还是有很多存货的&#xff0c;虽然这些项目普遍都写的比较简单&#xff0c;但想一想既然放在电脑里面也吃灰&#xff0c;那么还不如开源分享出去&#xff0c;没准还可以…

每日一题 --- 力扣318----最大单词长度乘积

这道题时间复杂度我感觉设置的不是很好&#xff0c;应该最好是有一个1000变成10000就行。 因为我在做这道题的时候被误导了&#xff0c;以为双重循环暴力判断一下也能过&#xff0c;因为1000*1000 *26的时间复杂度没有到1亿&#xff0c;那么我刚开始认为是能过的&#xff0c;结…

用Rust和Scraper库编写图像爬虫的建议

本文提供一些有关如何使用Rust和Scraper库编写图像爬虫的一般建议&#xff1a; 1、首先&#xff0c;你需要安装Rust和Scraper库。你可以通过Rustup或Cargo来安装Rust&#xff0c;然后使用Cargo来安装Scraper库。 2、然后&#xff0c;你可以使用Scraper库的Crawler类来创建一个…