2.3 分层控制
在图2-1中讲述的一种构建Agent的方法是将主体分为两部分:传感器和一个复杂的感知系统,感知系统将对世界的描述输入给推理引擎来实现控制器,然后能够生成传给执行器的命令。但这 图2-4 一个理想的分层Agent系统结构。未标注的矩形表示层,双线表示信息流。虚线说明某一时刻的输出作为下一时刻的输入对智能系统而言是一个很差的结构,因为它太慢了,使得其很难缓解以下两个矛盾:复杂问题的缓慢推理和Agent所需的高级目标的快速反应,例如,躲避障碍。它也不清楚,在其可操纵范围之外存在一个独立的世界(见习题2.1)。
另一种可行结构是在图2-4中描述的控制器的分层。每一层都将其下层看做一个可从中获取感知及送出命令的虚拟主体。越低层,反应速度越快,用于那些需要快速反应的情况,且能将对环境更简单直白的感知传给高层,隐藏不重要的信息。
总的来说,不同时间的状态之间,会有大量的特征在层与层之间传递。
对于每个时刻的每一层存在如下三类输入:
- 来自于信念状态的特征,指的这些特征所记住的或以前的值。
- 从下层结构得到的感知的特征。
- 从上层结构得到的命令的特征。
对于每个时刻的每一层存在如下三类输出: - 对应上层的更高等级的感知。
- 对应下层的低等级命令。
- 信念状态特征的下一个值。
层级的实现方式决定了层的输出是如何由输入的函数得出。此函数的计算可以涉及任意计算,但目的是使每层尽可能简单。
为了实现控制器,层上的任何输入必须有确切的赋值来源。每个感知或者命令输入应该源自与其相连的其他层的输出。其他的输入来源于记住的信念。而层上的输出不必有相连对象,或者可与多个输入相连接。
高级推理在高层上给出,一般是离散的、定性的,而底层中给出的低级推理则是连续和定量的(见下面“定性与定量表示”的内容)。一个可推理产生离散和连续两种值的控制器被称为混合系统。51定性与定量表示很多的科学工程都会考虑使用微积分作为主要工具来进行数值量化的定量推理。而定性推理一般使用逻辑来在给定参数条件下进行性质上的区分而非数值上的推理。
定性推理很重要,原因如下:
- 一个Agent可能无法获知确切的数值。例如,对于一个倒咖啡的传送机器人,它也许不能计算出倒咖啡时咖啡壶的最佳倾斜角度,但是一个简单的控制规则就足够给杯子加入合适高度的咖啡。
- 无视数量的推理有时可能更为合适。例如,你也许希望机器人的策略是,只要能在其可正常操作的范围内,在工作时便可无视一些东西,如机器人负载是多少、地板有多滑或者电池的实际电量还有多少。
- 一个Agent需要做定性推理来决定哪条定量规则更为合适。比如,如果传送机器人正在向咖啡杯中加咖啡,不同的定量规则适合于决定在以下情况下咖啡往哪里流:当咖啡壶的倾斜角度不够咖啡流出时,当咖啡加入至一个没满的杯子时,当咖啡杯满并流出时。
定性推理采用离散值,其中有多种不同的形式: - 标志是用于在建模个体中进行定性区分的数值。在咖啡这个例子中,有很多重要的定性区分,包括咖啡杯是否为空、部分满、满了。这些标志值对用于预计如果杯子足够倾斜或者咖啡倒入杯中时会发生什么来说是必需的。
- 数量级顺序推理是种无视轻微差别的近似推理。举个例子,一个部分满的咖啡杯可能已经满足传送要求,还有一半满和接近空。这些模糊定义并没有一个明确定义的边界。在杯中咖啡的实际量间和定性描述存在某些关系,但是其中并没有严格的数值因子。
- 定性的导数可以表明是否一些数值在增加、减少或是不变。
一个灵活的Agent在其做定量推理之前需要做定性推理。有时只需要定性推理。因此Agent并不总是需要进行定量推理,但是有时定量和定性推理都需要。【例2-4】 我们认定一个传送机器人能在躲避障碍物的同时执行高级的导航任务。假定传送机器人需要在避开可能的障碍物的同时按照顺序访问图1-7中环境的一系列位置。
假设传送机器人有像轿车一样的轮子,且每个时刻可以选择直走、右拐或左拐。但不能停止运动。速度是恒定的,且唯一的指令是设定转向角度。轮子的转向是瞬时完成的,但是调整至一个确定角度需要时间。因此机器人只能向正前方运动或按照一个固定的半径绕圈。
机器人有一个位置传感器,可以给自己提供当前坐标和方向。还有唯一一个伸向正前稍偏右的触觉传感器,用于探测是否碰触到障碍。在下面的例子中,传感器指向前方偏右30度的方向。机器人不自带地图,
图2-5 传送机器人的分层分解且环境可以改变(如:障碍可以移动)。
对于此类传送机器人的分层控制器已在图2-5中给出。此机器人有个高级规划需要执行。这个规划是按顺序访问一系列地点。机器人需要感知环境,然后在环境中移动以便执行规划。底层的具体细节并未在图中给出。
最高层,被称为后续规划层,在例2-6中有描述。那一层获取一个用于执行的规划。此规划是所需访问地点的名字的顺序排列。地点会按照顺序选中,每次选中的地点都会转换成当前目标。此层将决定目标的x-y坐标位置。这些坐标是提供给底层的目标位置。高层知道位置的名字,而底层仅知道坐标。
高层中保留着相关的信念状态,包含一系列机器人仍需访问的地点的名称和当前目标的坐标。它以当前目标坐标的形式给中间层传达命令。
中间层,也可被称为前往目标并躲避障碍层,它试图在避开障碍的同时前往当前目标地点。中间层在例2-5中有描述。目标的位置,即target_pos可从上层获得。当中间层到达目标位置时,它会通过将arrived设为真来告诉顶层其已完成目标。中间层可给一直在等待的顶层发送中断通知来达成此目的,当然顶层也可能一直在监听中间层的运行情况来判定何时arrived状态为真。当arrived变为真时,顶层接着会将目标位置改为规划中下个位置的坐标点。因为顶层改变了当前目标位置,中间层必须使用前一个目标位置来决定其是否到达目标。因而,中间层必须从顶层获得当前和之前的目标坐标:之前的坐标位置用于决定其是否已经到达,而现在的目标坐标是用于决定将往何处去。
中间层可以获知机器人的当前坐标和方向,且能决定其触觉传感器是开启还是关闭。它使用一个非常简单的策略,即直行向目标直至被阻碍,此时其会选择左拐。
中间层是建立在底层之上的,底层会提供机器人的一些简单看法。底层可称为行进机器人和报告障碍及位置层。它执行转向命令并报告机器人的位置、方向及传感器的开关状态。
在层的内部是特征,而特征可以为其他特征值和该层输入的函数。每个特征有一个所依赖的特征或输入的一个弧形连接。特征的相互依赖图一定是非循环的。非循环图使得控制器可以通过运行一个顺序指定数值的程序而实现。而构成信念状态的特征可从内存中读取和写入。54
【例2-5】 前往目标并躲避障碍的中间层操纵机器人来躲避障碍物。此层的输入与输出在图2-6中给出。
图2-6 传送机器人的中间层机器人有一个通过触摸来发现障碍物的触觉传感器。由下层提供的一个比特数值可以判定触觉传感器是否碰触到障碍。底层也提供机器人的当前位置和方向。机器人所有能做的事情只是向左或向右旋转一个角度,或者直行。而此层的目的是让机器人向当前目标位置运行,并躲开路上的障碍,到达时发出到达报告。
控制器的此层不包含内部信念状态,因此并不存在信念状态转换函数。而用于控制机器人转向的命令函数则是其输入和是否已到达的函数。
当机器人的当前位置接近于上一个目标位置时说明其已到达。因此arrived状态会被指定一个值,它是机器人当前位置、前一个目标位置与一个阈值常数共同决定的函数:
arrived ∶= distance(previous_target_pos,robot_pos)其中,∶=是指定,distance是欧几里得距离,threshold是一个合适的距离。
如果触觉传感器开则左转,否则朝向目标位置。这可以通过给steer指定合适的值来完成:
if whisker_sensor= on
then steer∶= left
else if straight_ahead(robot_pos,robot_dir,current_target_pos)
then steer∶= straight
else if left_of(robot_position,robot_dir,current_target_pos)
then steer∶= left
else steer∶= right
end if
当机器人位于robot_pos,面朝方向robot_dir,且当前目标位置current_target_pos在机器人的前方位置,并满足一些阈值限制时(对于后面的例子,此阈值为正前方偏移11°),straight_ahead(robot_pos,robot_dir,current_target_pos)为真。函数left_of用于检测目标是否在机器人左侧。
图2-7 传送机器人控制器的顶层此层是纯定量化的。它以数字量化推理而非使用离散值。
【例2-6】 最顶层,也叫后续规划层,会被给予一个规划,该规划为一个需要顺序访问的地点的名单。其中都是各种目标,这些目标都可被规划者开发出来,如在第8章中开发出的那些。当机器人到达前一目标时顶层也会被告知。它必须将当前目标坐标输出给中间层,并记住执行规划时其需要的。此层显示在图2-7中。
该层会保留内部信念状态。它会记住当前目标位置和其他需要去访问的位置。其中56to_do特征的数值是待定访问的地点的一个列表。而target_pos特征保留着当前目标的位置。
一旦机器人到达它的前一目标位置,下一个目标位置就会变成下一个需要访问地点的坐标。高层规划会以位置名字的形式给予机器人,因此必须将其转换成中间层可以使用的坐标形式。下面的编码说明了当机器人到达前一目标位置时目标位置和to_do列表如何改变。
if arrived and not empty(to_do)
then
target_pos′∶= coordinates(head(to_do))
to_do′∶= tail(to_do)
end if
其中,to_do′是to_do特征的下一个值,target_pos′为下一个目标位置。在这里head(to_do)是to_do列表的第一个元素,tail(to_do)是余下的to_do列表,当to_do列表为空时,empty(to_do)为真。
在这层中,如果to_do列表变成空,机器人就不会改变其目标坐标,之后便会一直在原地绕圈。见习题2.3。
此层可确定已命名地点的坐标。通过一个简单的有位置坐标的数据库就可以实现。如果地点不会移动且事先知道,使用这样一个数据库是很明智的。然而,如果目标可以移动,那么下层必须能告诉上层目标当前位置。上层必须请求下层告知给定目标的坐标。见习题2.8。
为了完成控制器,还必须初始化信念状态变量,且高级规划必须输入。通过使用规划的尾部来初始化to_do列表和使用第一个位置的坐标来初始化target_pos,这就可以实现。
图2-8给出了有一个障碍的规划[goto(o109),goto(storage),goto(o103)]的仿真。机器人开始时位于位置(0,5)且面朝90度(北),而在位置(20,20)与(35,-5)之间有一个矩形障碍。
图2-8 执行例2-6中规划的机器人仿真
Agent对世界的建模
信念状态的定义非常一般,且没有限制哪些是Agent应该记住的。一般来说Agent保留一些世界的模型是很有用处的,尽管这些模型不完全、不精确。一个关于世界的模型是某一时刻世界状态和/或世界的动态的一种表示形式。
对于Agent来说,可以基于其命令来保持和更新世界的信念。这种方法需要世界的状态模型和世界的动态模型。给定某个时刻的状态和动态,57可以预测下个时刻的状态。这一过程也被称为推算。例如,机器人可以保留其对自己位置的估计并基于自己的动作来自我更新。若世界是动态的或者执行器有噪声(如半径不精确的轮子的滑动或者加速不连续),噪声会累积,因此估算的位置很快就会变得不准确以至于无用。然而如果模型在某些抽象层次上是准确的,则会成为该抽象层次上的合适模型。
另一种方法是使用感知来构建世界的相关部分的模型。感知就是用传感器信息来理解世界。举个例子,这可能会包括使用视觉来分辨世界的特征和使用这些特征来决定机器人、障碍物或者需要捡起的包袱的位置。感知一般都是模糊的和有噪声的。仅基于一张世界的图片很难建立一个三维世界模型。
一个更加有前景的方法是将Agent对世界状态的预测与感知信息结合起来。这可以采用多种形式:
- 如果向前预测的噪声与感知的噪声都有建模,那下一个信念状态就可以使用贝叶斯规则来估算。这也被认为是过滤。
- 如果使用更复杂的传感器,如视觉传感器,那就可以使用模型来预测何处可以发现视觉特征,接着便可用视觉来查找预测位置附近的这些特征。这会使得视觉任务变得更加简单,且相对于前面的仅依靠预测,使用视觉可以大幅减少位置误差。
如果可以采用如下方式得到最优动作,即通过首先发现最佳的世界模型,然后再使用此模型来决定最佳动作,那么控制器问题便是可分割的。不幸的是,大部分控制问题是不可分割的。这意味着Agent需要考虑多种模型来决定接下来做什么,且它可从世界获得什么信息58取决于其对该信息的不同处理。通常来讲,并不存在与Agent行为完全独立的世界最佳模型。