IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 人工智能基础——全局搜索方法 -> 正文阅读

[数据结构与算法]人工智能基础——全局搜索方法

引言

这是最优化的内容,我们用状态(包含很多参数)描述一个对象。把这些参数作为坐标轴就会获得一个超空间(函数定义域)。超空间里的点分别对应了某个函数值,我们在空间里找函数的最大值。
后面会介绍各种算法,但是核心是找上一节课的h(n)——一个描述状态分数的函数。

局部搜索算法

所谓局部就是只关心状态,不关心路径,从一个点到其他点。

爬山法

就是梯度下降法,只不是找最大值。就是找参数在状态空间临近区域的最优解。相信大家都会。请添加图片描述
显然有很多时候无法找到全局最优解。
比如到了一个平坦的区域,往哪个方向最大值都不会变化,这时候可以有随机爬山法,比如说随机选择后继直到上升。
但这样也不行,可能会被困在局部最优解。可以采用这样一种方式,随机生成一个初始点,爬山法找到解的概率为p,那么重复进行1/p次爬山法,基本可以找到最优解。也就是反复随机生成初始点进行爬山。

模拟退火

给一个初始点,在他周围随机找点,如果比他更优则更新到这个点,否则以概率p接收这个点,每次接受“更差”的点时,p的值以指数下降。
我这里记录一下我对这个算法的理解

如果使温度(接收概率)下降够慢,找到全局最优解的概率区域1

我们考虑特殊情况,如果我的温度不下降,始终以百分之五十的概率接收,也就是存粹的随机算法,那么在时间趋于无穷时,一定会找到全局最优解。但是事实上我们并没有无限次尝试的机会,我们必须让结果收敛,这种操作会使得找到全局最优解的可能性降低,但是性能大大提高。
时间和精准程度处在一种矛盾的平衡当中,将这个概率从1降低到0.999,但是却可以使得时间消耗从无限变为有限。模拟退火可以说是完全随机的一种妥协。

局部束搜索

随机选择k个点,搜索所有k个点生成的状态,取最好的k个,重复此过程。这和遗传算法有点像,但是没有k个点之间的交叉,所以是无性繁殖。

遗传算法

随机生成k个状态,给状态编码,然后用某种算法(最简单交换一部分),然后会得到很多新的状态作为“孩子”,从这些“孩子”中选k个最好的,重复过程。
说得简单,具体比较复杂,但是思想比较容易理解。

连续空间中的局部搜索

连续空间的搜索难度在于每种状态接下来的分支是无限的。基本的思想还是梯度法,但是由于自变量多,方程的梯度=0无法求出封闭式解(就是列的方程没有通解,每次都要经过数值推理),但是可以使用局部梯度(对某个参数求导),然后沿着这个方向爬。
也有更快的爬法,这些可以去看最优化算法,什么牛顿法、共轭梯度法、拟牛顿法啥的,有空再整理一下。

使用不确定动作搜索

在同样的条件下,一个状态可能转移为多个状态。那么整个过程不再是一棵树,而是一个序列。
就像你开车,大路短但可能堵车,小路长但是比较通畅。你的决策产生的结果还依赖于你不可观测的外在条件。这种时候你的策略也被叫做应急策略。

通常来说,我们想要找的是一个稳定可以达到目标的解,我们最终的解应该是一棵树,无论在树的分叉路口如何走,最终都会到达满足的状态点。

还是普通的搜索,只不过一个需要抉择的节点,需要在所有子树中都找到解,这个点才能在最后的解答中。

由于搜索过程中会出现循环,你可以把它理解成一棵无限生长的树(或者一张有环图)。在搜索树的过程中把状态hash,如果遇到相同的状态就是遇到循环,也不需要再继续搜索了。

使用部分可观察信息搜索

  • 先是无观察信息搜索
    即便我根本不知道自己身处什么状态,也可以找出最好的决策。
    来波很不恰当的但是我相信很能说明问题的例子。你肚子疼,你应该去做身体检查,然后确定自己吃什么药。但是你怕检查完你直接痛死了,于是你吃了所有治疗肚子疼的药,然后你也不知道,总之有一个药让你肚子不疼了。
    这个例子当然是在胡说八道,但是却告诉我们,即便我们根本不知道处在什么状态,也可能做出走到目标点的决策。
    比如说状态(1,1,0)代表得了病1、2,没有病3,那么所有状态一共有8种,但是通过吃所有药都可以变为(0,0,0)的状态。

求解方法比较魔幻,因为状态太多了。可以先求解满足一个状态的路径,然后一个个看这些路是不是满足其他状态;也可以把这些状态统一打包编码不管内部情况;或者使用巧妙的动态状态描述,比如说一个药吃了能治疗某四种病,不用(0,0,0,0)表述,而是直接打包成一种某类病0。

  • 然后是可观察搜索/部分观察
    我慢慢觉得没啥好写的,无非是状态定义和转移的问题,我越来越觉得这本书只可意会不可言传。

联机搜索问题

失去上帝视角,走一步看一步。我(智能体)出生在了一个迷宫中,我现在要出去,我只有前后左右四个方向可以走,和一个标志和我位置的传感器,但我不知道迷宫长什么样子。
还是一棵树,但是只有到了某个节点才能看到之后的节点,那显然就是一个一直回朔的过程。最差情况每个点要走两次(dfs)

  • 随机行走算法
    爬山法,这回是真爬山,爬到了一个小坡上面(局部最优)。按之前的再随机一个出生点再爬,但是不行,因为这是真爬山。那我就随便走走,往右走走虽然变低了但是却可以看到一座可能更高的山(启发式函数h(n)这里我当作目测山高),那我就会往那里走。

总结

我发现这门课越来越玄学,真的全靠感受。给的都只是思想,细节实现要靠自己,也要根据实际问题。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-08 10:59:23  更:2021-09-08 11:01:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:34:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码