游戏引擎Gameplay玩法系统:高级AI

Gameplay 系统 - 高级 AI 入门与 Q&A

核心内容:AI 相关问题解答 (Q&A)

这部分是本节课的技术核心,讲师针对社区提出的三个高质量问题进行了深入解答,涵盖了现代游戏 AI 设计中的哲学思辨、性能预算和架构演进。

Q1: "老头环" AI 读取玩家输入是作弊吗?这是未来的主流方向吗?

核心观点

这是一种在特定游戏类型中为了提升 AI 表现和玩家体验而采取的 实用主义设计(Pragmatic Design),但并非适用于所有游戏的“银弹”。

关键要点

  • 经典游戏AI设计准则: 从传统意义上讲,AI 的行为决策应该基于它在游戏世界中能“感知”到的信息(如视觉、听觉),直接读取玩家的输入(Input Buffer)被认为是 作弊 (Cheating)。因为 AI 获取了玩家无法获取的“超前信息”。

  • 为什么这么做?—— 实用性考量:

    • 意图推导的困难: 对于《艾尔登法环》这类高强度、快节奏的动作游戏,单纯通过分析玩家的位置、朝向等世界状态来 推导玩家意图 (Inferring Player Intention) 是非常困难且有延迟的。
    • 提升AI表现: 直接读取输入可以让 AI 的反应 更灵敏、更敏捷,能够实现高难度的“读指令”闪避或反击,极大地增强了 Boss 战的挑战性和趣味性,最终服务于 游戏乐趣 (Gameplay Fun)
  • 是否是未来主流?—— 取决于游戏类型:

    • 不适用场景: 讲师以 RTS (即时战略) 游戏 为例,玩家在此类游戏中有大量的无效点击(例如,为了保持手感的高频 APM 操作)。如果 AI 读取所有这些输入,反而会被噪声淹没,无法做出正确判断。
    • 结论: 读输入是一种有效的技术,但它的应用场景高度依赖于游戏类型。对于需要 AI 做出瞬时、精准反应的动作游戏是合理的,但对于宏观策略类游戏则不然。

Q2: 游戏引擎中 AI 的计算预算 (Budget) 有多大?

核心观点

AI 的计算预算没有固定标准,它是一个 动态的、依游戏类型和平台而异 的权衡结果。

关键要点

  • 预算范围: 传统上,AI 的预算可能在每帧 1-2ms 左右,但这并非定论。

  • 影响预算的因素:

    • 游戏类型:
      • 高预算场景: 如 P 社(Paradox Interactive)的 回合制大战略游戏 (Turn-based Grand Strategy Games)。这类游戏需要模拟上百个 AI 君主的复杂决策,可以分配非常高的预算,让 AI 行为更深度、更拟人。
      • 低预算场景: 如快节奏的射击游戏,需要将更多预算留给渲染和网络同步。
    • 平台与模式:
      • 单机游戏 vs. 网游: 单机游戏中,AI 角色数量通常可控,因此 单个 AI 的预算可以更高,使其表现得更智能。而网游需要处理大量玩家和 AI, 单个 AI 的预算会被摊薄,导致其行为相对简单。
  • 核心优化技巧:

    • 更新频率解耦 (Decoupled Tick Frequency): 这是最重要的优化手段。AI 的决策逻辑 不需要与渲染同步(例如 60 FPS)
      • AI 的 Tick() 可以运行在低得多的频率上,比如每秒几次。
      • 复杂的宏观战略决策甚至可以每秒更新一次。
    • 分层架构 (Layered Architecture):
      • 宏观决策 (Macro-level Decisions): 如战略规划、长期目标等,可以低频更新
      • 微观行为 (Micro-level Actions): 如战斗中的闪避、寻路等,可以高频更新
      • 通过混合不同频率的更新,可以在保证 AI 响应性的同时,极大地节约计算资源。

Q3: 能否将 AI 计算从客户端分离到分布式系统(服务器/云)?

核心观点

将 AI 计算 服务化 (As-a-Service) 并从客户端剥离,不仅是可行的,而且已经是业界的一个重要实践和未来的发展方向

关键要点

  • 当前实践:

    • 在许多大型网游中,AI 逻辑已经运行在 独立的 AI 服务器 (Dedicated AI Server) 上。游戏服务器负责状态同步,而 AI 服务器专门负责决策计算。
    • 这种架构已经非常成熟,AI 可以被视为一个独立于游戏引擎的服务。
  • 未来方向:

    • AI 系统可以完全独立于游戏引擎,通过标准化的接口(如 Python API)进行调用。这使得 AI 算法的迭代、测试和部署更加灵活。
    • 这种 云原生 (Cloud-Native) 的思路为更复杂的 AI 模型(如深度学习模型)在游戏中的应用铺平了道路。
  • 局限性 (Caveat):

    • 这种架构高度依赖网络连接。对于 手游 (Mobile Games) 或其他需要离线游玩的单机游戏,所有计算必须在本地设备上完成,因此无法采用这种分离式架构。

AI 服务化架构与分层任务网络 (HTN) 简介

一、 架构探讨:AI 作为独立服务 (AI as a Service)

这部分内容源自课程开始前的问答环节,探讨了一种前瞻性的游戏 AI 架构。

核心观点:将 AI 模块解耦为独立服务

传统的游戏 AI 通常内置于游戏引擎或客户端中。一种更现代的架构是 将 AI 系统作为一个独立的外部服务,游戏引擎通过网络接口(例如 Python API)与其进行通信。这种架构在大型、复杂的多人在线世界或虚拟世界中尤其有价值。

优势 (Pros)

  • 解耦 (Decoupling): 这是符合现代引擎架构的核心原则。AI 服务可以独立开发、维护和部署,与游戏主逻辑分离。各个服务之间通过定义好的数据协议进行交互。
  • 鲁棒性 (Robustness): 系统的健壮性大大增强。例如,如果某个 AI 服务器崩溃,游戏主循环不会中断。系统可以简单地重启该服务,并重新建立连接,让 AI 行为恢复。
  • 可扩展性与复杂性 (Scalability & Complexity): AI 服务可以部署在强大的专用服务器(如 AI 服务器集群)上,使其能够执行远比客户端或游戏服务器更复杂的计算,从而实现更丰富、更智能的 AI 行为。

挑战 (Cons)

  • 感知数据传输开销 (Perception Data Overhead):
    • AI 决策的前提是 感知 (Perception),即需要不断地从游戏世界中获取大量状态数据(World State)。
    • 将这些数据打包 (Packaging)、序列化 (Serialization)、通过网络传输到 AI 服务器,再反序列化,这个过程本身会产生巨大的性能开销。
    • 在分布式 AI 服务器架构中,可能还需要将同一份数据传输给多个服务器,进一步加大了开销。

权衡与结论

这种架构是否值得,取决于一个关键的 平衡 (Balance)只有当 AI 计算本身的复杂度足够高 (computationally expensive),其带来的好处才能超过感知数据的传输开销。

讲师个人非常推崇这种架构,因为它代表了未来复杂虚拟世界的一种高度解耦和鲁棒的实现方式。


二、 分层任务网络 (Hierarchical Task Network - HTN)

这是本次课程正式介绍的第一个高级 AI 技术。

1. 从行为树 (Behavior Tree) 的局限性谈起

为了理解 HTN 的价值,我们首先要回顾一下应用广泛的 行为树 (Behavior Tree)

  • 核心观点: 行为树本质上是一种 反应式机器 (Reaction Machine)。它非常擅长根据外部世界的刺激,执行一系列预先设定好的条件反射动作。
  • 类比: 像巴甫洛夫的狗,听到铃声就流口水。AI 看到敌人就开火,血量低就找掩体。它是在“反应”,而不是在“思考”。
  • 痛点: 行为树缺乏对高层级 主观意图 (Consciousness/Intent) 的直接表达。
    • 设计师在构建行为树时,脑中通常有一个宏观目标(例如,“让这个精英怪成为战场上最强的威胁”)。
    • 但在实现时,这个目标被拆解成了一系列离散的 SelectorSequencer 节点,宏观意图变得模糊。
    • 开发者常常需要通过注释或节点分组的方式,来手动标注“这棵子树是为了实现XX目标”,这说明行为树本身在表达“意图”方面存在局限。

2. HTN 的核心思想:从目标出发的规划

HTN 从一个完全不同的角度来解决问题,它更关注 AI 的“意图”。

  • 核心观点: HTN 是一种 基于规划 (Planning-based) 的方法。它从一个高层级的 任务/目标 (Task/Goal) 出发,通过 分解 (Decomposition) 的方式,将其层层拆解为一系列更小的子任务,直到最底层可以被直接执行的具体动作。
  • 关键术语:
    • 分层任务网络 (Hierarchical Task Network - HTN)
    • 任务 (Task): AI 需要完成的目标。
    • 分解 (Decomposition): 将一个复杂的任务拆解成多个简单的子任务或可选方案的过程。
  • 经典类比: 人的计划过程。
    • 顶层任务: “学习一门课程”。
    • 第一层分解:
      1. 准备学习资料
      2. 到教室上课
      3. 课后复习与问答
    • 第二层分解: “准备学习资料”这个子任务,又可以被分解为多个 可选方法 (Methods)
      • 方法A: 去图书馆查阅书籍
      • 方法B: 上网搜索相关论文和视频
  • 优势: 这种自顶向下的规划方式非常符合人类的思维直觉,使得 AI 的行为设计更具逻辑性、目的性和可解释性。许多知名游戏,如《地平线》(Horizon) 系列、《黑暗之魂》(Dark Souls) 都应用了 HTN 架构。

3. HTN 框架的基本构成(初步介绍)

一个基础的 HTN 框架通常包含以下几个部分:

  • 世界状态 (World State): 用于描述当前世界状况的数据集合。例如,玩家位置、敌人数量、自身血量等。
  • 感知器 (Sensors): 负责从游戏世界中收集信息,并更新 World State 的模块。这与我们之前课程中提到的 Perception 系统概念类似。

重要提示: 讲师特别指出,这些术语(尤其是 World State)的定义在不同文献或实现中可能存在歧义,容易让初学者产生困惑。例如, World State 并不一定是对客观世界的完全真实克隆,它更像是 AI 对世界的一个“认知快照”。后续课程会对此进行更深入的探讨。


HTN 核心架构与任务类型

一、 HTN 核心概念辨析

讲座的这一部分首先澄清了 HTN (Hierarchical Task Network) 架构中两个容易混淆的核心概念: World StateSensor。正确理解这两者是掌握 HTN 的基础。

1. 世界状态 (World State)

  • 核心观点: World State 并非对客观物理世界的真实、完整描述,而是 AI Agent 大脑中对世界的主观认知。它只包含 AI 决策所需要的关键信息和状态提炼。
  • 关键类比: 这类似于哲学中的“主观唯心主义”,即世界是基于“我”的认知构建的。AI 的所有决策都基于它自己“认为”的世界是怎样的,而不是世界“实际”是怎样的。
  • 常见误区: 初学者容易将其误解为游戏世界引擎的全局状态(如所有敌人的精确位置、关卡进度等)。必须明确,它是 AI 内部的一个主观数据副本。

2. 传感器 (Sensor)

  • 核心观点: Sensor 扮演着 感知 (Perception) 的角色。它的唯一职责是从真实的游戏环境中抓取信息,用以 更新和维护 AI 内部的 World State
  • 关系: Sensor 是连接客观世界和 AI 主观认知的桥梁。真实世界 -> Sensor (感知) -> World State (更新认知)

二、 HTN 整体执行框架

在理解了基本概念后,讲座介绍了 HTN 的高层执行流程,它由几个关键组件协同工作。

  1. HTN 领域 (Domain):

    • 这是一个知识库,包含了所有预先定义好的、呈树状层次结构的 任务 (Task) 及其关联关系。
  2. 规划器 (Planner):

    • 当 AI 需要执行一个高层目标(一个顶层 Task)时, Planner 会介入。
    • 它会根据 当前的 World State,在 Domain 中搜索并分解任务,最终生成一个由一系列具体步骤组成的 计划 (Plan)
  3. 计划执行器 (Plan Runner):

    • 负责 依次执行 Planner 生成的计划中的每一个 Task
    • 关键特性: Plan Runner 会在执行过程中持续监控任务状态和 World State 的变化。现实世界是动态的,计划执行可能随时失败(例如,AI 血量突然降低,无法完成原定攻击任务)。
  4. 重规划 (Replan):

    • Plan Runner 检测到当前计划无法继续执行时(例如,前置条件不再满足或任务执行失败),它会触发重规划机制。系统会回到 Planner 阶段,根据最新的 World State 重新生成一个更合适的新计划。

三、 HTN 的任务类型 (Task Types)

HTN 的“层级 (Hierarchical)”特性体现在其任务定义上。任务被分为两种基本类型。

1. 原子任务 (Primitive Task)

原子任务是 HTN 中最底层的、不可再分的执行单元,通常对应一个具体的动作。

  • 核心构成三要素:

    1. 动作 (Action): 任务要执行的具体逻辑,可以是一个脚本或函数调用。
    2. 前置条件 (Precondition):
      • 一个或多个必须在 World State 中得到满足的条件。
      • 这是对 World State“读”操作。只有满足条件,动作才能被执行。
    3. 效果 (Effect):
      • 当动作成功执行后,对 World State 进行的修改。
      • 这是对 World State“写”操作,体现了动作对世界的影响。
  • 示例: 使用解毒剂

    • Action: UseAntidote()
    • Precondition: WorldState.HasAntidote > 0 (我的认知里,我至少有一瓶解毒剂)
    • Effect: WorldState.IsPoisoned = false, WorldState.HasAntidote -= 1 (我的认知更新为:中毒状态解除,且解毒剂数量减一)

2. 复合任务 (Compound Task)

复合任务是 HTN 的精髓所在,它不代表一个具体动作,而是代表一个高层级的目标,并定义了多种达成该目标的方法。

  • 核心结构: 一个复合任务由一个或多个 方法 (Method) 构成。

    • 方法 (Method): 代表一种完成该复合任务的具体方案或策略
    • 优先级 (Priority): 这些 Method 是有序排列的,排在前面的具有更高的优先级。
  • 执行逻辑与行为树 (Behavior Tree) 的类比:

    • 方法选择 ≈ Selector (选择节点):

      • 系统会按优先级顺序检查每个 Method 的前置条件。
      • 一旦找到第一个满足条件的 Method,就会选择该方法,并忽略后续的其他方法。
      • 如果所有 Method 的前置条件都不满足,则该复合任务失败。
      • 这与行为树中的 Selector 节点 (或称“或”节点)逻辑高度相似。
    • 方法内部 ≈ Sequencer (顺序节点):

      • 每个 Method 内部包含一个 有序的任务列表 (Task List),这些子任务可以是原子任务,也可以是其他复合任务。
      • 系统必须严格按照顺序成功执行完这个列表中的所有子任务,该 Method 才算成功。
      • 这与行为树中的 Sequencer 节点 (或称“与”节点)逻辑高度相似。
  • 核心总结: 理解复合任务的关键在于将其看作是行为树中两种核心节点的组合。

    复合任务 (Compound Task) ≈ Selector (用于在多种方法间选择) + Sequencer (用于执行选定方法内的任务序列)

通过这种类比,可以极大地简化对 HTN 复杂概念的理解。


HTN 核心概念与规划流程

在这一部分,我们深入探讨了构成 HTN 的两大核心组件,并通过与行为树(Behavior Tree)的类比,理解其设计哲学。同时,我们初步接触了 HTN 的核心—— 规划(Planning) 过程。

一、HTN 的两大核心构建块

HTN 的领域知识(Domain)由两种类型的任务构成,它们像乐高积木一样,可以组合构建出复杂的 AI 行为。

1. Compound Task (复合任务)
  • 核心观点: 复合任务代表一个 高层级的、抽象的目标或意图,例如“治好中毒状态”或“击败敌人”。它本身不能被直接执行,而是需要被分解成更具体的子任务。
  • 关键构成:
    • Methods (方法): 一个复合任务包含一个或多个 Methods。每个 Method 代表一种达成该目标的可行策略或方案。这些方法通常按优先级排列。
      • 示例: 对于“治好中毒状态”这个复合任务,可以有三个 Methods:[优先] 1. 制造解药;2. 购买解药;[最后] 3. 使用背包里已有的解药。
    • Task List (任务列表): 每个 Method 内部包含一个有序的子任务列表。AI 必须按顺序完成这个列表中的所有任务,才能算成功执行了该 Method。
      • 示例: “制造解药”这个 Method 的任务列表可能是:1. 检查材料是否足够;2. 减少材料;3. 增加解药数量。
2. Primitive Task (原子任务)
  • 核心观点: 原子任务是 AI 可以直接执行的具体动作,是行为树的“叶子节点”。例如“移动到商店”、“播放攻击动画”、“减少生命值”。
  • 关键构成:
    • Operator (操作): 原子任务在底层真正执行的逻辑或函数。
    • Preconditions (前置条件): 执行该任务前,世界状态(World State)必须满足的条件。例如,“购买解药”的前置条件是“玩家在商店范围内”且“金钱足够”。
    • Effects (效果): 任务成功执行后,对世界状态产生的改变。例如,“购买解药”的效果是“玩家金钱减少”且“解药数量+1”。

二、与行为树 (Behavior Tree) 的类比:一种更直观的封装

讲座中提到,HTN 的设计可以看作是对行为树中一些核心概念的高级封装,这使得它对策划和设计师更加友好。

  • Compound Task 的 Methods 列表 ≈ BT 的 Selector (选择节点): AI 会按优先级依次尝试复合任务中的每一种 Method,直到找到一个前置条件满足、可以被分解执行的方案为止。这与 Selector 节点“依次尝试子节点直到一个成功”的行为非常相似。

  • Method 内的 Task List ≈ BT 的 Sequencer (顺序节点): 一旦选定了某个 Method,AI 必须严格按照顺序完成其内部的所有子任务。只要有一个子任务失败,整个 Method 就宣告失败。这与 Sequencer 节点“依次执行所有子节点,一败则败”的行为完全一致。

  • 核心优势: HTN 将这些逻辑打包成“目标-方法-步骤”的直观结构,设计师无需记忆和理解 SelectorSequencer 等抽象术语,而是可以更自然地从高级意图出发,层层分解,设计 AI 行为。

三、Root Task: AI 行为的入口

  • 核心观点: Root Task 是一个特殊的复合任务,作为整个 HTN 规划器的起始点。它定义了一个 AI 角色的最高层级行为逻辑。
  • 作用: 它通常包含了该 AI 最核心的几种行为模式,并用优先级定义了其决策的倾向。
    • 示例: 一个精英怪的 Root Task 可能包含以下 Methods:
      1. [最高优先级] 求生 (如中毒或低血量时,优先解毒/回血)
      2. [次高优先级] 攻击 (当有敌人在附近时)
      3. [最低优先级] 巡逻 (当无事可做时)

四、HTN 的规划 (Planning) 过程

这是 HTN 的灵魂所在。规划过程的目标是根据当前的世界状态,从 Root Task 出发,寻找一条能够最终达成目标的、由原子任务组成的 完整行动序列(即 Plan)

关键机制:在“草稿纸”上推演 (Simulating on a "Scratchpad")
  • 核心问题: 在规划阶段,一个任务的 效果(Effect) 往往是下一个任务的 前置条件(Precondition)。如果不在规划时就预知这些变化,规划将无法进行。
  • 解决方案: HTN 规划器并不直接在真实世界状态上进行推演。它会:
    1. 创建当前世界状态的一个副本(Copy),可以理解为一张“草稿纸”或一个“大脑沙盒”。

    2. 在分解任务、选择路径时,每当一个原子任务被加入到预备计划中,规划器就会将该任务的 效果(Effects) 应用到这个状态副本上。

    3. 后续任务的 前置条件(Preconditions) 检查,都是基于这个被修改过的状态副本来进行的。

    • 示例: 规划“购买解药 使用解药”时:
      1. 规划器在“草稿纸”上模拟“购买解药”的成功。
      2. 在“草稿纸”上,解药数量 增加了 1。
      3. 接着,规划器检查“使用解药”的前置条件 解药数量 > 0。因为“草稿纸”上的数量已经更新,该条件满足,所以这条规划路径是有效的。
一个重要的假设:规划时默认所有行动都会成功
  • 核心观点: 在生成计划的整个过程中,规划器有一个理想化的假设:所有被选中的原子任务在未来执行时都会成功
  • 引出的问题: 现实世界中,行动可能会失败(例如,攻击被闪避)。这个理想化的假设是规划阶段的简化,而如何处理执行阶段的失败,是 HTN 系统需要解决的另一个重要问题(讲座在此处留下了悬念)。

HTN 规划与执行核心机制

1. HTN 规划过程:从理想到现实

HTN 的核心在于其规划能力。这个过程从一个理想化的假设开始,逐步处理现实世界中的复杂性。

1.1 核心前提:规划时的“成功假设”

在构建计划的初期,HTN Planner 采用了一种乐观的策略: 它会假设所有选择的动作(Task)都能够成功执行

  • 工作流程:规划器在分解一个复合任务(Compound Task)时,会选择一个方法(Method)。为了验证这个方法的可行性,它需要满足一系列前置条件(Precondition)。如果某个前置条件不满足(例如,UsePotion 前提是 HasPotion == true,但当前为 false),规划器会尝试寻找能够满足该条件的子任务(例如,BuyPotion)。
  • 成功假设的意义:通过假设 BuyPotion 会成功,规划器就可以将 BuyPotionUsePotion 串联起来,形成一个初步的计划。这种“向前看”的策略是构建长链条复杂行为的基础。
  • 关键术语成功假设 (Success Assumption)
1.2 处理规划失败:回溯与默认任务

当然,规划并非总是一帆风顺。当一个任务的前置条件在任何情况下都无法被满足时,规划就会失败。

  • 回溯机制 (Backtracking)

    1. 当一个子任务无法找到任何可行的方法来满足其前置条件时(例如,NPC 没钱也无法传送,导致 BuyPotion 任务失败),该任务会返回一个失败信号。
    2. 这个失败信号会向上传递给它的父任务。
    3. 父任务接收到失败信号后,会放弃当前的方法(Method),并尝试它的下一个备选方法
    4. 如果一个复合任务的所有方法都尝试失败,它就会彻底失败,并将失败信号继续向上传递,直到根任务(Root Task)。
  • 关键设计原则:鲁棒的默认任务 (Robust Default Task)

    • 问题:如果所有规划路径都因世界状态不满足而失败,AI 会怎么办?它会无事可做,像“木头人”一样傻站着,这在游戏中是不可接受的。
    • 解决方案:设计师必须在任务网络中设置一个或多个高鲁棒性的默认任务。这些任务的前置条件非常容易满足,或者根本没有前置条件。
    • 示例Default_Idle(原地待机、挥手、打招呼)、Wander(随机巡逻)等。这确保了 AI 即使在“迷茫”时,也总有事可做,保证了系统的健壮性。
1.3 规划的最终产物:原子任务序列

当 HTN 规划器成功遍历任务树并找到一条完整的、可行的路径后,它最终会输出一个线性的任务序列

  • 构成:这个最终序列 只包含原子任务 (Primitive Tasks),即那些可以直接执行的具体动作。
  • 交付:这个序列会被交给 计划执行者 (Plan Runner),由它来在游戏世界中逐一执行这些原子任务。
  • 示例:对于“解毒”这个目标,最终生成的计划可能是 [GoToShop, InteractWithNPC, BuyPotion, UsePotion] 这样一个清晰的动作列表。

2. 计划执行:在混沌世界中求生

计划制定好了,但执行过程充满了变数。

2.1 挑战:动态与混沌的游戏世界

游戏世界是一个高度动态的 混沌系统 (Chaotic System)

  • 多方博弈:玩家、其他 AI 的行为都是对世界的持续输入,这使得世界状态变得复杂且难以预测(讲者类比为“三体问题”)。
  • 计划失效:一个在规划时看起来完美的计划,在执行过程中可能因为世界状态的改变而突然失败。例如,当 AI 正在跑向商店时,商店被敌人摧毁了。
2.2 核心机制:重新规划 (Replanning)

为了应对动态世界的挑战,HTN 引入了至关重要的 重新规划 (Replanning) 机制。这是衡量一个 HTN 系统好坏的关键。当计划无法继续时,AI 不会“死机”,而是会尝试制定一个新计划。

  • 触发重新规划的条件
    1. 无计划:AI 当前没有任何计划。
    2. 计划已完成:当前的计划已经成功执行完毕。
    3. 计划执行失败:当前正在执行的某个原子任务失败了。
    4. 世界状态发生重大变化:这是一个非常重要的触发器。即使当前计划仍在顺利执行,但如果外部环境发生了重大变化(例如,原本要夺取 A 点,但 A 点突然失守),导致当前计划的宏观目标失去了意义,AI 也应该主动放弃当前计划,进行重新规划,以适应新的“大局”。

3. HTN vs. 行为树 (BT):效率的飞跃

HTN 在设计理念和执行效率上,相比于传统的行为树有显著优势。

  • 行为树 (BT) 的痛点

    • 每帧从根节点遍历 (Per-Tick Traversal):BT 的工作模式是 每一帧 (Tick) 都要从根节点开始完整地遍历一次整棵树,来决定当前应该执行哪个动作。
    • 巨大的性能浪费:在绝大多数情况下,AI 的状态和决策在连续的几帧内是不会改变的。这意味着 90% 以上的遍历都是在重复计算,最终停留在和上一帧相同的行为节点上。讲者提到,根据他们的经验,这种遍历可能 消耗掉 AI 计算预算的 70%-80%
  • HTN 的优势

    • 一次规划,持续执行:HTN 首先花费一次计算成本生成一个完整的计划序列。
    • 事件驱动的重新规划:在计划执行期间,它不需要每帧都去重新评估整个任务网络。它只是简单地执行序列中的下一个任务。只有当遇到上述提到的“重新规划触发器”(如任务失败或世界变化)时,才会再次启动昂贵的规划流程。
    • 结论:HTN 通过将“决策/规划”和“执行”分离,避免了 BT 的每帧遍历开销,从而在性能上获得了巨大提升。

从 HTN 的局限到 GOAP 的引入

在深入探讨了分层任务网络(HTN)之后,本次讲座将首先总结 HTN 在实践中遇到的挑战,然后引出一个在业界同样影响力巨大的 AI 规划技术—— 基于目标的动作规划(Goal Oriented Action Planning, GOAP)


一、HTN 的局限与反思

虽然 HTN 相比行为树(Behavior Tree)在规划上更智能,只在世界状态变化或任务失败时才重新计算,避免了每 Tick 遍历的巨大开销。但它依然存在一些固有的设计和行为上的挑战。

1. 规划过程的性能开销

  • 核心观点: 即使 HTN 不会每帧都重新规划,但其 规划过程(即遍历任务网络、寻找可行计划)本身非常耗时
  • 血泪教训: 在实际引擎开发中,单次完整的 HTN 规划过程可能会消耗掉一个 Tick 中 70% - 80% 的 AI 计算预算。这使得它在需要频繁重新规划的复杂场景下,性能瓶颈非常突出。

2. 设计的复杂性与脆弱性

  • 核心观点: HTN 的强大依赖于设计师对任务的 前置条件(Precondition)效果(Effect) 的精确定义。这种依赖形成了一条脆弱的逻辑链路
  • 关键术语: 逻辑链路 (Logical Link)
    • 指的是前一个任务的 Effect 必须精确地满足后续某个任务的 Precondition,从而使整个计划得以成立。
  • 常见陷阱:
    • 当任务库变得庞大(几十上百个原子任务)时,设计师极易出错。
    • 一个常见的错误是忘记为一个原子任务添加 Effect。这会导致 AI 在规划时,虽然逻辑上我们期望它执行后续任务,但由于世界状态未按预期改变,后续任务的 Precondition 永远无法满足,导致规划失败或行为异常。
    • 这类问题难以调试,需要静态检查工具来辅助设计师在开发阶段就发现逻辑断层。

3. 不确定环境下的行为震荡

  • 核心观点: 在一个 高度不确定、环境频繁变化 的游戏世界中,过于长远和缜密的 HTN 计划反而会导致 AI 行为看起来不稳定和摇摆不定
  • 生动比喻:
    • 想象一个非常勤奋的人,他总是花一整晚制定未来一年的详细计划。
    • 但由于外界环境总在变,他的计划执行不到一周就失效了,被迫重新制定新的一年计划。
    • 从他个人角度,他一直在努力规划。但从旁观者角度,他今天想当健身冠军,明天想当游泳冠军,行为看起来非常不靠谱和怪异
  • 关键术语: 行为震荡 (Behavioral Oscillation) / 不稳定性 (Instability)
    • AI 因为环境的微小变化而频繁地放弃当前长远计划,转而去生成一个全新的、可能目标完全不同的计划,使得其行为缺乏连贯性。

二、GOAP - 基于目标的动作规划 (Goal Oriented Action Planning)

讲完了 HTN 的痛点,我们引入一个解决思路完全不同的强大框架:GOAP。

1. 什么是 GOAP?

  • 核心观点: GOAP 是一种将 AI 决策问题转化为 经典规划问题 (Planning Problem) 的技术。它不再依赖设计师预先编排好的任务树,而是让 AI 自行寻找一系列动作来达成一个明确定义的目标。
  • 关键术语: 规划 (Planning)
    • 这里的“规划”并非日常计划,而是特指计算机科学中的一个经典难题,与 动态规划 (Dynamic Programming) 息息相关。这是一个 NP-hard 问题,意味着寻找最优解的计算复杂度非常高。
  • 业界应用: GOAP 已经被许多顶级大作成功应用,证明了其在复杂场景下的有效性。
    • 例如:《古墓丽影》(Tomb Raider) 系列、《刺客信条:奥德赛》(Assassin's Creed Odyssey)。
  • 主要优势:
    • 能产生更 动态、更具环境适应性 的 AI 行为。
    • 减轻了设计师的工作负担,不需要手动梳理复杂的行为树或任务网络。

2. GOAP vs. HTN - 异同对比

从系统架构图来看,GOAP 和 HTN 惊人地相似,堪称“同门师兄弟”。它们都有对世界的感知(Sensor)、内部世界状态(World State)和计划执行器(Plan Runner)。

  • 核心区别: 两者最本质的区别在于中间的决策核心。
    • HTN: 核心是 任务领域 (Domain),一个由复合任务和原子任务构成的层级结构。
    • GOAP: 核心由 目标集 (Goal Set)动作集 (Action Set) 构成。

3. GOAP 的核心三要素

  1. 目标集 (Goal Set): AI 所有可能达成的目标的集合。
  2. 动作集 (Action Set): AI 所有可以执行的原子动作的集合(类似于 HTN 的 Primitive Task)。
  3. 规划问题 (The Planning Problem): 这是 GOAP 的灵魂。算法需要解决的问题是: “如何从动作集中规划出一个动作序列,来最终达成目标集中某个目标所定义的世界状态?”

4. 深入解析:目标集 (Goal Set) 的定义

GOAP 与行为树、HTN 最根本的分野,在于它如何定义“目标”。

  • 相似之处:

    • 优先级 (Priority): 目标集中的目标像 HTN 的复合任务一样,可以设置优先级。AI 会优先尝试达成优先级最高的目标。
    • 前置条件 (Precondition): 每个目标可以有关联的触发条件。例如,“解毒”这个目标的 Precondition 是“自身中毒状态为 True”,这使得它在中毒时优先级会高于“击杀敌人”。
  • 本质区别:目标的量化与显式定义

    • 核心观点: 在 GOAP 中,一个 目标 (Goal) 不再是注释里的一个模糊概念,而是被 严格地、定量地定义为一系列期望达成的世界状态 (World State) 的集合
    • 举例:
      • “存活”这个目标可能被定义为:{ isAlive: true, isPoisoned: false }
      • “击杀敌人”这个目标可能被定义为:{ enemyHealth: 0 }
    • 实现方式: 通常为了简化计算,这些状态会用 布尔值 (Boolean) 来表达。虽然也可以用更复杂的数值比较,但这会显著增加规划算法的复杂度。
    • 对比 HTN/行为树: 在后两者中,目标通常是 隐含 (Implicit) 在树状结构中的(例如,树的某个分支就是为了“寻找掩体”),其意图往往只存在于设计师的脑海里或代码注释中。而 GOAP 将目标 显式化 (Explicit),使其成为可被算法直接理解和计算的数据。

深入解析:目标导向行为规划 (GOAP)

在之前的AI决策模型(如行为树、HTN)中,AI的目标往往是隐含在树状或层级结构中的。而GOAP的核心区别在于,它将 目标 (Goal) 进行了显式和定量的定义,这为AI决策提供了更灵活和动态的规划能力。

一、 GOAP的核心思想:与传统AI的区别

  • 核心观点: GOAP的根本出发点是 显式定义目标。AI的行为不再是执行一个预设的脚本或遍历一棵固定的树,而是为了达成一个明确定义的世界状态而动态地寻找最优的行为序列。

  • 目标 (Goal) 的定义:

    • 它不是一个单一的状态,而是一个 期望达成的世界状态的集合 (a combination of states)
    • 例如,一个“生存”目标可能被定义为 {生命值 > 50%, 没有中毒, 附近没有敌人} 这样一个复合状态。
  • 与行为树/HTN的对比:

    • 行为树/HTN: 目标通常是 隐含的,体现在树的结构和节点的注释里。AI的行为路径在设计时已大体固定。
    • GOAP: 目标是 显式的、可量化的数据。AI需要通过一个规划过程(Planning)来动态生成达成目标的行为序列。

二、 GOAP的两大基石:目标 (Goal) 与 动作集 (Action Set)

1. 目标 (Goal)

如上所述,这是AI期望达到的最终世界状态的描述。例如:

  • 目标:解毒 世界状态变为 { isPoisoned: false }
  • 目标:逃跑 世界状态变为 { isSafe: true }
  • 目标:攻击 世界状态变为 { targetIsDead: true }
2. 动作集 (Action Set)

这是一系列AI可以执行的原子行为,与行为树中的“Primitive Task”非常相似,但增加了一个至关重要的元素: 成本 (Cost)

  • 每个Action包含三个核心部分:

    1. 前提条件 (Preconditions): 执行该动作前,世界必须满足的状态。例如,喝解药 的前提是 { 拥有解药: true }
    2. 效果 (Effects): 执行该动作后,对世界状态产生的改变。例如,喝解药 的效果是 { isPoisoned: false }
    3. 成本 (Cost): 执行该动作需要付出的代价。这是一个数值,用于在规划时评估不同行为路径的优劣。
  • 成本 (Cost) 的重要性:

    • 决策依据: 当有多个行为序列都能达成同一个目标时,GOAP会通过计算总成本来选择 成本最低 的那条路径。这本质上是一个 动态规划最短路径 问题。
    • 设计师的控制点: 设计师可以通过调整不同Action的Cost,来引导AI的行为倾向。例如:
      • 制造草药:Cost = 5 (便宜,但可能需要前置条件)
      • 去商店买药:Cost = 20 (昂贵,因为需要长途跋涉,且有风险)

三、 GOAP的规划算法:逆向思维的力量

  • 核心观点: GOAP最核心、最像人类思维的特点是它的规划方式—— 以终为始 (Start with the end in mind),也称为 逆向链式规划 (Backward Chaining)。它从最终目标出发,反向推导需要执行哪些动作。

  • 人类思维类比:

    • 目标: 10年后成为社会精英。
    • 逆向推导:
      1. 想成为精英 需要一份好工作。
      2. 想有好工作 需要读个好学校。
      3. 想读好学校 需要现在认真读书。
      4. 想认真读书 需要去图书馆。
    • 最终决策: 立刻放下游戏,去图书馆。
  • GOAP规划示例(中毒解毒):

    1. 最终目标 (Goal): { isPoisoned: false }
    2. 寻找能达成此效果的动作: 找到 喝解药 这个Action,因为它的 Effect{ isPoisoned: false }。于是,喝解药 成为计划的 最后一步
    3. 检查前提条件: 喝解药Precondition{ 拥有解药: true }。当前世界状态不满足此条件。
    4. 设定新子目标: { 拥有解药: true } 成为新的需要达成的 子目标
    5. 寻找能达成新子目标的动作: 找到 去商店买药,它的 Effect{ 拥有解药: true }。于是,去商店买药 成为计划的 倒数第二步
    6. 持续此过程: 直到所有动作的前提条件都在当前世界状态中得到满足,一条完整的行为链就规划好了。

四、 深入剖析:处理复杂状态的规划算法流程

这是GOAP系统中最复杂、也最容易出错的地方。当目标和动作都涉及多个状态时,规划过程需要一个严谨的算法来管理。

  • 核心机制: 维护一个 未满足状态堆栈 (Stack of Unsatisfied States),通过循环迭代来清空这个堆栈。

  • 算法步骤详解:

    1. 初始化:

      • 选定一个最高优先级的 目标 (Goal)
      • 目标 中所有 当前世界状态尚未满足 的 state,放入 “未满足状态堆栈”
    2. 进入规划循环 (直到堆栈为空):

      • 从堆栈顶部 取出 一个未满足的状态 (我们称之为 S_unmet)。
      • 动作集 (Action Set) 中搜索一个Action,其 效果 (Effect) 能够满足 S_unmet
    3. 找到合适的Action后:

      • 假设 我们将执行这个Action,因此 S_unmet 理论上已被满足。我们将这个Action加入到 最终计划序列 的前端。
      • 关键步骤: 检查这个Action自身的 前提条件 (Preconditions)
      • 对于该Action的每一个前提条件,如果它在 当前世界状态未被满足,则将其 压入“未满足状态堆栈”的顶部
    4. 循环与终止:

      • 算法返回第2步,处理堆栈中新的未满足状态。
      • “未满足状态堆栈” 被完全清空时,意味着我们已经为所有必需的中间状态都找到了解决方案。
      • 此时,我们得到的 计划序列 (Plan) 就是一个从当前状态通往最终目标的、可执行的动作链。

这个过程本质上是一个 深度优先的图搜索,通过不断将“动作的前提条件”作为新的“待解决的目标”,反向构建出一条完整的行为路径。


目标导向行为规划 (GOAP) 的实现与权衡

在上一部分的基础上,我们继续深入探讨目标导向行为规划(Goal-Oriented Action Planning, GOAP)的核心实现机制,并分析其在实际应用中的优缺点。

一、GOAP 核心规划思想:逆向规划与状态栈

GOAP 的规划过程并非从当前状态出发,而是从最终目标反向推导,这是一个 逆向规划(Backward Planning) 的过程。

  • 核心数据结构:未满足状态栈 (Stack of Unsatisfied States)

    • 算法维护一个栈,其中存放着所有为了达成最终目标(Goal)但尚未满足的 世界状态(World States)
    • 初始时,这个栈里包含了最终目标所需的所有状态。
  • 规划循环过程:

    1. 从栈顶取出一个未满足的状态(我们称之为子目标 A)。
    2. 在所有可用的 行为(Action) 库中,寻找一个其 效果(Effect) 能够满足子目标 A 的行为(我们称之为行为 X)。
    3. 关键步骤: 如果行为 X 本身有 前置条件(Precondition),比如前置条件 B,那么这个前置条件 B 就会被作为一个新的、需要被满足的子目标,被 压入(Push) 到未满足状态栈的顶部。
    4. 这个过程不断重复,直到状态栈被清空。
  • 最终目标:

    • 首要目标: 找到一个 行为序列(Action Sequence),当按顺序执行时,能够最终清空整个“未满足状态栈”,意味着达成了最初的宏大目标。
    • 次要目标(优化): 在所有能达成目标的可行行为序列中,寻找一个 总成本(Total Cost)最低 的序列。

这个寻找最优序列的过程,本质上是一个 动态规划(Dynamic Programming) 问题。

二、将规划问题转化为图搜索问题

直接进行动态规划的搜索空间极其巨大(如果每一步都有100种可能性,搜索树会呈指数级爆炸),这是一个典型的 NP-Hard 问题。因此,GOAP 的巧妙之处在于将这个规划问题转化为一个图搜索问题

  • 图的构建方式:
    • 节点 (Nodes): 状态的组合 (Combination of states)。这非常关键,图中的一个节点代表了世界在某一时刻的一组状态集合,而不是单一某个状态。
    • 边 (Edges): 行为 (Actions)。一条边代表一个 Action,它连接了两个不同的“状态组合”节点。
    • 边的权重 (Edge Weight): 行为的成本 (Cost of the action)
    • 搜索起点 (Start Node): 最终目标 (The Goal)。因为是逆向规划,所以我们从目标开始搜索。
    • 搜索终点 (End Node): 当前世界状态 (The Current World State)

通过这种方式,GOAP 将寻找最优行为序列的问题,成功转换为了在一个巨大的、由所有可能状态和行为构成的图中,寻找一条从“目标状态”到“当前状态”的最短路径问题。

三、使用 A* 算法求解

一旦问题被建模为图上的最短路径搜索,我们就可以使用经典的算法来求解。

  • 核心算法:A* 算法 (A-star)

    • A* 是一种高效的启发式搜索算法,非常适合解决这类问题。
    • 启发式函数 (Heuristic Function) 的设计: 在GOAP的A*实现中,启发式函数通常用于评估一个中间状态距离“当前世界状态”的远近。当面临多个分支选择时,算法会优先探索那个看起来离“当前状态”更近的分支。
  • A* 的“不完美”之美:

    • A* 算法在理论上能保证找到路径(如果存在),但其找到的路径不一定总是绝对的全局最优解
    • 在游戏 AI 设计中,这反而是一个优点。一个总是做出100%最优、最理性决策的 AI 会显得像一个冷酷的机器人。
    • 偶尔做出一些“合理但看起来有点笨拙”的次优决策,会让 AI 的行为显得更加 自然(Natural) 和生动,更像一个真实的生物。

四、GOAP 的优缺点分析

优点

  1. 目标与行为的解耦 (Decoupling of Goals and Actions)
    • 这是 GOAP 相比于有限状态机(FSM)、行为树(Behavior Tree)甚至分层任务网络(HTN)最核心的优势。设计师只需定义目标和一系列原子行为,而不需要手动编排它们之间的复杂逻辑。
  2. 动态与涌现行为 (Dynamic & Emergent Behavior)
    • 由于 AI 是在运行时根据当前世界状态动态规划路径的,即使目标相同,在不同的环境下,其行为序列也可能完全不同。
    • 这使得 AI 能够产生 超越设计师预期的“涌现行为”,表现出惊人的适应性和“智能感”。

缺点与挑战

  1. 计算开销大 (High Computational Cost)
    • 这是 GOAP 最显著的缺点。在运行时动态构建状态图并执行 A* 搜索,其计算量远大于预设逻辑的 BT 或 HTN,对性能是-个严峻的考验。
  2. 世界状态的量化难题 (Difficulty of World State Quantization)
    • GOAP 的有效运作依赖于将整个复杂的游戏世界抽象并量化为一系列精确的、通常是 布尔值(True/False) 的状态。
    • 对于状态相对简单的游戏(如:敌人是否残血、自己是否中毒),这套方法行之有效。
    • 但对于极其复杂、多维度博弈的游戏(如:即时战略游戏 RTS),将战场局势完整地用一组布尔值来描述几乎是不可能的任务。

五、适用场景

基于以上优缺点,GOAP 更适用于:

  • 单机、流程驱动型 的游戏。
  • 游戏世界状态 相对确定、易于量化 的场景。
  • 需要 AI 表现出高度动态性和适应性的场合。

承上启下:蒙特卡洛树搜索 (MCTS)

在探讨了 GOAP 这种经典的规划式 AI 之后,讲座将引入另一个“硬核”的经典游戏 AI 算法—— 蒙特卡洛树搜索 (Monte Carlo Tree Search, MCTS)。MCTS 在某些方面已经开始跨界,为我们后续理解基于机器学习的 AI 方法奠定了基础。


蒙特卡洛树搜索 (MCTS) 深入解析

一、 MCTS 概述:连接经典 AI 与机器学习的桥梁

本部分内容聚焦于一个在游戏 AI 领域极为重要且强大的算法—— 蒙特卡洛树搜索 (Monte Carlo Tree Search, MCTS)

  • 核心观点: MCTS 是一种决策算法,它巧妙地结合了随机模拟的精确性和树状搜索的策略性。它并非纯粹的传统 AI(如暴力搜索),也非纯粹的机器学习,而是介于两者之间,为解决超大搜索空间问题提供了一种极其有效的思路。

  • 关键定位: MCTS 是理解现代复杂游戏 AI(如 AlphaGo)的基石。

二、 核心应用案例:从 AlphaGo 到《全面战争》

MCTS 的强大之处在于它能处理那些传统方法难以解决的、具有天文数字般可能性的复杂决策问题。

  • AlphaGo (围棋):

    • 问题: 围棋的 搜索空间 (Search Space) 极其庞大,约为 ,远超宇宙中原子的数量(约 )。这使得暴力搜索(Brute-force)完全不可行。
    • MCTS 的作用: AlphaGo 的核心算法之一就是 MCTS。它通过模拟未来的无数种对局走势,来评估当前每一步棋的优劣,最终击败了所有人类顶尖棋手。
  • 《全面战争》(Total War) 系列:

    • 问题: 作为一个大型回合制策略游戏 (Turn-based Strategy),电脑 AI 需要在宏观战略地图上做出复杂的决策(如军队调动、城市建设、外交策略等)。
    • MCTS 的作用: 游戏 AI 利用 MCTS 来推演不同策略(如进攻、防守、发展)可能带来的长期结果,从而选择一个胜率最高的宏观策略。

三、 MCTS 的核心思想:模拟人类思维的决策过程

MCTS 的工作方式在哲学上与人类高手进行决策时的思考过程非常相似。

  • 核心观点: 当面临一个决策点时,MCTS 并不试图计算出所有可能性的精确解。相反,它会在有限的时间内, 在脑海中(即内存中)快速推演成百上千种未来可能性,然后根据这些模拟的结果,选择一个综合来看最有希望获胜的下一步。

  • 类比人类下棋:

    • 普通人: 可能会思考对手接下来两三步的应对,然后大脑内存就不够用了。
    • MCTS/AI: 可以不知疲倦地模拟成千上万条对弈路径,并统计每条路径的胜负结果,从而做出远比人类更可靠的判断。
  • 关键技术: 其思想源泉是物理学家费米在研究核裂变时使用的 蒙特卡洛方法 (Monte Carlo Method),即利用 随机采样 (Random Sampling) 来估算复杂问题的近似解。

四、 将问题数学化:建模是第一步

要让计算机理解并执行 MCTS,首要任务是将现实世界的复杂问题(如下棋)抽象成一个计算机可以处理的数学模型。这是所有计算解决方案的基石。

  • 核心观点: 建模 (Modeling) 的能力,即将一个模糊的现实问题,表达成一个定量的、结构化的数学模型,是解决复杂系统问题的关键。

1. 核心概念定义

MCTS 的模型主要由两个基本元素构成: 状态 (State)动作 (Action)

  • 状态 (State)

    • 定义: 对当前局势的一个 完整快照 (Snapshot)
    • 举例 (围棋): 当前棋盘上所有黑子和白子的精确位置分布,就构成了一个独一无二的状态。
  • 动作 (Action)

    • 定义: 在一个给定的状态下,可以执行的具体操作
    • 举例 (围棋): 在当前状态下,轮到你下棋,你可以在棋盘的某个合法坐标点 (x, y) 落下一子,这个“落在 (x, y)” 就是一个动作。

2. 树结构的形成

当我们将状态和动作结合起来,一个树状的搜索结构就自然而然地形成了。

  • 节点 (Node): 每一个 状态 (State) 都可以被看作是树中的一个节点。
  • 边 (Edge): 从一个状态节点出发,执行一个 动作 (Action),会转移到一个新的状态,这个“动作”就构成了连接两个状态节点的边。

示例:

当前棋局是一个 状态 (根节点)

你有 5 种可能的落子选择,这就是 5 个不同的 动作 (边)

每一种落子选择都会导致一个新的棋局,这就是 5 个新的 状态 (子节点)

通过这种方式,整个游戏的未来可能性就被构建成了一棵巨大的 游戏树 (Game Tree)。MCTS 的任务,就是在我们无法遍历整棵树的情况下,如何智能地探索这棵树,找到通往胜利的最佳路径。


蒙特卡洛树搜索(MCTS)核心思想解析

本部分将深入探讨一种强大的决策算法—— 蒙特卡洛树搜索(Monte Carlo Tree Search, MCTS)。讲座以我们熟悉的围棋为例,生动地解释了 MCTS 如何在庞大的可能性空间中,通过模拟和评估来寻找最优解。这套思想不仅在游戏 AI 领域大放异彩,其核心逻辑在图形学等需要进行复杂决策和采样的领域同样具有借鉴意义。

1. 状态空间:将问题转化为一棵决策树

为了用算法解决问题,我们首先需要将问题进行数学建模。

  • 核心观点:任何具有明确规则的决策问题(如下棋),都可以被抽象成一个巨大的、由“状态”和“动作”连接而成的树状结构。

  • 关键术语

    • 状态 (State):对当前局面的一个快照。在围棋中,就是当前棋盘上所有棋子的布局。
    • 动作 (Action):在某个状态下可以执行的操作。在围棋中,就是在某个合规的 (x, y) 坐标上落子。
    • 状态空间 (State Space):所有可能状态的集合。讲座中特别强调,这些状态并非孤立存在,而是通过“动作”相互连接,形成一个有拓扑关系的树状结构。因此,一个更精确的描述是 AI 树状结构状态空间 (AI tree structured state space)
  • 面临的挑战

    • 理论上,如果我们拥有无限的算力和内存,就可以遍历这棵完整的“决策树”,找到对于任何确定性规则游戏的必胜策略
    • 现实中,这个状态空间的规模是天文数字,进行 全量搜索 (Full Search) 是完全不可能的。MCTS 正是为了解决这一问题而生。

2. MCTS 的基本工作流程

MCTS 的核心思想是, 不完全展开整棵树,而是通过有限次的“模拟”来评估最有潜力的分支,从而做出当前最优的决策。

  • 核心观点:经典的 MCTS 算法在每一步决策时,都以 当前状态为根节点 (Root),重新开始探索和构建一小部分决策树,以找出下一步的最佳“动作”。

  • 工作流程简化理解

    1. 当前局面是树的根节点
    2. 开始进行成千上万次的 模拟 (Simulation)
    3. 根据模拟结果,不断更新树中各个节点的评估数值。
    4. 模拟结束后,从根节点的直接子节点中,选择一个评估数值最高的,作为最终的下一步决策

注意:虽然讲座介绍的是每次都重新构建树的经典方法,但在前沿实践中,存在大量优化,例如在连续的决策步骤之间 复用 (Reuse) 上一步构建的树节点,以提高效率。

3. 核心机制一:模拟 (Simulation) 与评估

模拟是 MCTS 算法的灵魂,它负责为未知的决策路径提供一个快速的、带有一定随机性的评估结果。

模拟 (Simulation):快速“下完”一盘棋

  • 核心观点模拟是指从树中的某个节点出发,使用一种快速的、预设的策略(而非再次进行复杂的搜索)来迅速完成整个过程(例如下完一盘棋),并得出一个最终结果(赢或输)。

  • 关键术语

    • Default Policy (默认策略):这是执行快速模拟时所遵循的“操作手册”。它不是最优策略,但追求的是速度合理性
      • 例子:在围棋 AI 中,Default Policy 可以是:
        1. 一个预先录入的庞大棋谱库,根据当前局面直接查询下一步。
        2. 一个轻量级的、训练好的神经网络
        3. 一套简单的启发式规则。
    • 重要认知:单次模拟成功(例如赢了这局棋)不代表这个决策就一定好。它只是巨大可能性中的一条非常细小的路径。MCTS 的威力在于通过海量模拟,用统计学的方式找出最有可能导向胜利的路径。

量化评估:Q/N 值

为了衡量一个“动作”(即一个节点)的好坏,MCTS 在每个节点上都存储了两个至关重要的数值。

  • 核心观点:通过记录 胜利次数 (Q)总模拟次数 (N),我们可以定量地计算出从当前节点出发的“胜率”,从而评估其优劣。

  • 关键数值对 (Q/N Pair)

    • N (Visits):代表这个节点被访问(即作为模拟路径的一部分)的总次数。
    • Q (Quality/Wins):代表从这个节点出发的所有模拟中,最终取得胜利的总次数。
  • 核心评估公式: 一个节点(代表一个决策)的期望胜率可以通过以下公式简单估算:

    胜率 = Q / N

4. 核心机制二:反向传播 (Backpropagation)

一次模拟的结果,不能只影响被模拟的那个节点,它需要将“经验”反馈给它的所有父辈节点。

  • 核心观点:当一次模拟完成后,其结果(赢或输)会沿着模拟路径,从被模拟的节点开始,逐级向上更新所有父节点的 Q 值和 N 值,直到根节点。

  • 更新规则

    1. 路径上的每一个节点,其 N 值 都要 +1(因为这次模拟经过了它)。
    2. 如果模拟结果是胜利,则路径上每一个节点的 Q 值 +1
    3. 如果模拟结果是失败,则路径上每一个节点的 Q 值 +0(即不变)。
  • 作用:通过反向传播,根节点和它的子节点能够汇集其下所有分支的模拟信息。经过成千上万次模拟后,根节点的直接子节点们就会呈现出不同的 Q/N 值,哪个节点的胜率最高,就说明选择那一步在统计上最有利。

5. 最终决策:选择最优路径

经过大量模拟和反向传播后,决策树的根节点附近已经积累了丰富的统计信息。

  • 决策过程
    1. 假设我们执行了 1000 次模拟,根节点的 N 值就是 1000。
    2. 根节点的每个子节点(代表下一步所有可能的走法)都参与了不同次数的模拟,并拥有各自的 QN 值。
    3. 例如,选择A走法,模拟了 100 次,胜利了 70 次(Q=70, N=100, 胜率70%);选择B走法,模拟了 200 次,胜利了 120 次(Q=120, N=200, 胜率60%)。
    4. 算法会根据这些统计数据(通常是选择胜率最高的那个),做出最终的决策。

通过这种方式,MCTS 在巨大的、无法完全探索的决策空间中,智能地分配计算资源,集中探索更有希望的路径,最终找到一个当前看来最优的解决方案。


蒙特卡洛树搜索 (MCTS) 的核心循环与决策策略

在上一部分我们理解了如何通过大量模拟来评估一个游戏状态的优劣(即 Q/N 值)之后,现在我们将深入探讨 蒙特卡洛树搜索 (Monte Carlo Tree Search, MCTS) 的完整工作流程。MCTS 的精妙之处在于它如何智能地在近乎无限的搜索空间中,找到最有希望的路径。

一、 MCTS 的核心迭代步骤

MCTS 并非一次性完成搜索,而是一个持续迭代、不断优化决策树的过程。每一次迭代都包含以下四个核心步骤,形成一个闭环:

  1. 选择 (Selection):

    • 核心观点: 从根节点(当前状态)出发,根据一套预设的策略,选择一条最优路径,一直走到一个“有潜力”且“未被完全探索”的叶子节点。
    • 这个策略的关键在于平衡“探索”和“利用”,我们稍后会详细讲解。
  2. 扩展 (Expansion):

    • 核心观点: 当“选择”步骤到达一个未被完全探索的节点时,为其创建一个或多个新的子节点,代表新的一步棋或一种新的可能操作。这相当于在现有的搜索树上“长出”新的分支。
  3. 模拟 (Simulation):

    • 核心观点: 从这个新创建的子节点开始,进行一次 快速、随机的模拟 (也称为 Playout 或 Rollout),直到游戏结束。这个过程不追求最优解,只求快速得到一个胜/负/平的结果。
  4. 反向传播 (Backpropagation):

    • 核心观点: 将模拟得出的结果(赢了还是输了), 沿着“选择”阶段的路径一路返回至根节点,并更新路径上所有节点的统计数据。
    • 具体来说,就是更新每个节点的 Q 值 (获胜次数)和 N 值 (被访问/模拟次数)。

这个 选择 扩展 模拟 反向传播 的循环会不断重复,直到达到预设的计算时间或模拟次数上限。每一次循环都会让决策树向更有利的方向“生长”,使得 Q/N 值的评估越来越准确。

(图片来源: Wikimedia Commons)

二、 MCTS 的核心思想:探索 (Exploration) 与利用 (Exploitation) 的平衡

面对巨大的搜索空间(如围棋),我们不可能遍历所有可能性。因此,MCTS 必须智能地决定下一步要深入研究哪个分支。这里就引出了机器学习领域一个经典的两难问题:

  • 利用 (Exploitation):

    • 核心观点: 优先选择那些当前看来胜率最高的分支进行深入研究。这就像我们总是去自己最喜欢、最熟悉的餐厅吃饭,因为我们确定能获得满意的体验。
    • 对应数据: 选择 Q/N 值最高的节点。
  • 探索 (Exploration):

    • 核心观点: 优先选择那些被探索次数较少、充满未知可能性的分支。这就像我们冒险去尝试一家新开的餐厅,虽然可能“踩雷”,但也可能发现新的美食宝藏。
    • 对应数据: 选择 N 值较低的节点。

MCTS 的强大之处就在于它通过一个精妙的数学公式,在这两者之间取得了绝佳的平衡。 它既会倾向于挖掘已知最优解的潜力,又会给予未知领域足够的机会,防止因局部最优而错失全局最优解。

三、 决策算法:上置信界算法 (UCB)

为了实现上述的平衡,MCTS 在“选择”阶段采用了一种名为 上置信界 (Upper Confidence Bound, UCB) 的算法,特别是在树状结构中,它被称为 UCT (UCB applied to Trees)

核心思想

UCB 算法为每个节点计算一个分数,这个分数同时考虑了节点的 当前胜率(利用)被探索的稀少程度(探索)。选择阶段会始终选择 UCB 分数最高的子节点。

UCB 公式

对于一个节点 i,其 UCB 分数的计算公式如下:

公式解析:

  • (利用项): 这是节点 i平均胜率Q_i 是节点 i 的累计获胜次数,N_i 是节点 i 的总访问次数。这个值越高,说明这个分支的历史表现越好。

  • (探索项): 这是鼓励探索的部分。

    • 是其父节点的总访问次数
    • 当前节点的总访问次数
    • 很小(即该节点很少被访问)时,分母变小,整个探索项的值会变得很大,从而提升该节点的 UCB 分数,使其更有可能被选中。
    • 的存在保证了随着模拟总次数的增加,探索的权重会增长得比较缓慢,最终算法还是会收敛到利用。
  • (探索常数):

    • 这是一个可调节的超参数,被称为探索常数。它控制着“利用”和“探索”之间的平衡。
    • 值较大: 算法会更具“攻击性”和“好奇心”,倾向于** 探索**更多未知的节点。
    • 值较小: 算法会更加“保守”,倾向于** 利用**已知的、胜率较高的节点。
    • 在实际应用中,这个 C 值往往需要根据具体场景进行“炼丹”式的调优,是算法工程实践中的一个关键点。

四、 选择 (Selection) 阶段的具体流程

有了 UCB 算法,我们就可以明确“选择”阶段的完整流程了:

  1. 从根节点开始: 每一次新的 MCTS 迭代都必须从树的根节点(代表游戏的当前局面)开始。
  2. 计算子节点 UCB: 计算当前节点下所有子节点的 UCB 分数。
  3. 选择最优子节点: 选择 UCB 分数最高的那个子节点,并移动到该节点。
  4. 循环下降: 重复第 2 和第 3 步,不断地在树中向下移动。
  5. 到达终点: 这个过程一直持续,直到遇到一个 可扩展节点 (Expandable Node) 为止。所谓可扩展节点,指的是该节点代表的游戏状态,其所有可能的下一步操作(子节点)还没有被全部添加到决策树中。

一旦找到这个节点,"选择"阶段就结束了,接下来将进入"扩展"阶段,为这个节点添加新的子节点,并开启后续的模拟与反向传播。


MCTS 深入解析:从搜索循环到最终决策

本次笔记聚焦于蒙特卡洛树搜索(MCTS)算法的核心执行流程,并深入探讨了当搜索结束后,如何从众多可能性中选择最佳下一步的多种决策策略。

一、 MCTS 的核心循环:四大步骤

MCTS 的本质是一个迭代过程,通过不断模拟来构建和优化一棵搜索树,从而评估不同决策的优劣。每一次迭代都包含以下四个关键步骤:

  1. 选择 (Selection)

    • 核心观点: 从根节点(当前状态)出发, 利用 UCB1 (或 UCT) 公式,层层向下选择最有潜力的子节点,直到找到一个尚未被完全展开(fully expanded)的节点。
    • 关键术语:
      • UCB (Upper Confidence Bound, 上置信界): 一个关键公式,用于平衡 “利用”(Exploitation,选择当前已知最优的节点)“探索”(Exploration,尝试那些探索次数较少的节点)
      • 未完全展开的节点 (Not Fully Expanded Node): 指该节点仍有未被探索过的子节点(即可能的操作)。
    • 执行细节:
      • 算法总是从根节点开始新一轮的选择。
      • 在每一层,计算所有子节点的 UCB 值,并选择值最高的那个继续向下。
      • 这个过程被讲者比喻为一种 “动态数据上的广度优先搜索”,因为它每次都公平地从根节点开始比较第一层子节点,再深入下去。
      • 在像围棋这样巨大的状态空间中,几乎总能找到一个未被完全展开的节点,不必担心搜索会“卡住”。
  2. 扩展 (Expansion)

    • 核心观点: 当“选择”步骤找到一个可以扩展的节点后,为其添加一个或多个新的子节点,代表新的、未曾探索过的操作。
    • 执行细节:
      • 你可以选择一次只扩展一个子节点,也可以一次性扩展多个。
      • 一次只扩展一个可以使搜索树更加 平衡 (balanced),但可能需要更多的模拟次数来覆盖所有可能性。
  3. 模拟 (Simulation / Rollout)

    • 核心观点: 从新扩展的子节点开始, 进行一次快速、通常是随机的“快进”,直到游戏结束,得出一个胜/负/平的结果。
    • 执行细节:
      • 这一步是MCTS中“蒙特卡洛”思想的直接体现。
      • 模拟过程不追求最优策略,只求快速得到一个终局结果(例如,赢了记为 +1,输了记为 0 或 -1)。
  4. 反向传播 (Backpropagation)

    • 核心观点: 将模拟得到的结果, 从被扩展的节点开始,沿着路径一路传回根节点,更新路径上所有节点的统计数据
    • 关键术语:
      • Q 值 (Q-value): 节点的累计收益值(例如,总获胜次数)。
      • N 值 (N-value): 节点的 总访问/模拟次数
    • 执行细节:
      • 路径上的每个节点,其 Q 值 都会加上本次模拟的结果(如 +1)。
      • 路径上的每个节点,其 N 值 都会增加(在此例中是 +1,如果一次扩展多个并模拟,则会增加相应的次数)。
      • 通过不断迭代这四步,树中节点的 Q 值和 N 值会越来越准确地反映其真实价值。

二、 搜索终止与最终决策

MCTS 循环不能无限进行下去,必须在某个时刻停止并做出最终决策。

1. 终止条件
  • 核心观点: MCTS 的探索受限于 计算预算 (Computational Budget)
  • 常见的终止条件包括:
    • 内存限制: 搜索树变得过大,占满了分配的内存。
    • 时间限制: 例如,每一步棋的思考时间只有 1 秒。
    • 模拟次数限制: 规定总共执行的模拟次数上限,如 1000 次。
2. 最终决策策略
  • 核心观点: 当搜索停止后,我们需要根据根节点的第一层子节点的统计数据来决定走哪一步。这里没有唯一的标准答案,存在多种策略,甚至带有一些“玄学”成分。

以下是几种主流的决策策略:

  • 策略一:Max Child (最佳收益)

    • 选择标准: 选择 Q 值最高 的子节点。
    • 直观理解: 选择那条在模拟中带来总胜利次数最多的路径。
    • 潜在问题: 可能存在偏差。一个节点的 Q 值很高,可能是因为它被访问的次数(N 值)也很多,但其胜率(Q/N)不一定是最高的。
  • 策略二:Robust Child (最稳健/最受信赖)

    • 选择标准: 选择 N 值最高 (被访问次数最多)的子节点。
    • 直观理解: 选择那个在搜索过程中被 UCB 算法 最频繁认为是“有前途” 的节点。
    • 理论支撑: 因为 UCB 选择机制本身就倾向于探索有价值的节点,所以高 N 值本身就隐含了该节点的高质量和高可靠性(Robustness)。
  • 策略三:Max-Robust Child (成年人全都要)

    • 选择标准: 寻找一个 同时拥有最高 Q 值和最高 N 值 的节点。
    • 直观理解: 既要收益高,也要经过充分验证,是最理想的情况。
    • 实践挑战: 这样的完美节点可能不存在。一种“不讲道理”但有效的方法是:如果找不到,就 继续运行 MCTS,直到这样的节点出现。
  • 策略四:Secure Child (安全/折中选择)

    • 选择标准: 使用 LCB (Lower Confidence Bound, 下置信界) 公式来评估节点。
    • 核心思想: 这是对 UCB 思想的反向应用,旨在找到一个既有高胜率又足够可靠的选项。
    • LCB 公式示例:
    • 公式解读:
      • 第一项 是节点的实际胜率
      • 第二项是一个惩罚项。节点的访问次数 越少,这个惩罚项就越大,导致其 LCB 值越低。
      • 这巧妙地结合了 Max Child (关注胜率)Robust Child (关注访问次数) 的思想。
    • 玄学问题: 常数 C 的取值需要根据具体问题进行调整和实验,没有固定答案。

总结: 选择哪种决策策略取决于具体的应用场景和个人偏好。没有绝对的优劣,开发者可以根据实际效果进行测试和选择。


MCTS 实践应用与反思

这是 MCTS 系列讲座的最后一部分。本节内容不再深入算法细节,而是从一个更宏观和实践的角度,对 MCTS 进行了总结,并探讨了其在真实游戏项目中的适用场景与局限性。

1. UCB 公式的实践选择:没有银弹

讲座首先补充了一个关于 UCB(Upper Confidence Bound)公式的实践要点。

  • 核心观点: 在选择 UCB 的具体变种时,没有绝对的最优解,实践出真知
  • 关键术语:
    • max child: 倾向于选择当前评估最优的子节点,比较激进。
    • robust child: 倾向于选择被探索次数最多的子节点,比较稳健。
  • 实践方法:
    • 讲座中提到,一些实际应用(如 Secure-Child 变体)会将 max childrobust child 的思想结合起来,通过数学变换和权重调整,试图兼顾探索与利用。
    • 最终建议是,开发者应根据自己的项目需求和游戏特性, 亲自尝试不同的 UCB 变体,选择在特定场景下表现最好的那一个,无需拘泥于理论上的完美证明。

2. MCTS 算法的优缺点总结

MCTS 作为一个强大的决策框架,其优缺点都非常鲜明。

优点 (Pros)

  • 行为灵活生动 (Flexible & Dynamic Behavior): 由于算法内在的随机性,MCTS 驱动的 AI 行为不会显得死板,充满了不确定性和趣味性,让玩家感觉 AI 更“聪明”。
  • 超越设计的策略 (Emergent Strategies): AI 的决策是自主探索出来的,而非设计者硬编码的。这使得 AI 有可能发现人类设计师都未曾预料到的最优策略,最典型的例子就是 AlphaGo。
  • 解决复杂搜索空间 (Handles Vast Search Spaces): 对于拥有海量可能性的问题(如棋类游戏),MCTS 能够有效地进行搜索和决策。

缺点 (Cons)

  • 高计算复杂度 (High Computational Cost): MCTS 需要进行大量的模拟(Simulation/Rollout),计算开销非常大,对性能是巨大的考验。
  • 难以精确建模 (Difficult to Model):
    • 评估函数定义困难: 在很多复杂游戏中(如 MOBA),很难简单地用“赢”或“输”来评估一个中间状态的好坏。
    • 行为影响模糊: 很难精确定义一个动作(Action)对整个游戏世界产生的具体影响。

3. MCTS 的适用场景与局限性:一个从业者的视角

这是本节最核心的部分,讲座分享了关于 MCTS 在实际游戏开发中如何应用的深刻见解。

  • 核心论点: MCTS 不是万能的。它并非适用于所有游戏类型,生搬硬套往往效果不佳。关键在于“把每一种算法放到它合适的地方”。

MCTS 的最佳应用场景

MCTS 在满足以下两个条件的游戏或系统中有奇效:

  1. 回合制 (Turn-based): 游戏进程是离散的,一方行动完后另一方再行动,有清晰的轮次概念。
  2. 行为结果明确 (Clear & Predictable Outcomes): 每个动作执行后,对游戏状态的改变是可以精确计算或高度预估的。
  • 典型案例:
    • 棋类游戏: 完美符合上述条件。
    • 回合制战斗游戏: 我方释放一个技能,可以精确计算出对敌方造成的伤害、自身状态的变化等。
    • 大战略游戏(Grand Strategy)的策略层: 以《全面战争》系列为例,其大地图上的战略决策(如宣战、结盟、攻占城池)本质上是回合制的,每个决策的结果(如兵力损耗、外交关系变化)也相对容易估算。

真正的解决方案:混合式 AI 架构

对于更复杂的实时环境(如 MOBA、开放世界 ARPG),单纯使用 MCTS 是行不通的。正确的做法是将其作为 混合 AI 架构 中的一个模块。

  • 核心思想: 将 MCTS 定位为高层级的战略决策者,而将具体的战术执行交给其他更适合的 AI 技术。
  • 混合架构示例:
    • MCTS (顶层): 负责进行宏观的、长期的战略规划。例如,决定现在是应该去打团、推塔还是打野。
    • 行为树 (Behavior Tree, BT) / 分层任务网络 (HTN): 接收 MCTS 的战略指令,并将其分解为一系列具体的战术任务。例如,接收到“推塔”指令后,规划出“清兵线 攻击防御塔 注意敌方英雄位置”等一系列行为。
    • 有限状态机 (Finite State Machine, FSM): 在最底层,执行具体的原子动作。例如,控制角色移动、释放特定技能、进行普通攻击等。

通过这种分层协作的方式,可以充分发挥 MCTS 在战略规划上的优势,同时避免其在实时、微观控制上的短板,构建出强大而高效的 AI 系统。


机器学习基础

引言:本讲座的定位与核心

本部分内容是讲座中关于高级 AI 的核心章节,主要聚焦于 机器学习 (Machine Learning, ML) 的基础概念及其在游戏领域的应用。

  • 学习目标: 重点理解机器学习的基础结构与应用,而非深入复杂的数学理论。
  • 核心案例: 整个讨论将围绕 AlphaStar (Google DeepMind 开发的星际争霸 AI) 展开,通过这个业界顶级案例来理解 ML 如何在复杂的游戏场景中发挥作用。
  • 内容取舍: 讲师已对内容进行精简,删除了最晦涩的理论部分,旨在为游戏引擎开发者建立一个宏观且实用的认知框架。

机器学习的四大核心范式

机器学习是一个广阔的领域,通常可以根据学习方式的不同,划分为四个主要的范式。理解它们的区别是掌握 ML 的第一步。

1. 监督学习 (Supervised Learning)

  • 核心观点: 本质上是一个 分类器 (Classifier)回归器 (Regressor)。它通过学习带有明确答案的“标准答案”数据集来获得能力。
  • 工作原理:
    1. 提供带标签的数据: 人类预先为大量数据打上标签(例如,图片是否包含“猫”)。
    2. 模型训练: AI 系统学习这些数据,找出特征与标签之间的关联。
    3. 预测未知: 训练完成后,模型可以对从未见过的新数据进行分类或预测。
  • 游戏应用举例:
    • 识别玩家的游戏行为模式(例如,判断一个玩家是“进攻型”还是“防守型”)。
    • 预测玩家下一步可能购买的道具。
  • 关键术语: 数据标签 (Data Labels), 分类 (Classification), 回归 (Regression)

通俗类比: 就像学生备考,通过大量做带答案的练习题(训练数据),学会解题方法,最终能在正式考试中解答没有见过的新题目(预测)。

2. 无监督学习 (Unsupervised Learning)

  • 核心观点: 本质上是一种 聚类 (Clustering) 算法。它在没有“标准答案”的情况下,自主地从数据中发现隐藏的结构和规律。
  • 工作原理:
    1. 提供无标签的数据: AI 系统接收海量未经人工处理的原始数据。
    2. 发现模式: 系统自动分析数据,根据相似性将数据分成不同的群组(或“簇”)。
  • 游戏应用举例:
    • 用户画像 (User Profiling): 将数百万玩家根据其游戏时长、消费习惯、社交行为等数百个维度的特征,自动划分为不同的玩家群体(如“肝帝”、“氪金大佬”、“社交达人”等),以便进行精细化运营。
  • 关键术语: 聚类 (Clustering), 模式识别 (Pattern Recognition)

通俗类比: 给你一箱杂乱无章的乐高积木,你不需要任何说明书,就能自发地把相同颜色、相同形状的积木块归类到一起。

3. 半监督学习 (Semi-supervised Learning)

  • 核心观点: 介于监督学习和无监督学习之间,利用少量带标签的数据来引导对大量无标签数据的学习过程。
  • 工作原理: 相当于给无监督学习提供一些“小提示”或“种子”,让它在聚类的过程中有一个大致的方向。
  • 重要意义: 这是当前 AI 研究的热点领域,与 小样本学习 (Few-shot Learning) 概念密切相关。目标是让 AI 像人类一样,仅通过少数几个样本就能掌握一个新概念,这是迈向 强人工智能 (Strong AI) 的关键一步。
  • 游戏应用举例:
    • 在内容生成中,设计师只需提供几个风格化的范例,AI 就能自动生成大量符合该风格的关卡或美术资源。

通俗类比: 教一个孩子认识“老虎”。你不需要给他看一万张老虎照片,可能只需要指着动物园里的真老虎和绘本里的老虎各说一次,他就能在看《动物世界》时准确地认出老虎。

4. 强化学习 (Reinforcement Learning)

  • 核心观点: 这是本次讲座的重中之重。AI(称为 Agent)通过与环境的交互试错 (Trial and Error) 来学习,目标是最大化其获得的长期 奖励 (Reward)
  • 工作原理:
    • 没有监督者: 没有人直接告诉 AI 每一步应该怎么做。
    • 奖励函数 (Reward Function): 环境会根据 AI 的行为给予正向(奖励)或负向(惩罚)的反馈。
    • 学习策略 (Policy): AI 的目标是学习一套最优的行动 策略 (Policy),以期在整个过程中获得最大的累计奖励。
  • 关键挑战:延迟奖励 (Delayed Reward)
    • 这是强化学习中最经典也最困难的问题之一。一个行为的真正结果(奖励或惩罚)可能在很久之后才会显现。
    • 经典例子:老鼠走迷宫
      • 目标: 老鼠(Agent)要找到迷宫终点的奶酪(高额正奖励)。
      • 挑战: 在迷宫的每一个路口做出的选择(向左、向右),并不会立即得到奖励。只有当它最终吃到奶酪或掉入陷阱(高额负奖励)时,反馈才会出现。
      • 学习难点: AI 如何判断在最初的某个路口向左走,是导致最终成功或失败的关键?它需要将最终的结果与一长串历史行为关联起来。
  • 数学基础:
    • 这类涉及状态、动作、奖励和策略的序列决策问题,在数学上通常被建模为 马尔可夫决策过程 (Markov Decision Process, MDP)。这是理解高级强化学习算法的理论基石。

通俗类比: 学习骑自行车。没有人能用语言精确教会你如何保持平衡。你只能通过不断地尝试、摔倒(惩罚)、偶尔成功骑行一小段(奖励),最终大脑自己总结出一套控制身体肌肉的策略,从而学会骑车。这个过程就是强化学习。


强化学习的核心框架:马尔可夫决策过程 (MDP)

在上一部分我们了解到,AI 行为决策中一个核心的挑战是 奖励延迟 (Delayed Reward) 问题。为了在数学上严谨地描述和解决这类问题,图形学和 AI 领域引入了一个经典的数学模型—— 马尔可夫决策过程 (Markov Decision Process, MDP)。这套框架是理解现代强化学习(尤其是游戏 AI)的基石。

1. MDP 的基本构成要素

MDP 将复杂的决策问题抽象为几个核心组件的持续互动。我们可以用一个经典的“老鼠走迷宫”的例子来理解:

  • 智能体 (Agent): 决策的执行者。在迷宫例子中,老鼠就是智能体。在游戏中,这就是我们的 AI角色。
  • 环境 (Environment): 智能体所处的外部世界,包含了所有规则和状态。在例子中,迷宫本身(包括墙壁、陷阱和奶酪)就是环境。
  • 状态 (State, S): 对当前世界的一个完整描述,是智能体决策的依据。例如,马里奥在游戏中的 精确坐标、金币的位置、敌人的位置 等信息的集合,共同构成了一个状态。
  • 动作 (Action, A): 智能体可以执行的操作集合。例如,马里奥的动作空间非常简单,只有三个选项: 向左走、向右走、向上跳
  • 奖励 (Reward, R): 环境根据智能体的动作和导致的状态变化,给予的一个即时反馈信号。这个信号是评估动作好坏的唯一标准。
    • 正奖励: 吃到金币(+1分),通关(+10000分)。
    • 负奖励: 碰到怪物死亡(-10000分)。
    • 零奖励/微弱负奖励: 无效的移动(0分或-0.1分,用于惩罚浪费时间)。

2. MDP 的核心循环机制

MDP 的本质是一个持续不断的循环过程,智能体和环境通过以下步骤进行交互:

  1. 智能体观察到当前 状态 (S)
  2. 基于当前状态,智能体依据其内部的 策略 (Policy),选择并执行一个 动作 (A)
  3. 环境接收到动作后,发生变化,进入一个新的 状态 (S')
  4. 同时,环境向智能体反馈一个即时的 奖励 (R)
  5. 智能体在新状态 (S') 下,重复步骤1,无限循环下去,直到任务结束。

这个 S -> A -> S' -> R 的循环,构成了所有强化学习算法的核心交互逻辑。

3. 深入理解 MDP 的数学概念

为了让这个模型能够被计算机理解和优化,我们需要引入几个关键的数学概念。

3.1 状态转移概率 (State Transition Probability)

这是一个非常核心且反直觉的概念: 从一个状态执行一个动作,到达下一个状态的过程,不是确定的,而是概率性的

  • 核心观点: 环境的反应具有不确定性。即使智能体执行了相同的动作,外部世界的随机性也可能导致不同的结果。
  • 数学表达: 通常用一个概率函数 P(S' | S, A) 来表示。它描述了在状态 S 下执行动作 A 后,转移到新状态 S' 的概率。
  • 类比: AI 控制一个角色射箭。AI 决定执行“射击”这个 动作 (A)。但最终能否命中目标(即进入“敌人死亡”这个 新状态 S'),取决于多种因素,比如敌人的躲闪、风向等。因此,这个转移是一个概率事件,比如有 80% 的概率命中,20% 的概率射偏。

关键 takeaway: 在 MDP 框架中,我们必须接受世界是 随机的 (Stochastic)。智能体无法 100% 控制其动作的结果,只能通过学习来选择成功概率最高的动作。

3.2 策略 (Policy, π)

策略 (Policy) 是智能体的“大脑”,是整个 AI 系统的核心。它本质上是一个函数,定义了智能体在特定状态下应该如何行动。

  • 核心观点: 一个优秀的策略,输出的 不是一个确定的动作,而是一个所有可能动作的概率分布
  • 一个常见的误解: 输入一个状态 S,策略直接输出一个最佳动作 A
  • 正确的理解: 输入一个状态 S,策略会输出一个概率列表。例如,对于马里奥:
    • 向左走的概率:70%
    • 向右走的概率:10%
    • 向上跳的概率:20% 智能体再根据这个概率分布进行采样,选择最终执行的动作。这种随机性有助于探索未知的更优解。
  • 数学表达: π(A | S),表示在状态 S 下,选择执行动作 A 的概率。
  • 实现方式: 策略的具体实现可以是多种多样的,从简单的 有限状态机 (FSM)行为树 (Behavior Tree),到复杂的 神经网络 (Neural Network),它们都可以被统一抽象为 策略 (Policy) 的概念。AI 学习的目标,就是不断优化这个策略函数 π

3.3 累计奖励与折扣因子 (Total Reward & Discount Factor)

智能体的最终目标不是最大化眼前的即时奖励,而是最大化 从当前时刻到未来的累计总奖励 (Total Reward)

  • 核心观点: 未来的奖励充满不确定性,因此在计算总奖励时,未来的奖励应该比眼前的奖励权重更低
  • 折扣因子 (Discount Factor, γ): 为了实现上述观点,我们引入一个介于 0 和 1 之间的系数 γ(例如 0.99)。
  • 计算方式: 未来的总回报 (Gain, G) 是一个带折扣的奖励总和。

    总回报 (Gain) 公式:

    • 是下一步能立刻获得的奖励,权重为 1。
    • 是下两步的奖励,其价值需要乘以
    • 是下三步的奖励,其价值需要乘以
    • 以此类推,越遥远的奖励,其折扣越多,对当前决策的影响就越小。

这种 折扣化 (Discounting) 的思想,完美地平衡了对即时利益的追求和对长远目标的规划,是强化学习能够处理奖励延迟问题的关键所在。


从马尔可夫决策到游戏 AI 的未来

在上一部分的基础上,本次讲座深入探讨了强化学习中的核心数学思想——马尔可夫决策过程 (Markov Decision Process, MDP),并由此引出为何要将机器学习(特别是强化学习)引入现代游戏 AI 开发,以及如何搭建一个基础的实现框架。

一、 深入马尔可夫决策过程 (MDP) 的核心

MDP 是强化学习的数学基石,它描述了智能体 (Agent) 如何在环境中通过学习来达成目标。讲座重点解析了其中几个关键概念。

1. 关键参数:折扣因子 (Discount Factor)

在强化学习中,智能体的目标是最大化未来的总奖励。但未来的奖励充满了不确定性,我们需要一个参数来平衡短期收益和长期收益。

  • 核心观点: 折扣因子 (Gamma) 是一个介于 0 和 1 之间的系数,用于衡量未来奖励相对于当前奖励的重要性。它决定了 AI 的“远见”程度。

  • 直观类比: 讲座中提到了一个生动的例子:

    • 长期收益: “现在好好读书,将来就能成功赚大钱。” 这很重要,但非常遥远和不确定。
    • 短期收益: “现在马上去吃饭,否则几个小时后就会饿肚子。” 这是眼前的、确定性高的需求。
    • 就是在这两者之间进行权衡的工具。饿肚子的时候,吃饭(短期收益)的权重远高于未来的成功(长期收益)。
  • 值的选择与影响:

    • 趋近于 1 (如 0.999) : AI 会更有“耐心”,更看重 长期规划,愿意为了未来的巨大回报而牺牲眼前的小利。
    • 较小 (如 0.95) : AI 会更“短视”,倾向于选择能立即获得奖励的行动,表现得 反应更迅速 (Responsive),更关注眼前利益。
  • 数学表达: 智能体在 时刻之后的目标——最大化累积奖励 ——通常用以下公式表示。可以看到,时间越久远的奖励 ,其权重 就越小。

2. MDP 的三大核心要素

一个完整的 MDP 可以由以下几个核心部分来定义,它们共同构成了 AI 决策的基础。

  1. 状态转移概率 (State Transition Probability)

    • 核心观点: 定义了环境的“物理规则”。即在某个状态 下,执行一个动作 后,转移到下一个状态 的概率是多少。你可以将其理解为一个 概率图 (Probabilistic Graph)
  2. 策略 (Policy)

    • 核心观点: 这是 AI 的“大脑”,也是我们通过训练反复迭代和优化的核心目标。它是一个函数,输入当前的状态 (State),输出接下来应该执行的动作 (Action) 或执行各个动作的概率分布。
    • 举例 (马里奥):
      • 当前状态 (State): 马里奥头顶有金币,前方有乌龟。
      • 策略 的输出: 一个概率分布,例如:{向上跳: 0.7, 向左走: 0.2, 向右走: 0.1}。
      • 决策: AI 会根据这个概率分布选择“向上跳”,以实现吃到金币并躲避乌龟的目标。
  3. 奖励函数 (Reward Function) R

    • 核心观点: 这是 AI 优化的“指引者”。它定义了在某个状态下做某个动作的好坏程度。奖励函数的设计直接决定了 AI 行为的最终形态。

: 讲座中提到,基于这些核心要素,还有更深入的 V-函数 (State-Value Function)、Q-函数 (Action-Value Function)、策略梯度 (Policy Gradient)、Actor-Critic 等优化算法。但这些属于更专业的机器学习课程,在此不做深究,重点是理解其在游戏 AI 中的应用思想。

二、 超越脚本:机器学习为游戏 AI 带来的革命

传统游戏 AI,如行为树 (BT)、HTN、GOAP 等,功能强大但存在一个根本性的瓶颈。

  • 传统 AI 的瓶颈: 行为的上限完全由人类设计师的想象力决定。所有可能的行为和逻辑都需要设计师预先编写好,AI 的行为是可预测的,无法超越设计师的认知范围。

  • 机器学习的优势: 通过强化学习,AI 能够自我进化和探索,创造出设计师都未曾预料到的新策略和行为。

    • 核心观点: 机器学习将游戏 AI 从一个“被设计好的脚本执行者”转变为一个“能够自主学习的智能体”,从而为游戏世界带来无限的可能性和涌现行为 (Emergent Behavior)。
  • 对未来游戏的意义:

    • 构建可信的世界: 我们的目标是创造一个像现实世界一样充满无限可能的、可信的虚拟世界。
    • 提供持续的新鲜感: 玩家每次进入游戏,都能遇到行为不重复、仿佛在“独立思考”的 NPC,获得全新的体验。这正是《荒野大镖客2》等游戏努力的方向,而机器学习是实现这一终极目标的有力工具。

三、 从理论到实践:构建游戏 ML AI 的基本框架

要在游戏中实际应用机器学习,并不像想象中那么“玄乎”,它遵循一个清晰的工程框架。

1. 最重要的一步:Observation (观察)

  • 核心观点: 将游戏世界的状态“翻译”成机器可以理解的数字格式。 这是连接游戏世界和 AI 算法的桥梁。
  • 关键任务: 你需要将游戏中的所有相关信息,如角色位置、敌人状态、地图信息、道具等, 定量化 (Quantify) 并组织成一个或多个向量/矩阵,这个结果就是 状态 (State)

2. 核心循环:观察 决策 行动

一旦状态可以被量化,AI 的运作就进入一个持续的循环:

  1. 获取状态 (State): AI 系统观察当前的游戏世界,得到一个量化的状态表示。
  2. 执行策略 (Policy): AI 将当前状态输入其策略网络 (),计算出最合适的行动 (Action)。
  3. 改变世界: AI 执行该行动,游戏世界根据规则更新到下一个状态。
  4. 获得奖励 (Reward): AI 从环境中获得一个奖励信号,用于评估刚才行动的好坏。
  5. 学习与优化: AI 利用这个奖励信号来更新和优化自己的策略网络,以便下次在类似情况下做出更好的决策。

3. 案例分析:将 DRL 应用于《星际争霸》

为了让概念更具体,讲座以深度强化学习 (Deep Reinforcement Learning, DRL) 在《星际争霸》中的应用为例:

  • 第一步:定义状态 (State)
    • 最直接的方式就是将玩家看到的游戏画面作为输入。
    • 具体实现: 整个屏幕的 像素 (Pixels) 数据可以被视为一个巨大的矩阵,直接输入到神经网络中。AI 将从这些原始像素中自己学习识别单位、建筑等关键信息。

总结: 这一部分内容从 MDP 的核心参数 出发,阐明了强化学习中短期与长期目标的权衡。接着,通过对比传统 AI,论证了机器学习能为游戏世界带来“无限可能性”的革命性价值。最后,将理论落地,提出了构建 ML AI 的核心框架—— “观察 (Observation)”,并以《星际争霸》为例,展示了如何将游戏画面像素作为 AI 的初始输入状态。这为后续探讨更具体的应用奠定了坚实的基础。


深度强化学习在游戏AI中的应用 (以星际争霸为例)

在上一部分我们了解了蒙特卡洛树搜索(MCTS)在AlphaGo中的应用,这一部分我们将深入探讨一个更复杂的框架—— 深度强化学习(Deep Reinforcement Learning, DRL),并以经典的即时战略游戏《星际争霸》及其AI AlphaStar 为例,解析如何构建一个能应对超复杂博弈环境的智能体。

一、 构建游戏DRL框架的五大核心步骤

将深度强化学习应用于像《星际争霸》这样复杂的场景,需要一个系统性的设计流程。这可以被拆解为五个关键步骤:

  1. 状态 (State) 描述:量化游戏世界

    • 核心观点:AI无法像人类一样通过视觉直观理解游戏画面。我们必须将游戏世界中的所有关键信息——单位、地图、资源、血量等—— 转化成AI可以处理的结构化数据。这就像是为AI建立一个“世界观”。
    • 类比:人类大脑看到游戏像素后,会自动抽象出“我的基地”、“敌人的航母”、“小地图上的红点”等语义信息。为AI设计State就是手动完成这个抽象过程。
  2. 动作 (Action) 定义:明确AI的能力边界

    • 核心观点:需要精确定义AI可以执行的所有操作。这并非简单地模拟鼠标点击,而是定义具有明确游戏意义的高层指令
    • 关键考量:动作的定义必须非常具体。例如,一个攻击指令需要明确由“谁”去攻击“谁”。一个移动指令需要明确移动到“哪里”。动作空间的设计直接决定了AI的策略深度和复杂度。
  3. 奖励 (Reward) 设计:引导AI的学习方向

    • 核心观点:奖励机制是强化学习的灵魂,它告诉AI什么是“好”的行为,什么是“坏”的行为。 合理的奖励设计是训练出聪明AI的关键
    • 设计挑战
      • 稀疏奖励 (Sparse Reward):最简单的奖励是“赢了+1,输了-1”。这种方式虽然可行,但由于奖励在游戏结束时才给出,AI在漫长的对局中很难学到具体哪一步走得好。
      • 稠密奖励 (Dense Reward):为了让AI学得更快更好,通常需要设计更细致的奖励,比如摧毁一个敌方单位、成功开辟一个新矿区等,都会给予小额的即时奖励。
  4. 网络拓扑结构 (Neural Network Topology) 选型

    • 核心观点:根据游戏的核心机制和数据结构,设计和选择合适的神经网络架构。
    • 关键考量:这步非常考验团队的技术功底。不同的游戏(如RTS、FPS、RPG)其状态和动作的复杂度完全不同,需要量身定制网络结构来有效处理输入(State)并输出合理决策(Action)。
  5. 训练策略 (Training Strategy) 制定

    • 核心观点:拥有了以上所有组件后,还需要一个高效的训练流程才能让AI从“笨拙”变得“智能”。
    • 关键考量:如何设置对手?是从零开始自我博弈,还是先模仿人类玩家?如何平衡探索(尝试新策略)和利用(使用已知最优策略)?这些策略的设计对最终AI的强度至关重要。

二、 游戏AI的挑战:为何星际争霸比围棋更难?

尽管AlphaGo在围棋上已经完胜人类,但在《星际争霸》这类复杂游戏中,AI至今仍未取得绝对统治地位。这揭示了游戏AI面临的独特挑战。

特性对比围棋 (AlphaGo)星际争霸 (AlphaStar)
信息对称性完全信息博弈 (Perfect Information)
双方都能看到棋盘上的所有信息。
不完全信息博弈 (Imperfect Information)
存在 战争迷雾 (Fog of War),玩家只能看到自己单位视野内的区域,信息是片面和不对称的。
动作空间离散且有限
每一步都在固定的棋盘点位上落子。
巨大且复杂的混合动作空间
动作是并行的、多单位的、实时的,涉及单位选择、技能释放、目标选择、位置指定等多个维度。
决策频率回合制
一次只走一步,有充足的思考时间。
实时制 (Real-time)
需要在瞬息万变的战场中持续做出大量决策。
博弈周期胜负明确
游戏结束时有清晰的胜负规则。
长期规划与即时反应结合
一场游戏长达数十分钟,需要平衡宏观战略(经济发展、科技攀升)和微观操作(战斗走位)。

核心结论:由于信息不对称动作空间的巨大复杂性,《星际争霸》这类游戏的博弈复杂度远超围棋,对AI提出了更高的要求。这也是人类智慧在这一领域至今仍能“苟延残喘”的原因。


三、 案例研究:DeepMind的AlphaStar是如何做的?

AlphaStar是DRL在游戏领域应用的标杆,它的设计完美体现了上述理论框架。

1. 状态 (State) 的量化表达

AlphaStar将游戏世界解构为两种核心数据类型:

  • A. 空间信息 (Spatial Information) - 多层地图 (Multi-layered Maps)

    • 核心思想:将战场的空间态势信息编码成一系列二维图像(Map),每一层代表一种特定的语义信息。
    • 具体实例
      • 高程图 (Height Map):标识地形高低,影响单位视野和移动。
      • 战争迷雾图 (Fog of War Map):标识可见、未知和已探索区域。
      • 地表状态图 (Surface State Map):例如虫族的菌毯(Creep)覆盖范围。
      • 寻路图 (Pathfinding Map):标识哪些区域是可通行的。
      • 影响力图 (Influence Map):例如敌方单位的威胁范围。
  • B. 离散信息 (Discrete Information) - 单位列表 (Unit Lists)

    • 核心思想:将游戏中每个单位的属性整理成一个列表或向量。
    • 具体实例
      • 单位类型 (Unit Type):机枪兵、坦克、航母等。
      • 归属 (Ownership):敌方、我方或中立。
      • 血量/护盾 (Health/Shield)
      • 精确位置 (Position)
      • ...以及其他所有单位相关属性。

通过结合多层地图单位列表,AlphaStar能够全面、量化地“理解”当前的游戏局势。

2. 动作 (Action) 的复杂定义

AlphaStar的动作空间设计得非常精巧,它超越了简单的move, attack, build

  • 核心思想:将一个复杂的指令分解为多个参数。一个完整的Action需要回答以下问题:
    • 执行者 (Who):是哪个或哪些单位来执行这个动作?
    • 目标 (What):攻击的目标是哪个敌方单位?建造的建筑是什么类型?
    • 位置 (Where):移动到地图的哪个坐标点?
  • 高级形式:动作甚至可以是序列化的,即一个指令包含多个步骤,例如“先移动到A点,然后在A点建造一个分基地”,这体现了初步的 规划 (Planning) 能力。
3. 奖励 (Reward) 的设计

(讲座在此处中断,但我们可以预见)

  • 核心思想:AlphaStar的奖励函数设计必然是复杂且分层的。除了最终的胜负奖励,它极有可能包含了对经济优势、科技领先、战损交换比等中期目标的奖励,以引导AI在漫长的对局中做出正确的宏观决策。这部分的设计细节是其成功的关键之一。

深度强化学习中的奖励设计与网络架构

在上一部分中,我们了解了深度强化学习(DRL)的基本框架:状态(State)、动作(Action)和奖励(Reward)。这一部分,我们将深入探讨在复杂游戏环境中,如何巧妙地设计 奖励(Reward) 机制,并一窥业界顶级 AI(如 AlphaStar)所使用的复杂神经网络架构。

一、 奖励(Reward)设计:AI 行为的指挥棒

奖励函数的设计是 DRL 的核心,它直接决定了 AI 学习的方向和最终表现出的“性格”。一个好的奖励系统能够引导 AI 高效地学习,而一个糟糕的设计则可能让训练过程漫长且无效。业界主要有两种设计思路:

1. 案例一:AlphaStar 的稀疏主奖励与稠密辅助奖励

DeepMind 的 AlphaStar 在《星际争霸II》中的奖励设计非常独特,体现了“抓大放小”的原则。

  • 核心观点: 以最终胜负作为主要奖励信号,同时引入精心设计的“伪奖励”来引导日常行为。

  • 主要奖励 (Primary Reward):

    • 设计极其简单直接,即 稀疏奖励(Sparse Reward)
    • 胜利: +1
    • 失败: -1
    • 这种设计的优点是目标明确,缺点是反馈信号非常滞后,AI 在一局游戏的大部分时间里都得不到明确指导。
  • 伪奖励 (Pseudo Reward) / 辅助奖励 (Auxiliary Reward):

    • 为了解决稀疏奖励带来的训练困难,AlphaStar 引入了一系列辅助性的奖励/惩罚项,作为密集的引导信号。
    • 一个关键的例子是 模仿人类玩家:比较 AI 在当前状态下生成的动作(Policy)与人类顶尖玩家的动作。
      • 如果 AI 的决策与人类玩家一致,给予正面激励。
      • 如果不一致,则给予反向惩罚。
    • 关键技术点: 如何平衡主奖励和伪奖励的权重是一个巨大的挑战,也是 AlphaStar 的“黑科技”所在。
      • 原则: 所有伪奖励项的总和,其值域范围(magnitude)大致被控制在 [-1, 1] 之间。
      • 目的: 确保这些辅助奖励能够有效引导 AI,但又不会压过“胜负”这个最终目标的重要性。

2. 案例二:OpenAI Five 的高频多维度奖励

与 AlphaStar 不同,用于 DOTA 2 的 OpenAI Five 采用了截然相反的策略,更贴近人类玩家的直观感受。

  • 核心观点: 将游戏中几乎所有有意义的事件都量化为小奖励,形成一个高频、密集的奖励系统。

  • 高频奖励系统 (High-frequency Rewarding System):

    • AI 的每一个积极或消极行为都会立即得到反馈。
    • 奖励示例: 击杀英雄、摧毁防御塔、获得金钱、补刀成功等。
    • 惩罚示例: 自身死亡、受到伤害、被技能命中等。
  • 通过奖励塑造 AI 性格:

    • 这种设计最大的优势在于,开发者可以通过调整不同事件的奖励权重,来直接塑造 AI 的行为模式和“性格”。
    • 高攻击性 (Aggressive) AI: 提高 击杀英雄 的奖励权重,AI 会更倾向于寻找战斗机会。
    • 高保守性 (Conservative) AI: 提高 胜利 的奖励权重,或加大 死亡 的惩罚,AI 会变得更谨慎,以大局为重,避免不必要的风险。

小结:奖励频率的重要性

  • 低频/稀疏奖励 (Low-frequency/Sparse Reward): 如 AlphaStar,目标纯粹,但训练难度极高,需要额外的引导技巧。
  • 高频/稠密奖励 (High-frequency/Dense Reward): 如 OpenAI Five,训练过程更平滑,反馈及时,且便于开发者调整和塑造 AI 行为。

二、 神经网络架构:从“炼丹”到决策

当奖励机制设计好后,就需要构建一个强大的神经网络来学习。这里我们以 AlphaStar 的网络架构为例,理解其核心思想。尽管它的结构图看起来极为复杂,但可以被简化为两个核心部分: 编码器(Encoder)解码器(Decoder)

1. 核心理念:编码器(Encoder)与解码器(Decoder)模型

这个模型可以类比为一个“军师团”的工作流程:

  • 编码器 (Encoder) - 神秘的决策核心: 负责接收海量信息,并形成对战局的深刻理解。
  • 解码器 (Decoder) - 专业的执行参谋: 负责解读核心的战略意图,并将其翻译成具体、可执行的命令。

2. 编码器 (Encoder):“炼丹炉”

  • 功能: 将多样化的游戏输入信息,通过复杂的网络运算, 编码(Encode) 成一个计算机自己才能理解的内部状态表示(通常是一串高维向量)。这个过程就像一个无法被完全理解的“炼丹”过程。
  • 处理的输入类型:
    1. 游戏基础状态数据: 如资源数量、人口、单位统计等。这类结构化数据通常由 MLP (多层感知机) 处理。
    2. 地图类图像数据: 如小地图、单位位置图、地形图、Influence Map 等。这类空间数据通常由 ResNet (残差网络) 等卷积神经网络处理。
    3. 序列化数据: 如单位列表等。这类数据可能由 TransformerLSTM (长短期记忆网络) 处理,以捕捉单位之间的关系或时序信息。
  • 结果: 输出一个谁也读不懂的数字向量,但它蕴含了 AI 对当前局势的全部理解。

3. 解码器 (Decoder):“翻译官”

  • 功能: 接收来自编码器的内部状态向量,并将其 解码(Decode) 为人类可以理解、游戏可以执行的具体 动作(Action)
  • 输出示例:
    • 下一步应该执行什么宏观指令?(例如:集结部队、骚扰矿区)
    • 选择哪个单位?
    • 对地图上的哪个位置执行操作?
    • ...等等一系列具体的游戏操作。
  • 类比: 就像主公的军师在墙上写下几个天书般的字(Encoder 的输出),然后一群参谋(Decoder)围在一起解读,最终形成“张将军带五千兵马攻打A点,李将军固守B城”的具体军令。

4. 对待复杂模型的务实态度

讲座中提到一个非常重要的观点:对于深度学习,尤其是这类复杂的模型,我们不必苛求理解其内部每一个神经元的具体工作原理。

  • “炼丹”哲学: 我们可以将其视为一个高效的“炼丹炉”。我们知道投入什么“药材”(输入数据),也知道如何设计“丹炉”(网络架构),最终能炼出有效的“丹药”(好的 AI 决策)。至于炉内具体的化学反应,可以暂时“不求甚解”。
  • 实践者视角: 作为引擎或游戏开发者,更重要的是理解不同网络模块(如 ResNet, Transformer)擅长处理什么类型的问题,然后像搭积木一样,将它们组合起来解决我们面临的实际问题。

游戏 AI 的神经网络架构

本次讲座的核心内容是探讨如何构建一个能够理解和处理复杂游戏环境的 AI。游戏世界的数据类型多种多样,单一的神经网络模型难以胜任。因此,业界的先进方法是采用一个 混合架构 (Hybrid Architecture),针对不同类型的数据使用最适合的神经网络模型进行处理,最后再将这些信息汇总,形成最终决策。

这套思路的精髓在于 “分而治之”:将复杂问题拆解,用专业的工具解决专业的部分,最后再进行高效整合。


一、 游戏数据输入的分类与处理策略

游戏 AI 需要处理的数据大致可以分为三类,每类都有其对应的经典神经网络解决方案。

1. 确定性状态数据 (Deterministic State Data)

这类数据是全局的、长度固定的数值信息,描述了游戏的宏观状态。

  • 数据特点:结构固定,数值化,通常是一个向量(Vector)。
  • 典型例子
    • 玩家拥有的资源量(如金钱、木材、人口上限)。
    • 已研发的科技等级。
    • 游戏进行的时长。
  • 处理网络MLP (Multi-Layer Perceptron, 多层感知机)
    • 核心观点MLP 是最基础的前馈神经网络,非常适合处理结构化的、固定长度的数值输入。你可以把它想象成一个通用的函数拟合器,输入一个代表游戏状态的向量,它就能输出一个初步的分析结果。

2. 图像/地图类数据 (Image/Map-like Data)

这类数据具有空间相关性,通常以二维数组或图像的形式存在,AI 需要从中理解空间布局和态势。

  • 数据特点:二维或三维空间结构,局部信息关联性强。
  • 典型例子
    • 游戏小地图 (Minimap)。
    • 战争迷雾 (Fog of War) 图。
    • 地形高度图 (Height Map)。
    • 影响力图 (Influence Map),例如敌我双方的控制区域。
  • 处理网络CNN (Convolutional Neural Network, 卷积神经网络)
    • 核心观点CNN 专为处理图像和空间数据而生,能够自动提取空间特征。它通过卷积核来扫描整个“图像”,识别出边缘、形状、纹理等局部模式,并逐层组合成更高级的特征。
    • 关键术语ResNet (Residual Network)
      • 这是 CNN 领域一个里程碑式的架构。它的核心创新在于引入了 “跳跃连接” (Skip Connection)
      • 工作原理:允许网络将前面层级的原始输入信息直接“跳跃”到更深的层级。这样做的好处是,在网络很深时,可以有效 防止高频细节信息(如边缘、纹理)的丢失,让深层网络也能学习到浅层特征,极大地提升了训练效率和模型性能。
    • 引申思考:AI 的“公平性”
      • 讲座中提到了一个有趣观点:一个“公平”的 AI 应该像人类玩家一样,通过视觉输入(例如渲染出的游戏画面或深度图)来感知世界,然后用 CNN 来“看懂”画面中的敌人。
      • 如果 AI 直接读取游戏引擎内部的单位坐标列表,即使单位在千里之外或只有一个像素大小,AI 也能精确知道其位置。这在某种意义上是 “作弊”,因为它获得了人类玩家无法获得的信息。

3. 不定长序列数据 (Variable-Length Sequence Data)

这类数据是动态变化的列表,其元素数量在游戏过程中随时增减。

  • 数据特点:序列化,长度可变,元素之间可能存在关联。
  • 典型例子
    • 视野内所有敌方单位的列表(每个单位包含类型、位置、血量等信息)。
    • 我方所有单位的列表。
    • 建筑队列、生产队列等。
  • 处理网络Transformer
    • 核心观点Transformer 模型源于自然语言处理 (NLP),其核心优势在于能高效处理变长的序列数据。它通过自注意力机制 (Self-Attention) 来理解序列中不同元素之间的相互关系和重要性,而不用像传统 RNN 那样必须按顺序处理。
    • 应用场景:将游戏中所有单位的信息作为一个序列“喂”给 Transformer,它能够理解场上单位的整体布局和相互关系。

二、 整合与决策:具备记忆的核心大脑

上述三种网络只是对原始数据进行了初步的特征提取和编码,它们各自为战。要让 AI 做出连贯、有策略的决策,就需要一个“中央处理器”来整合所有信息,并赋予 AI 记忆能力

  • 整合网络LSTM (Long Short-Term Memory, 长短期记忆网络)

    • 核心观点LSTM 是一种特殊的循环神经网络 (RNN),它通过精巧的门控机制,实现了对信息的长期记忆和选择性遗忘,扮演着整个决策系统的大脑角色
    • 工作机制简述
      1. 信息汇总:接收来自 MLP、CNN 和 Transformer 处理后的特征向量。
      2. 记忆与反馈:LSTM 内部有两个关键的状态向量:
        • 细胞状态 (Cell State, C):像一条传送带,负责存储长期记忆。信息可以在上面一直流动,变化很小。
        • 隐藏状态 (Hidden State, H):代表上一个时间步的输出,也作为当前时间步的输入之一,可以看作是短期记忆或当前的工作重点。
      3. 决策影响:上一次的决策结果(H)会反过来影响当前的记忆(C)和本次决策,形成一个反馈闭环。这使得 AI 的行为不是孤立的,而是基于历史经验的。
  • 为什么记忆如此重要?

    • 游戏策略的连贯性:AI 需要记住历史信息才能做出有远见的决策。
    • 经典例子:在《星际争霸》中,我的侦察单位刚才在某个位置看到了敌方部队,随后战争迷雾覆盖了该区域。虽然当前视野里没有敌人,但一个带记忆功能的 AI 会记住“敌人可能还潜伏在那附近”,从而做出更谨慎的移动或派遣部队去探查。没有记忆的 AI 则会认为那里是安全的。
    • 这种机制使得 AI 的行为更接近人类的思考模式:基于过去的经验和记忆来判断当前的局势

三、 架构总结与其他前沿输入类型

整体架构流程

一个先进的游戏 AI 决策系统可以概括为如下流程:

  1. 数据分流 (Data Segregation)
    • 确定性数据 (资源、人口) → MLP
    • 图像/地图数据 (小地图、战争迷雾) → CNN (ResNet)
    • 不定长序列数据 (单位列表) → Transformer
  2. 特征整合与记忆决策 (Integration & Memory-based Decision)
    • 将 MLP、CNN、Transformer 的输出特征向量,全部输入到 LSTM 中。
    • LSTM 结合自身记忆,进行最终的态势判断和决策输出。

其他前沿的 AI 输入数据

除了上述三类,更前沿的 AI 研究还会引入更接近人类感知方式的输入:

  • Raycast 数据:模拟人类的“注视”行为。AI 向环境中发射多条射线,通过返回的信息(是否命中、距离、物体类型等)来采样和感知世界。这种方式可以让 AI 的行为更真实,因为它也存在视野盲区,无法“看到”被遮挡的物体。
  • Mesh 数据:直接将游戏场景的 3D 模型网格作为输入,让 AI 理解更复杂的三维空间结构。

四、 从架构到训练:引出下一个话题

搭建好这个复杂的神经网络架构只是第一步。接下来的巨大挑战是 如何训练 (Training) 它。

讲座中提到了与 AlphaZero 的对比:AlphaZero 是一个“天才”,只需告知基本规则,它就能通过自我对弈从零开始学习,不需要任何人类先验知识。

然而,对于像《星际争霸》这样极其复杂的游戏,完全从零开始训练(Tabula Rasa)的成本和难度极高。这暗示了在实际应用中,可能需要更复杂的训练方法,这或许是后续讲座将要探讨的内容。


高级游戏 AI 训练策略:从模仿到超越

在为复杂游戏(如《星际争霸》)构建顶尖 AI 时,我们不能简单地像 AlphaZero 那样“从零开始”学习。由于游戏状态的极度复杂性和漫长的决策回报链,这种纯粹的强化学习方法在时间和金钱成本上都高得令人难以承受。因此,业界探索出了一套更为务实、高效的“两阶段”训练范式。

第一阶段:从模仿人类开始 (Supervised Learning)

AI 训练的第一步不是自我探索,而是先成为一个合格的“模仿者”。通过监督学习,让 AI 掌握人类玩家的基本行为模式。

核心思想:有样学样

  • 基本原理:将海量的人类玩家历史对局数据作为“教材”。输入一个游戏状态(State),AI 需要输出一个与该状态下人类玩家行为一致的动作(Action)。
  • 训练机制:如果 AI 的决策与人类玩家不符,就通过损失函数给予“惩罚”,迫使其神经网络的权重向模仿人类行为的方向调整。这个过程就像教孩子一样,让他有样学样,先建立起对游戏的基本理解和操作直觉。

关键问题:选择什么样的“老师”?

  • 数据的权衡:理论上,使用最顶尖(Top Tier)职业玩家的数据进行训练效果最好。但这类数据量非常稀少。
  • 务实的选择:在实践中,通常会选择一个平衡点——采用大量 “优秀玩家” 的数据。虽然这些玩家不是世界冠军,但他们的数据足以让 AI 训练出一个远超业余玩家水平的初始版本。
  • 核心观点训练 AI 的起点决定了它的基础水平。你用什么水平的玩家数据去训练它,它最终的初始表现通常不会超过这位“老师”,甚至会稍弱一些。

关键技术:KL 散度 (Kullback-Leibler Divergence)

在 AlphaStar 等顶尖 AI 的训练中,使用了一个重要的数学工具来衡量模仿的程度。

  • KL 散度:可以通俗地理解为一种衡量两个概率分布之间差异的“距离”。
  • 应用场景:在这里,它被用来衡量 AI 的决策概率分布人类玩家的决策概率分布 之间的差异。
  • 训练目标最小化 KL 散度。当散度趋近于零时,意味着 AI 的决策模式与人类高度一致,模仿学习阶段的目标就达成了。

第二阶段:自我进化与超越 (Reinforcement Learning)

当 AI 通过模仿学习获得了一个坚实的基础后,便进入了更关键的强化学习阶段,通过“自我对弈”来不断突破和超越。

核心难题:避免陷入“局部最优解”

如果 AI 只是简单地和自己对战(单一版本的自我博弈),它很快会找到克制自己当前打法的一套策略,然后就停滞不前。这就像一个武林高手只练习一套克制自己的招式,一旦遇到风格迥异的对手就可能不堪一击。这种现象在机器学习中被称为陷入 局部最优解 (Local Optimum),而非 全局最优解 (Global Optimum)

AlphaStar 的精妙架构:构建一个“对手联盟”

为了解决这个问题,AlphaStar 设计了一套极其巧妙的、多元化的自我对弈生态系统,强迫 AI 不断进化,变得更加鲁棒和全面。这个系统可以理解为一个内部的“对手联盟”。

主智能体 (Main Agent),也就是我们最终要输出的那个最强 AI,它的训练对手构成如下:

  1. 与当前版本的自己对抗 (~35%): 这是最基础的自我进化,通过“左右互搏”来快速迭代和优化当前策略。
  2. 与所有历史版本的自己对抗 (~15%): 确保 AI 不会“忘记”过去的战术,防止在进化过程中丢失某些有用的旧策略,同时也能检验新策略对老策略的有效性。
  3. 与两种特化的“利用体”(Exploiter) 对抗 (~50%): 这是整个架构的精髓,通过引入专门的“陪练”来挖掘主智能体的潜在弱点。
    • 联盟利用体 (League Exploiters): 这类 AI 的目标是找到 整个智能体联盟(包括主智能体和其他所有历史版本) 的普遍弱点。它的策略更具普适性,迫使主智能体提升综合应对能力。
    • 主要利用体 (Main Exploiters): 这类 AI 的目标只有一个——专门针对当前主智能体的弱点进行攻击。它会不择手段地研究和利用主智能体最新的战术漏洞,扮演着一个完美的“假想敌”。

核心思想的类比与总结

这套复杂的训练架构可以用两个生动的例子来理解:

  • 生物进化视角

    • 一个只和自己竞争的 AI,就像生活在孤岛上的物种。它可能在岛内环境中进化得无比强大,但一旦遇到一个“外来物种”(新的、未曾见过的策略),就可能因为缺乏适应性而迅速灭绝。
    • “利用体” (Exploiters) 就扮演了“外来物种”的角色,不断地为主智能体带来新的挑战和环境压力,迫使其进化得更加全面和强大,能够应对各种未知的策略。
  • 军事演习视角:“红军”与“蓝军”

    • 主智能体 (Main Agent) 就像我方的“红军”,代表着主力部队。
    • 主要利用体 (Main Exploiters) 就像专门扮演敌军的“蓝军”。蓝军的唯一任务就是研究红军的战术,找到并利用其所有弱点。
    • 训练的多元性:红军既要和自己(其他红军部队)演练,也要和蓝军对抗。如果只和蓝军打,红军可能会过度针对蓝军的战术,而忘记了如何应对其他类型的敌人。因此, 一个包含“自己人”、“历史上的自己人”和“专业假想敌”的混合训练模式,才是锻造出最强部队的关键。

通过这种精巧的设计,AI 被置于一个持续进化、不断被挑战的环境中,从而能够突破模仿的局限,发现超越人类理解的全新策略,最终达到顶尖水平。


游戏 AI 的高级策略与实践

在深入探讨了多种 AI 算法后,本部分将聚焦于将这些技术,特别是深度学习,落地到实际游戏开发中所面临的核心抉择成本考量以及架构设计。内容主要围绕 AlphaStar 的训练哲学、增强学习与监督学习的权衡,以及来自《帝国时代 IV》开发团队的宝贵实践经验。


一、AlphaStar 的高级训练架构:自我博弈的艺术

传统的 AI 自我对战(Self-Play)容易导致“过拟合”,即 AI 只擅长应对自身的特定打法。为了克服这一点,DeepMind 为 AlphaStar 设计了一套巧妙的训练机制。

  • 核心观点: 为了训练出真正强大的 AI,必须为其创造一个多样化的对手生态,而不是让它在单一策略的“回音室”里自我对弈。
  • 关键策略:
    • 制造风格各异的对手: AlphaStar 的训练框架并非让一个 AI 单纯地与自己对战,而是刻意创造了 三种不同风格的 AI 对手
    • “双手互搏”的进化: 这几种不同风格的 AI 相互之间不断进行高强度的对战和学习,如同武侠小说中的“双手互搏”。这种内部竞争迫使主 AI 必须学会应对多种战术,从而变得更加全面和强大。
    • 价值: 这种方法模拟了真实世界中玩家水平和风格的多样性,弥补了现实中难以找到足够多高水平人类玩家进行持续训练的难题,最终将 AlphaStar 的能力推向了职业级水平。

二、核心抉择:增强学习 (RL) vs. 监督学习 (SL)

在游戏 AI 开发中,选择增强学习(Reinforcement Learning)还是监督学习(Supervised Learning)是一个根本性的决策,两者各有优劣。

  • 监督学习 (Supervised Learning, SL)

    • 适用场景: 当你拥有 海量、高质量的玩家数据 时。
    • 优点:
      1. 快速收敛: 利用现有数据,模型可以很快学习到有效的行为模式。
      2. 可靠的基线: 能够快速达到一个接近“人类业余高手”的水平。AlphaStar 的早期版本就是通过 SL 奠定了坚实的基础。
    • 缺点: AI 的能力上限受限于训练数据的质量和广度,很难创造出超越人类玩家认知的全新策略。
  • 增强学习 (Reinforcement Learning, RL)

    • 适用场景: 追求 AI 行为的上限和创新性
    • 优点:
      1. 极高的上限: AI 通过自我探索,有可能发现远超人类想象的“惊艳”策略和行为。
      2. 无需标注数据: 理论上不依赖于人类玩家数据,可以从零开始学习。
    • 缺点:
      1. 训练极其复杂且昂贵: 需要巨大的算力、漫长的训练时间以及复杂的环境和奖励设计。
      2. 收敛困难: 尤其是在奖励稀疏的环境下,训练效果可能很不理想。
  • 决策依据:奖励的稀疏性 (Reward Sparsity)

    • 这是一个非常实用的判断标准:
    • 密集奖励 (Dense Rewards): 如果游戏中一个行为能很快得到正或负反馈(例如,Atari 游戏中移动一下拍子马上就知道是否接到球), 增强学习 (RL) 的效果会很好
    • 稀疏奖励 (Sparse Rewards): 如果一个行为和最终结果之间的关联非常遥远和不明确(例如,在大型开放世界中做一个小任务对最终结局的影响), 增强学习 (RL) 会非常难以训练。在这种情况下, 监督学习 (SL) 或其他传统方法可能是更务实、性价比更高的选择

三、现实考量:成本与混合架构

理论上的最优算法在实际项目中往往会遇到最现实的瓶颈——成本

  • 深度学习的“军备竞赛”

    • 核心观点: 现代深度学习领域的竞争,在很大程度上是数据算力(即资金) 的竞争,而非单纯的算法创新。
    • 惊人案例:
      • DeepMind 训练 AlphaStar 据称花费了 2.5 亿美元,并且每次策略探索的成本高达 1300 万美元。
      • GPT-3 的单次训练成本也高达数千万美元。
    • 启示: 对于绝大多数游戏项目而言,盲目追求最顶尖、最复杂的深度学习模型在经济上是不可行的,必须考虑费效比
  • 混合 AI 架构:来自《帝国时代 IV》的实践智慧

    • 核心思想: 没有万能的算法,只有最合适的应用场景。 优秀的 AI 系统通常是多种技术有机结合的产物。
    • 实践方案:
      1. 宏观层面 (Macro-level) 神经网络 (NN):
        • 使用神经网络进行高层次的战略决策,例如判断全局局势,决定当前应该“发展经济”还是“发动战争”。
        • 优势: 神经网络擅长从复杂的局面(如地图态势)中提取特征,做出的宏观决策更具策略感和“人性化”。
      2. 微观层面 (Micro-level) 传统 AI + 小型 NN:
        • 使用 行为树 (Behavior Tree)有限状态机 (FSM) 作为底层执行框架,来管理具体的单位行为,例如“建造 10 个弓箭手”、“移动到指定地点”。
        • 优势: 行为树和 FSM 逻辑清晰、易于策划配置和调试,能确保行为的稳定和可控。
        • 点缀: 在这个传统框架内,可以嵌入一些 小型的、专用的神经网络 来处理特定行为,使其更具人性化(例如,单位的移动微操、攻击目标选择等),同时将训练和推理成本控制在极低的水平。

四、问答环节精选 (Q&A)

  • 游戏与 AI 的共生关系

    • AI 不仅应用于游戏,游戏引擎本身也正在成为 训练 AI 的绝佳模拟环境
    • 现实世界中的 AI 训练(如无人驾驶家用机器人)成本高、风险大。而在游戏引擎构建的逼真虚拟世界中进行训练,则既安全又高效。
    • 游戏技术推动 AI 发展,而更强的 AI 又能反过来让游戏世界变得更真实、更有趣,形成了一个良性循环。
  • 游戏 AI 的运行时:CPU vs. GPU

    • 需要明确区分 训练 (Training)推理 (Inference)。训练过程计算量巨大,通常在服务器上用大量 GPU 完成。
    • 游戏内实时运行的 AI 是推理过程,其计算量远小于训练。
    • 目前,大部分游戏 AI 的推理在 CPU 上运行就已足够。当然,随着硬件发展,利用 GPU 的 Tensor Core 或移动设备上的 NPU 进行加速也是完全可行的。最终这是一个基于项目需求和硬件平台的 工程选择 (Engineering Decision)

游戏 AI 的未来与 Q&A 总结

这是系列讲座的最后一部分,内容主要围绕一个简短的问答环节展开,探讨了现代游戏 AI 的硬件实现与学习方法,并对整个讲座系列进行了收尾。


一、 游戏 AI 的硬件实现:CPU、GPU 与专用芯片

本节探讨了在游戏开发中,AI 计算任务应该放在哪种硬件上运行的现实考量与未来趋势。

  • 核心观点: 将游戏 AI 部署在 CPU、GPU 还是专用的 AI 芯片上,已经不再是一个技术瓶颈问题,而是一个工程选择问题

  • 关键要点:

    1. 当前主流方案: 目前,绝大多数游戏的 AI 逻辑运行在 CPU 上,对于当前的游戏需求来说,性能是完全足够的。
    2. 未来的硬件加速:
      • GPU 加速: 可以利用现代 GPU 中集成的 Tensor Cores (NVIDIA GPU 的一个显著特性,也逐渐出现在移动芯片中)来加速神经网络等 AI 模型的计算。
      • 专用 AI 芯片: 随着 AI 技术的普及,未来可能会有更多设备(包括手机)搭载专用的 AI 加速芯片,它们可以被用来高效地处理复杂的 AI 任务。
    3. 决策依据: 开发者可以根据项目的具体需求、目标平台的硬件能力以及性能预算,灵活地选择最合适的硬件来承载 AI 计算负载。

二、 AI 学习玩家行为:从决策到原始输入

本节讨论了 AI 学习玩家行为的两种不同层次,以及学习原始输入的潜在价值。

  • 核心观点: AI 不仅可以学习玩家的高层决策,还可以通过学习玩家的原始输入(如手柄操作),来创造出行为模式更逼真、更具“人味”的对手。

  • 关键要点:

    1. 常见方法 - 学习高层行为:

      • 这是业界非常成熟和常见的做法。
      • AI 主要学习玩家的战术决策战略选择资源分配等宏观行为。
    2. 前沿探索 - 学习原始输入 (Raw Inputs):

      • 指直接学习玩家在手柄、键盘上的精确操作序列,例如 "上上下下左右左右" 这样的指令流。
      • 应用实例: 在格斗游戏(如《拳皇》)中,如果 AI 直接学习顶尖玩家的手柄输入数据,它不仅能学会何时出招,还能模仿玩家的操作节奏、连招时机和微小停顿。
      • 带来的优势: 通过这种方式训练出的 AI,其行为会显得更加自然和智能,能更好地模拟真实玩家的风格,从而为玩家提供更有趣、更具挑战性的游戏体验。
    3. 现状推测: 尽管可能缺少广为人知的公开研究资料,但讲者推测,这种直接学习玩家原始输入的技术大概率已经在业界存在并被应用