人工智能 第三章

一. 目标智能体(Goal based agents)

前面俩智能体,简单反射智能体和状态反射智能体,因为用途狭隘所以就不讲了,我们现在开始来看看目标智能体,目标智能体主要考查询找解的方式找到问题的答案. 小弟和大家来聊聊几个基础的概念.

解: 目标智能体最终会返回一系列动作,这个动作会达到我们的目标状态

过程: 寻找该动作的序列,即为查询搜索.为啥非得用搜索方式找解,因为难NP问题(NP-HARD)只能考搜索解决. 我们所熟知的例如深搜,广搜等这都是查询逻辑来解这些问题.

问题形式化描述(problem formulation): 就是个写法描述目标和决定要考虑的动作和状态.一般由这么要素:

  • 初始状态(initial state)
  • 目标状态(goal)
  • 各种状态(states)
  • 行为(actions)
    -代价(path cost):行为的代价,用来选取最优解.

我们来看看目标智能体的任务环境(Task Environment):
(1) 全可察环境(fully observable):智能体的传感器可以采集到所有相关信息关于环境状态(environment state),
(2) 确定性(deterministic): 每个行为有一个输出
(3)静态(static):当智能体正在思考时(deliberating),环境是不随着时间改变
(4)单个智能体(single agent)

二. 通过查询解问题(solving problem by searching)

目标智能体的实现其实是通过查询求解问题,小弟带大家来看看几个例题,来理解下目标智能体解哪些问题,和它们的特点.

问题1:

这个问题在说,我们初始地方在Arad这个城市,找一个最优的路径可以到达Bucharest这个城市.

首先我们第一步要将问题形式化(Formulate problem)
初始状态: 在Arad
目标状态: 在Bucharest
状态(state): 各种城市,包括初始状态城市
行为: 在俩城市间开车
代价: 俩城市之间路径距离
我们问题形式化的目的是用来分析问题的将抽象的问题具象化,别一上来就写码,稍微走个流程分析下问题.

查询找解(search for solution): 目标智能体需要找到一系列开车的行为,例如先去那个城市再去那个城市最后到达目的地城市. 至于怎么找到这个那就要看你的查询逻辑了,你说你可以用深搜,找到目标城市(可能不是最小代价),最后返回路径,你也可以广搜,搜到目标城市返回路径.

问题2
就是我们的清洁机问题

上图每个节点就是一个状态,假如就俩房间,我们就可以根据查询找解的方式来找的目标状态.很明显我们的目标状态应该就是最底部的那俩状态,要么清洁机在左房间,左右房间都没垃圾,要么要么清洁机在右房间,左右房间都没垃圾. 我们看到这里有很多线,连接节点或者连接自己,每个线意味着做出的行为,例如,第一排,不是有俩节点么,我们看左边的这个,有个N连接自己,N意味着啥也不做的行为.那啥也不做不就状态还是自己么.

状态: 每个房间脏不脏和清洁机的位置
行为: 左走,右走,吸尘,啥也不做
目标: 干净
代价: 没做个行为要有1个代价,啥也不做0个代价,这个代价你可以理解耗电,反正我们就是需要一个最小代价的一系列动作使初始状态到目标状态.这就是最优解.

问题3
8格问题(8-puzzle)

就是移动格子使最后数字从大到小排序.

初始状态: 上图左侧
目标状态:上图右侧
行为: 移动格子
代价: 移动一次代价1

三. 树搜索

现在我们准备搜索,第一步就是用什么样子的数据结构来进行搜索,在目标智能体中无非就这两种,第一个树搜索,第二个图搜索.

树搜索
举个例子,我们可以将我们上述问题1画成树样子的数据结构来理解下它背后的思维.


黑色节点意味着已开点(explored node),啥意思,就是你已经在这个点上了,或者已经经过该节点. 因为我们初始位置在Arad这个城市.

实线节点是边缘点(frontier node),Arid这个城市不是可以去Siblu,Timsoara和Zerind这仨城市,就是我们可以去哪些城市,虚线节点未知点(unseen node),不能之间去的城市,就是你还没发现的城市.

节点和节点的连接边就是城市和城市之间距离。

好我们往下看:
下图有点乱而且恶心,强迫症的同学忍受下,图还是一样的.

上图,我们看到,黑色节点,现在有俩了,一个是初始点Arad,还有个Siblu这城市,说明我们现在到了Siblu,也就是开了Siblu这个节点,所以它下面的邻近城市变成了实线节点. 在到Siblu这个城市之前,我们不是在Arad城市么,我们会先检查是否是我们的目标点,若不是就开个边缘点,开Siblu这个点也好,开Timsoara也好,这就是你的查询策略, 当然了,开点的时候记着检查下当前节点(即已开点)是否是目标节点,若不是就接着开,至于开哪个点就是你的查询策略了.

节点包含的信息有我们的环境状态,子节点,父节点,深度,代价. 节点和节点之间连接的边即为行为,对于问题1来说,我们的节点就是我们目前在的城市(环境状态),从哪个城市来的(父节点),能去哪些城市(子节点),深度就是目前该节点处在树的深度,代价就是已经走的路程. 节点和节点的连接边就是俩城市间的距离,或者往哪里开车开多远. 对于问题2来说,我们的节点就是目前清洁机在哪里,垃圾有没有,如下图,就是问题2的一个节点:

N:啥也不做,那它自然指向自己这个节点,即环境状态不变
R:清洁机向右走
S:清洁机吸尘
L:因为清洁机已经在左侧房间,那它不能在往左走了,因为没房间,所以没有这个行为.

对于问题3:

我们的节点是这个8格子目前的状态,你如果叫8这个数字往上移动,那就是新的状态. 当然了为了之后查询方便,你也可以存储别的信息,例如深度多少,代价多少, 当然,你也要存储它的父节点,和它的子节点,父节点就是:挪动哪个数字成了你现在的状态,子节点就是:你要挪动哪个数字变成下一个状态. 而节点和节点之前的连线就是行为,例如挪动8这个数字向上,就变成新的状态,这个状态是子节点,深度加1,代价加1.

树查询逻辑伪代码

我们来品品上述代码.
先看TREE-SEARCH这个方程. 它返回解和个错误,这里其实它写的并不好,什么是解,解应该是一系列行为,我们从它代码里能看到,它除了return failure,还return node,这个node就是含有目标状态的节点,所以我们其实还需要记录下如何到这个目标状态的节点,这个才是解.

frontier=INSERT(MAKE-NODE(INITIAL-STATE[problem]),frontier): 这一句在说,problem是我们的问题,INITIAL-STATE[problem]也就是要得到原问题的初始状态,例如我们问题1的初始状态就是我们在Arad这个城市,INSERT(MAKE-NODE(INITIAL-STATE[problem]),frontier)在说这个节点的边缘节点有谁把它塞进变量frontier里,这个大家可以自行去做,你塞进列表里也行,塞进队列queue里也行(队列比列表要运行快,推荐用队列).

然后loop do 循环做,如果我们的变量frontier是空则返回错误,我们每次开点都是从边缘节点里去选择(如何选择是你的查询策略),每次开一个点,都会查下它是否是目标节点,既然是开点,那自然是从变量frontier里取出个边缘节点供我们开,开的这个节点又会有自己的边缘节点再塞进变量frontier 即这段代码: frontier=INSERTALL(EXPAND(node,problem),frontier),就这样循环做下去,如果变量frontier是空,那意味着开点开到头了,开的这个边缘点都没自己的边缘点了,也意味着全查完也没有目标点这个状态.

我们再来看看EXPAND这个方程. 这个方程就是在做开点这个操作.记录下这个节点的父节点,代价,状态,等等.

四. 树搜索和图搜索的区别

讲区别之前,小弟和大家聊聊什么是state space(状态空间). 状态空间顾名思义就是所有状态的空间和行为.如:

上图就是一个状态空间. 当然了你可以理解成就是整个树或者整图,节点与节点之间连接的边就是行为.但其实对于很多问题来说,图的状态空间比树的要小,啥意思,我们来看看问题1:
图搜索就是按照这个图去搜索:

当然了,这里的点都是节点,而不是城市,节点会储存当前状态,还有深度等信息,有的人会说,这怎么看深度,例如,Arad这个节点假如深度是0,因为是我们出发点,那么它的深度为1时,就是Zerind,Sabiu和Temisoara,这仨节点,要存储深度1.

如果是树搜索那就是像我们讨论过的:

大家看看最后一排的节点是不是有个Arad,对没错,树搜索重复了. 这个不能怨树搜索,有很多问题重复现象是不能避免的. 但回到正题,其实树搜索的状态空间是不是会比图搜索的状态空间要大些,因为有重复的节点在图搜索里.

小弟再举个例子:


上图左侧是图,右侧是树,你会发现,本来就是个线性问题,被树活生生的弄成了指数问题了.树树图会有重复的节点,所以我们更一般喜欢用图搜索

图搜索和树搜索逻辑代码区别,在此给大家看下大致的流程,具体的树搜索逻辑伪代码小弟已经分享,图搜索逻辑伪代码将在下面图搜索中分享. 截取书上的图:
在这里插入图片描述
上述其实就是就是一个很宽泛的树搜索和图搜索的逻辑代码,具体操作还需要同学们随机变化.

五. 图搜索

小弟来讨论下图搜索,不多说看下代码

在这里插入图片描述

我们来一点点品味下这个伪代码.
先看GRAPH-SEARCH这个方程:
我们可以发现,对比树搜索代码,它多了个explored集合,用来存储explored节点即已开点.在loop do里讲已开点放入explored集合中. 还记得树搜索中,frontier=INSERTALL(…)么,它是将已开点的所有边缘点都放入进去,但图搜索中却不一样,他是frontier=INSERTNODES(…). 我们来看下INSERTNODES这个函数. 先给大家科普下 ∃是存在的意思,不存在就是 ∃上加个斜线,小弟打不出来,就是INSERTNODES这个函数中第三行if …m in explored U frontier…那句.

我们来具体看下,INSERTNODES这个函数输入了个nodes,这是已开点的所有边缘点. 查每个边缘点,如果不存在某个边缘点它的状态不在explored和frontier集合里,说明这个点好新,从没见过呢,那就是加入到frontier集合里,就这。

看完代码我们是否会有个问题,那就是所有的已开点都会存在我们的内存里.这里再多讲一句,讲下图搜索找优解.什么是优解,不仅可以找到目标状态,也可以做到代价最少.对于图搜索找最优解,我们仅仅需要改下INSERTNODES函数:

在这里插入图片描述
它其实就是在说,即使遇到重复的了,我们看看是否这个路径到此节点是否最优,毕竟条条大路通罗马,我又找到罗马这个节点了,但我看看是否我的这个路径代价最低,如果最低就取代你.当然取代你节点里所有信息.

六. 结语

若有谬误请指出,在此感谢.
之后下章小弟会带大家看看如何开边缘点的策略,即无信息查询和有信息查询.

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
人工智能研究中,状态空间法是一种基于解空间的问题表示和求解方法。该方法通过在可能的解空间内寻找一个解来求解问题。状态空间法以状态和算符为基础来表示和求解问题。在传统人工智能问题中,复杂的求解技术都离不开表示与搜索这两个方面的内容,其中状态空间表示是其中的一个重要概念。状态空间法采用试探搜索方法,在某个可能的解空间内寻找一个解来求解问题。图解人工智能第二章学习笔记中可能会涉及到状态空间法的概念和问题状态描述。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [人工智能及其应用——第二章学习笔记(上)](https://blog.csdn.net/JallinRicher/article/details/122752897)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [《人工智能及其应用》课程笔记(二)第2章 知识表示方法](https://blog.csdn.net/qq_46485137/article/details/122101559)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值