目录
1. 简单反射型智能体(Simple Reflex Agent)
2. 基于模型的反射型智能体(Model-Based Reflex Agent)
4. 基于效用的智能体(Utility-Based Agent)
任何通过传感器(sensor) 感知环境(environment) 并通过执行器(actuator) 作用于该环境的事物都可以被视为智能体(agent) 。
我们使用术语感知( percept) 来表示智能体的传感器正在感知的内容。智能体的感知序列( percept sequence) 是智能体所感知的一切的完整历史。一般而言, 一个智能体在任何给定时刻的动作选择可能取决于其内置知识和迄今为止观察到的整个感知序列,而不是它未感知到的任何事物。通过为每个可能的感知序列指定智能体的动作选择,我们或多或少地说明了关于智能体的所有内容。从数学上讲,我们说智能体的行为由智能体函数( agent function) 描述,该函数将任意给定的感知序列映射到一个动作。
可以想象将描述任何给定智能体的智能体函数制成表格。对大多数智能体来说,这将是一个非常大的表,事实上是无限的(除非限制考虑的感知序列长度)。给定一个要进行实验的智能体,原则上,我们可以通过尝试所有可能的感知序列并记录智能体响应的动作来构建此表 a。当然,该表只是该智能体的外部特征。在内部,人工智能体的智能体函数将由智能体程序( agent program) 实现。区别这两种观点很重要,智能体函数是一种抽象的数学描述,而智能体程序是一个具体的实现,可以在某些物理系统中运行。
我们通过描述行为(即在任意给定的感知序列之后执行的动作)讨论了智能体。现在我们必须迎难而上来讨论智能体内部是如何工作的。人工智能的工作是设计一个智能体程序( agent program) 实现智能体函数,即从感知到动作的映射。假设该程序将运行在某种具有物理传感器和执行器的计算设备上,我们称之为智能体架构( agent architecture):
智能体 = 架构 + 程序
显然,我们选择的程序必须是适合相应架构的程序。如果程序打算推荐步行这样的动作,那么对应的架构最好有腿。架构可能只是一台普通 PC,也可能是一辆带有多台车载计算机、摄像头和其他传感器的机器人汽车。通常,架构使程序可以使用来自传感器的感知,然后运行程序,并将程序生成的动作选择反馈给执行器。
我们在设计的智能体程序都遵循相同的框架结构:它们将当前感知作为传感器的输入,并将动作返回给执行器。需要特别注意的是,智能体程序(仅将当前感知作为输入)与智能体函数(可能依赖于整个感知历史)之间存在显著差异。由于环境中没有其他可用信息,智能体程序别无选择,只能将当前感知作为输入。如果智能体的动作需要依赖于整个感知序列,那么智能体必须记住历史感知。
function Table-Driven-Agent(percept) returns 一个动作persistent: percepts,初始为空的序列
table,以感知序列为索引的动作表,初始为完全确定
将percept添加到percepts的末尾
action ← Lookup(percepts, table)
return action
每个新感知都会调用 Table-Driven-Agent 程序,并且每次返回一个动作。该程序在内存中保留了完整的感知序列。
然而,表驱动的智能体构建方法注定会失败,深入思考这一问题会很有启发性。设 P 为可能的感知集,T 为智能体的生存期(对应它将接收的感知总数),查找表将包含 PT 条记录。以自动驾驶出租车为例:来自单个摄像头(通常是 8 个摄像头)的视觉输入速度约为 70 MB/s(每秒 30 帧,每帧 1080 像素 × 720 像素,每个像素包含 24 位颜色信息),驾驶 1 小时后,将会生成一张超过 10600,000,000,000 条记录的表。即使是作为真实世界中微小的、表现良好的片段的国际象棋,其查找表也至少有 10150 条记录。相比之下,可观测宇宙中的原子数量少于 1080 个。这些表的巨大规模意味着:(a)这个宇宙中没有任何物理智能体有空间存储表;(b)设计者没有时间创建表;(c)任