人工智能基础——全局搜索方法

article/2025/9/27 21:20:46

文章目录

      • 引言
      • 局部搜索算法
        • 爬山法
        • 模拟退火
        • 局部束搜索
        • 遗传算法
      • 连续空间中的局部搜索
      • 使用不确定动作搜索
      • 使用部分可观察信息搜索
      • 联机搜索问题
      • 总结

引言

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

局部搜索算法

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

爬山法

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

模拟退火

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

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

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

局部束搜索

随机选择k个点,搜索所有k个点生成的状态,取最好的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)这里我当作目测山高),那我就会往那里走。

总结

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


http://chatgpt.dhexx.cn/article/y4VhyBTx.shtml

相关文章

Element分页遇到的坑

当有搜索功能和分页的情况,遇到了以下问题: 第一个问题: 当数据渲染完第一次点击第2页或者第三页…输入搜索内容并点击搜索按钮,得到搜索结果之后分页高亮是在上一次点击的页数上,但数据显示的是第一页的,…

如何理解构建人类命运共同体思想的科学内涵?

如何理解构建人类命运共同体思想的科学内涵? 1、政治上:要相互尊重、平等协商,坚决摒弃冷战思维和强权政治,走对话而不对抗、结伴而不结盟的国与国交往新路。 2、安全上:要坚持以对话解决争端、以协商化解分歧&#…

2021-10-10

2021-10-08鹤城杯 crypto EASY_CRYPTO 公正公正公正诚信文明公正民主公正法治法治诚信民主自由敬业公正友善公正平等平等法治民主平等平等和谐敬业自由诚信平等和谐平等公正法治法治平等平等爱国和谐公正平等敬业公正敬业自由敬业平等自由法治和谐平等文明自由诚信自由平等富…

爱国html源码,鼠标点击网页爱国富强民主特效(附代码)

有朋友经常问,网站上点击出现爱国字眼是怎么做出来的,鼠标点击就显示“富强、民主、和谐”等24个词语,这样鼠标点击特效。下面来分享一下如何实现的。 1,效果如下: 添加页面点击特效,点击页面会显示&#x…

JavaScript网页特效-浮现社会主义核心价值观文字动画效果

1.案例呈现 用户在页面单击鼠标左键,页面浮现“富强”、“民主”、“文明”、“和谐”、“自由”、“平等”、“公正”、“法治”、“爱国”、“敬业”、“诚信”、“友善”等社会主义核心价值观内容,并向上移动100px,然后消失。案例在Chrom…

JQuery 实现鼠标点击特效富强民主文明方法

最近逛好多博客发现都有一个鼠标点击弹窗的事件, 感觉非常棒 #就像这个样子的 百度了一下 发现还是实现还是比较简单的(当然我也不会),但是copy 是程序员最喜欢的事,所以我就转载这个文章,也当是自己的一个小笔记,贴上代码 # js 部分的代码 <script>//定义获取词语下标…

导数据问题处理ORA-01427:单行子查询返回多个行

解决办法: 此时只需在语句中加入and rownum<2 限制他只返回一行即可 SELECT 字段 备注,(select 被查字段 from 表2 where 字段 表1.对应字段 and rownum<2 ) 备注 FROM 表1

MySQL之单行子查询,多行子查询

单行子查询 只返回一行结果的子查询&#xff0c;称为单行子查询。对于单行子查询的结果我们可以使用单行操作符来构造外查询条件&#xff0c;如 >、<、 等等。 废话少说上代码 select * from city where population > (select population from city where nametoky…

子查询:单行子查询,多行子查询,多列子查询

#子查询 子查询使用规则&#xff1a; 子查询放在圆括号中子查询放在比较条件右边&#xff08;非强制&#xff09;子查询中不需要ORDER BY 子句在单行子查询中使用单行运算符&#xff0c;在多行子查询中用多行运算符。 单行运算符&#xff1a;子查询结果只有一个&#xff1a;…

ora-01427批量更新表的时候提示单行子查询返回多个行

这是刚开始的更新语句&#xff1a;根据AMCARD表的ACCTCOMPID和ACCTDEPID字段关联LSBMZD表的LSBMZD_DWBH和LSBMZD_BMBH,得到相对于的LSBMZD_ID&#xff0c;然后根据这个LSBMZD_ID列匹配HRORGINFO表的MAPPINGORG字段&#xff0c;最终得到HRORGINFO表的NM字段&#xff0c;将AMCARD…

update时 单行子查询返回多个行 SQL 错误 [1427] 处理方案

我遇到此错误是在多表关联update的 UPDATE EDASYS.CELL_COMPONENT_T A SET A.ARRAY_GLASS_ID (SELECT M.ARRAY_GLASS_ID FROM EDASYS.CELL_ARRAY_CF_MAPPING_T M WHERE M.CF_GLASS_ID A.COMPONENT_ID AND rownum < 2) WHERE EXISTS (SELECT 1 FROM EDASYS.CELL_ARR…

13.子查询返回多行多列的数据

假设有下面两张表: 部门表dept 雇员表emp 列出公司各个部门的经理的姓名、薪金、部门名称、部门人数、部门平均工资。 步骤1&#xff1a;查找每个部门经理的姓名和薪金。 select ename,sal from emp where jobMANAGER; 步骤2&#xff1a;连接dept表&#xff0c;查询部门名称。…

oracle单行子查询返回多个行 order by,请教单行子查询返回多个行的问题

原帖由 风铃中の鬼 于 2009-9-23 11:10 发表 写问题的时候突然蹦出来个工作..拖延了下时间..具体问题在上面3楼 我当初提供给你的语句没有问题&#xff01; 测试如下&#xff01; SQL> select * from tab_temp; TAB_ID PRO_ID NET_ID ---------- ---------- ------…

oracle单行子查询返回多个行 order by,单行子查询返回多个行 Issue分析求助

with order_base as --获取订单基础情况 ( select ou.order_key order_key, ou.order_quantity_i, ood.dispatch_time_t, ou.part_number_s, I032ZZ01 pline_name_s from order_uv ou left join at_as_om_orderdispatchstatus ood on ou.order_key ood.order_54 union all sel…

【转】ORA-01427: 单行子查询返回多个行,连表查询去重

转自&#xff1a;http://blog.chinaunix.net/uid-23 实例1 有人问题我一个问题&#xff0c;情况如下&#xff1a;他要用根据divide_act_channel_day的new_amount字段去更新divide_stat的new_amount字段。两张表关联的条件:daylog_time,channelchannel--SQL如下&#xff1a;up…

关于子查询报错返回多行数据

项目场景&#xff1a; 子查询报错返回多行数据 问题描述 在查询数据时有两个功能都在操作同一个表,导致子查询查询数据是报错子查询返回多调数据 原因分析&#xff1a; 我遇到的问题所分析是因为两个功能操作同一个表,将查询条件字段改变了,经查询是该字段本来一对一查询更改…

ORA_01427 单行子查询返回多个行

同事反馈线上生产环境在统计报表数据时报错&#xff0c;测试环境没问题&#xff0c;对比代码相同的情况下&#xff0c;将异常锁定在数据问题上面&#xff0c;于是申请了服务器日志查询&#xff0c;发现了ORA_01427&#xff08;单行子查询返回多个行&#xff09;的报错&#xff…

SQL学习之子查询,基于Oracle下的HR用户(四)

六、 子查询 1 子查询介绍 1.1 什么是子查询 子查询是一个 SELECT 语句&#xff0c;它是嵌在另一个 SELECT 语句中的子句。 可以用组合两个查询的方法解决这个问题&#xff0c;放置一个查询到另一个查询中。内查询或子查询返回一个值给外查询或主查询。使用一个子查询相当于执行…

ORA-01427:单行子查询返回多个行

今天sql进行查询时&#xff0c;执行sql语句弹出单行子查询返回多个行的错误提示 经过整改解决了这个问题 1.错误产生原因 原sql语句(为方便理解进行简化)&#xff1a; select * from 表a a where a.name (select b.name from 表b b where b.name 张三 ) 原本想通过&#…

lwl,lwr

lwl,lwr,swl,swr中的指令后缀r(right),l(left)都是相对寄存器而言&#xff0c;load操作是把取到的部分数据&#xff0c;置入寄存器的left或者right&#xff0c;store操作时将寄存器中的数据的 left或者right部分写入目标地址。无论时大端和小端寄存器的格式都是固定的&#xff…