1.2 智能体的感知环境与交互


1.2 智能体的感知环境与交互

本节摘要:环境是智能体感知和行动的舞台。本节从「环境为什么重要」切入,系统拆解环境的六个属性——可观测性、确定性、离散性、静态性、智能体数量、已知性,再讲状态与动作的表示方法(原子/特征向量/结构化),最后落到目标与奖励机制,并用 Gymnasium 的 GridWorld 环境代码演示环境如何一步步建模。

本节目标

阅读完本节,你应当能够:

  1. 说出环境对智能体的四项决定性作用
  2. 用六维属性完整描述任意一个环境
  3. 区分原子、特征向量、结构化三种状态表示及其适用场景
  4. 说明目标状态、目标条件、目标行为的区别与联系
  5. 解释稀疏奖励与密集奖励的差异,以及奖励函数设计的重要性
  6. 用 Gymnasium 定义一个具备 reset/step/render 的最小网格世界环境

问题与直觉

想象你要给一个智能体写程序,但不知道它会在什么环境里运行:是棋盘(状态完全可见、走一步算一步)还是真实马路(传感器有盲区、天气会变、别的车也在动)?这决定了天差地别的设计——棋盘用搜索就行,马路得做部分可观测建模、不确定性处理和实时响应。

这就是环境要回答的问题。SOURCE 原文把环境的地位讲得很重:环境定义智能体的任务和目标,影响它的感知与行动方式,决定它的学习机制,也是评估性能的基准。 翻译成大白话:环境是题面,智能体是答题者,题面的性质决定了解法的上限。很多智能体项目失败,不是算法不够好,而是环境没分析清楚——把部分可观测当成完全可观测来做,把动态环境当静态来做,后边所有设计都跟着错。

核心原理

环境的六维属性

SOURCE 给出了六对属性,这六对构成了分析环境的完整框架:

  • 可观测性:完全可观测意味着传感器能拿到全部决策相关信息,如井字棋、国际象棋;部分可观测意味着信息有缺失或噪声,如自动驾驶(看不见被遮挡的行人、感知不了其他车意图)。
  • 确定性:确定性环境里,同一状态下执行同一动作,后继状态唯一,如象棋;随机性环境里结果不唯一,如掷骰子。物理世界的机器人操作几乎都是随机的——摩擦、误差、传感器噪声都带来不确定性。
  • 离散性:离散环境的状态、动作、时间是有限的或可数的,如棋盘游戏;连续环境至少有一个维度是连续的,如自动驾驶的速度与方向控制。
  • 静态性:静态环境在智能体思考期间不变,如解数独;动态环境会随时间自行演化,如股票交易市场——你不动它也在变。
  • 智能体数量:单智能体环境只有自己在行动;多智能体环境里存在竞争与合作,涉及博弈论、协作学习,是第 3 章多智能体系统的基础。
  • 已知性:已知环境里智能体完全掌握规则、转移函数和奖励机制;未知环境需要通过与环境的交互来学习模型,如探索陌生地形的导航机器人。

一个环境的属性组合会直接传导到算法选型:部分可观测、非确定性、动态的环境最棘手,需要状态估计、概率建模和实时重规划;而完全可观测、确定、静态的环境用经典搜索就能解决。后文第 3 章架构选型、第 6 章强化学习进阶都反复引用这组属性,请务必吃透。

状态与动作的表示

状态描述环境在某一时刻的情况。常见三种表示:

  • 原子状态表示:用符号或 ID 表示状态,状态之间没有内部结构,如迷宫里的位置编号。
  • 特征向量状态表示:用一组特征描述状态,每个特征代表环境的一个属性,如自动驾驶里用速度、位置、障碍物距离组成的向量。
  • 结构化状态表示:用树、图、知识图谱等结构表示实体、关系和属性,适合需要理解对象之间关系的任务。

动作则分离散动作(有限可数,如游戏里的上/下/左/右)和连续动作(可在连续范围取值,如机械臂角度、油门大小)。状态空间是所有可能状态的集合,动作空间是每个状态下可执行动作的集合——两者的规模直接决定问题的复杂度和搜索成本。

SOURCE 给了一个很直观的代码示例来区分这些表示:

atomic_states = ["room_a", "room_b", "room_c", "corridor"] feature_vector_state = [25.5, 10.2, 0.8] # 速度、距离障碍物、电池电量 discrete_actions = ["move_forward", "turn_left", "turn_right", "brake"] continuous_action = 0.5 # 油门开度,范围 0 到 1

原子表示省空间但丢信息,特征向量信息密度高但设计特征要花功夫,结构化表示表达力最强但计算代价大。选择哪种,取决于任务需要多大粒度的状态理解。

目标与奖励

目标有三类:目标状态(希望达到的环境状态,如迷宫的出口)、目标条件(希望满足的条件,如保持系统负载在范围内)、目标行为(希望表现出的行为模式,如社交机器人自然对话)。目标驱动智能体通过最大化累积奖励来学习策略——强化学习就是实现这种智能体的常用途径。

奖励信号可以是稀疏的(只有到达目标才有奖励)或密集的(每一步都有反馈)。奖励函数定义如何根据状态或行为计算奖励值。这里有一个关键教训:奖励函数必须与目标对齐,否则智能体学到的行为会偏离预期——这在第 2 章学习与进化和第 6 章强化学习进阶都会反复出现。奖励设计本身也是一门学问,设计得不好,智能体可能找到「刷分」的捷径而不是真正完成任务。

工程实践要点

用 Gymnasium 定义网格世界环境

SOURCE 原文用 gymnasium(原 gym)库构建了一个完整的 GridWorld 环境。要点如下:

import gymnasium as gym from gymnasium import spaces import numpy as np class GridWorldEnv(gym.Env): def __init__(self, grid_size=5): super().__init__() self.grid_size = grid_size # 观测空间:智能体位置 + 目标位置,都是二维坐标 self.observation_space = spaces.Dict({ "agent_pos": spaces.Box(low=0, high=grid_size-1, shape=(2,), dtype=int), "goal_pos": spaces.Box(low=0, high=grid_size-1, shape=(2,), dtype=int), }) # 行动空间:0右 1左 2上 3下 self.action_space = spaces.Discrete(4) self._action_to_direction = { 0: np.array([1, 0]), 1: np.array([-1, 0]), 2: np.array([0, 1]), 3: np.array([0, -1]), } def reset(self, seed=None, options=None): super().reset(seed=seed) self._agent_location = self.np_random.integers(0, self.grid_size, size=2) self._goal_location = self._agent_location while np.array_equal(self._goal_location, self._agent_location): self._goal_location = self.np_random.integers(0, self.grid_size, size=2) return self._get_obs(), self._get_info() def step(self, action): self._agent_location = np.clip( self._agent_location + self._action_to_direction[action], 0, self.grid_size - 1) terminated = np.array_equal(self._agent_location, self._goal_location) reward = 1 if terminated else 0 return self._get_obs(), reward, terminated, False, self._get_info()

这个环境里能看到的工程细节:observation_spaceaction_spacespaces 模块明确定义——这是强化学习接口的硬约束,算法侧依赖它知道状态维度、动作数量;reset 保证智能体和目标不重叠;stepnp.clip 保证智能体不出界;_get_info 返回曼哈顿距离。这些设计不是随手写的,它们是「环境作为评估基准」这一理念的落地:观测、动作、奖励都规范化,算法才能在上面公平训练和比较。

常见环境类型的对照

SOURCE 还总结了游戏环境、机器人环境、仿真环境的典型特征,值得做一个对照表:

环境类型 可观测性 确定性 离散性 动态性
棋盘游戏 完全 确定 离散 静态
即时战略游戏 部分 混合 离散 动态
物理机器人 部分 随机 连续 动态
仿真环境(交通/金融) 可控 可配置 可配置 可配置

仿真环境尤其值得注意:它牺牲部分真实性,换来可控性、可重复性、可扩展性、安全性。做机器人智能体先在仿真里调好,再上真机,已经是行业标准做法。SOURCE 里用 PyBullet 加载 URDF 模型(如 r2d2.urdfplane.urdf)、设置重力、步进仿真的流程,就是这种思路的缩影。

⚠️ 常见坑:定义环境时把 terminated(回合结束)和 truncated(步数上限截断)混为一谈。二者语义不同——前者是任务真正完成或失败,后者是时间/步数到了强制结束,混合使用会让学习算法得到错误的奖励信号。
💡 关键直觉:奖励值的大小没有绝对意义,相对差异才有意义。稀疏奖励(到达才给 1)和密集奖励(每步给距离惩罚)都能工作,关键是信号密度要匹配算法:Q-Learning 这种表格式方法适合稀疏小状态空间,高维环境需要更先进的采样方法(见第 6 章)。

环境的六个属性如何影响算法选型

把这六个属性跟算法对应起来,是本节最有工程价值的一张表:

环境特征 推荐方向 代表方法
完全可观测 + 确定 经典搜索规划 A*、Dijkstra、状态空间搜索
完全可观测 + 随机 概率规划 MDP、值迭代
部分可观测 状态估计 + POMDP 贝叶斯滤波、POMDP
动态环境 反应式 + 重规划 分层架构、实时规划
未知环境 交互学习 强化学习、模型学习
多智能体 博弈与协作 博弈论、多智能体 RL

实际项目里环境往往落在几种属性的组合上,选型时要抓住「最难的那个维度」:比如自动驾驶是部分可观测+随机+连续+动态+多智能体——几乎踩满了所有难点,所以它成了强化学习研究的试金石。

仿真环境的三种实践角色

仿真环境在智能体开发里有三种不同角色,用错会出问题。第一种是算法调试场:环境完全可控,参数可反复调整,适合把算法从「能跑」调到「跑得稳」,SOUCE 里交通信号灯模拟(TrafficLightEnv)就是这个用途——用一个字典记录南北/东西红绿灯状态,step 里切换灯色、打印通行情况,用来演示状态转移逻辑再合适不过。第二种是训练加速器:在仿真里大批量训练策略,再迁移到真实环境微调,比如先用 PyBullet 物理引擎跑 URDF 机器人模型学习控制策略。第三种是安全验证场:在极端场景(暴雨、传感器失效、恶意输入)里测试智能体鲁棒性,避免真机上的破坏性实验。

需要清醒认识的是,仿真环境有「保真度」问题:仿真里学到的策略在真实环境可能失效,这被称为 sim-to-real gap。缓解手段包括域随机化(随机扰动仿真参数)、更好的物理引擎、以及把真实数据混合进训练。SOURCE 里 PyBullet 用 p.setGravity(0,0,-10) 设置重力、p.stepSimulation() 步进物理引擎的做法,本质上就是在为这个 gap 做缓解——引擎越接近真实物理,策略迁移越容易。

环境反馈的两条回路

智能体与环境交互的反馈分成两条回路,容易混淆。第一条是即时回路:行动改变环境,环境给出状态变化和奖励,智能体据此调整下一步——这就是感知-决策-行动的闭环。第二条是学习回路:把交互产生的经验(状态、动作、奖励、下一状态)积累起来,离线或在线更新模型、策略、知识库——这是智能体「进化」的通道。SOURCE 里反复出现的图「智能体与环境交互示意」画的其实是两条回路叠在一起:一条闭环处理当前时刻,一条从行动/感知回环到学习模块处理长期改进。

工程上,这两条回路的实现位置通常不同:即时回路跑在主循环里,要求低延迟;学习回路可以放后台异步执行,对延迟不敏感。很多实时系统(游戏 AI、自动驾驶)的做法是「反应层即时响应、学习层后台消化」,这也再次呼应了前面提到的快慢结合思路。理解了这两条回路,你就明白了为什么智能体代码里既有 step() 这样的同步方法,又有 replay() 这样的异步学习方法——它们服务的回路不同。

一节小结

  • 环境四作用:定义任务目标、决定感知行动方式、驱动学习机制、作为评估基准
  • 六维属性:可观测性、确定性、离散性、静态性、智能体数量、已知性
  • 状态三表示:原子、特征向量、结构化,按信息粒度和计算代价取舍
  • 目标三类:目标状态、目标条件、目标行为;奖励必须与目标对齐
  • Gym 规范:observation_space/action_space 明确声明,reset/step 成对实现
  • 选型主线:先抓「最难的环境维度」,再定算法方向

下一节把「智能体类型与分类」讲透——有了概念和环境,分类体系就有落脚的依据了。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U