中文

AI行为树的全面指南,从核心概念和组件到游戏、机器人等领域的实际应用。

人工智能:深入探索行为树

在广阔且不断发展的人工智能领域中,开发人员一直在寻找强大、可扩展且直观的工具。从我们最喜欢的视频游戏中出现的非玩家角色 (NPC) 到仓库中分拣包裹的自主机器人,创建可信且有效的 AI 行为是一项艰巨的任务。虽然存在许多技术,但有一种技术以其优雅性和灵活性而成为主导力量:行为树 (BT)

如果您曾经对游戏中智能地寻找掩护、与盟友协调并根据情况改变战术的敌人感到惊叹,那么您可能已经见证了行为树的实际应用。本文全面探讨了行为树,从基本概念到高级应用,专为全球开发人员、设计师和 AI 爱好者设计。

简单系统的局限性:为什么我们需要行为树

要理解行为树的创新之处,了解之前的技术会有所帮助。多年来,简单 AI 的首选解决方案是有限状态机 (FSM)

FSM 由一组状态(例如,巡逻追逐攻击)和它们之间的转换组成(例如,如果“发现敌人”,则从巡逻转换到追逐)。对于具有一些不同行为的简单 AI,FSM 效果很好。但是,随着复杂性的增加,它们很快变得难以管理。

开发行为树是为了解决这些问题,提供一种更结构化、模块化和可扩展的方法来设计复杂的 AI 代理。

什么是行为树?AI 的分层方法

从本质上讲,行为树是一个节点的分层树,用于控制 AI 代理的决策流程。可以将其视为公司的组织结构图。顶部的 CEO(根节点)不执行每项任务;相反,他们委派给经理(组合节点),然后经理委派给执行特定工作的员工(叶节点)。

树从上到下进行评估,从根开始,通常在每个帧或更新周期中进行。此过程称为“tick”。tick 信号沿树向下传播,根据一组规则激活特定路径上的节点。每个节点在完成后,都会向其父节点返回一个状态:

父节点使用这些状态来决定接下来 tick 哪个子节点。这种连续的自上而下的重新评估使 BT 能够对世界中不断变化的条件做出惊人的反应。

行为树的核心组件

每个行为树都由几种基本类型的节点构成。理解这些构建块是掌握系统的关键。

1. 叶节点:动作和条件

叶节点是树的端点——它们是执行任务或检查条件的实际工作者。它们没有子节点。

2. 组合节点:控制流

组合节点是树的管理者。它们有一个或多个子节点,并使用一组特定的规则来决定执行哪个子节点。它们定义了 AI 的逻辑和优先级。

3. 装饰器节点:修饰符

装饰器节点只有一个子节点,用于修改该子节点的行为或结果。它们添加了一个强大的控制和逻辑层,而不会使树变得混乱。

将所有内容放在一起:一个实际示例

让我们为一个简单的第一人称射击游戏中的敌方士兵 AI 设计一个行为树。所需的行为是:如果士兵可见,则士兵的首要任务是攻击玩家。如果玩家不可见,士兵应在指定区域巡逻。如果在战斗中士兵的生命值降低,他们应该寻找掩护。

以下是我们如何在行为树中构建此逻辑(从上到下读取,缩进显示层次结构):

Root (Selector)
  |-- Low Health Escape (Sequence)
  |   |-- IsHealthLow? (Condition)
  |   |-- FindCoverPoint (Action) -> returns RUNNING while moving, then SUCCESS
  |   `-- TakeCover (Action)
  |
  |-- Engage Player (Sequence)
  |   |-- IsPlayerVisible? (Condition)
  |   |-- IsWeaponReady? (Condition)
  |   |-- Combat Logic (Selector)
  |   |   |-- Shoot At Player (Sequence)
  |   |   |   |-- IsPlayerInLineOfSight? (Condition)
  |   |   |   `-- Shoot (Action)
  |   |   `-- Move To Attack Position (Sequence)
  |   |       |-- Inverter(IsPlayerInLineOfSight?) (Decorator + Condition)
  |   |       `-- MoveTowardsPlayer (Action)
  |
  `-- Patrol (Sequence)
      |-- GetNextPatrolPoint (Action)
      `-- MoveToPoint (Action)

它在每次“tick”上的工作方式:

  1. Root Selector 开始。它尝试它的第一个子节点,`Low Health Escape` 序列。
  2. `Low Health Escape` 序列首先检查 `IsHealthLow?`。如果生命值不高,则此条件返回 `FAILURE`。整个序列失败,控制返回到根。
  3. Root Selector,看到它的第一个子节点失败,移动到它的第二个子节点:`Engage Player`。
  4. `Engage Player` 序列检查 `IsPlayerVisible?`。如果不是,它会失败,根移动到 `Patrol` 序列,导致士兵和平巡逻。
  5. 但是,如果 `IsPlayerVisible?` 成功,则序列继续。它检查 `IsWeaponReady?`。如果成功,它会继续到 `Combat Logic` 选择器。此选择器将首先尝试 `Shoot At Player`。如果玩家在视线中,则执行 `Shoot` 动作。
  6. 如果在战斗中,士兵的生命值下降,在下一个 tick 上,第一个条件 (`IsHealthLow?`) 将成功。这将导致 `Low Health Escape` 序列运行,使士兵找到并采取掩护。因为根是一个选择器,并且它的第一个子节点现在成功(或正在运行),它甚至永远不会评估 `Engage Player` 或 `Patrol` 分支。这就是如何自然地处理优先级。

这种结构清晰、易于阅读,最重要的是,易于扩展。想要添加一个投掷手榴弹的行为?您可以将另一个序列插入到 `Combat Logic` 选择器中,其优先级高于射击,并具有自己的条件(例如,`IsPlayerInCover?`、`HasGrenade?`)。

行为树与有限状态机:复杂性的明显赢家

让我们正式比较一下:

特征 行为树 (BTs) 有限状态机 (FSMs)
模块化 非常高。子树(例如,“寻找健康包”序列)可以创建一次,并在许多不同的 AI 中或在同一树的不同部分中重用。 低。逻辑嵌入在状态和转换中。重用行为通常意味着复制状态及其连接。
可扩展性 优秀。添加新行为就像在树中插入一个新分支一样简单。对逻辑其余部分的影响是局部的。 差。随着状态的添加,潜在转换的数量可能会呈指数增长,从而导致“状态爆炸”。
反应性 固有地反应。树从根开始在每次 tick 时重新评估,从而可以根据定义的优先级立即对世界变化做出反应。 反应性较差。代理“卡在”其当前状态,直到触发特定的预定义转换。它不会不断地重新评估其总体目标。
可读性 高,尤其是在使用可视化编辑器的情况下。分层结构清楚地显示了优先级和逻辑流程,即使对于非程序员(如游戏设计师)来说,也很容易理解。 随着复杂性的增加而降低。复杂 FSM 的可视化图形看起来像一盘意大利面条。

游戏以外的应用:机器人技术和模拟

虽然行为树在游戏行业中声名鹊起,但它们的效用远不止于此。任何需要自主、面向任务的决策的系统都是 BT 的主要候选者。

挑战和最佳实践

尽管行为树功能强大,但也并非没有挑战。

最佳实践:

  1. 保持浅层:优先选择较宽的树而不是较深的树。深度嵌套的逻辑可能难以理解。
  2. 拥抱模块化:为常见的任务(如导航或库存管理)构建小的、可重用的子树。
  3. 使用黑板:通过使用黑板来获取所有状态信息,将树的逻辑与代理的数据分离。
  4. 利用可视化编辑器:诸如内置于 Unreal Engine 中的工具或 Unity 的 Behavior Designer 之类的资产非常宝贵。它们允许快速原型设计、轻松可视化以及程序员和设计师之间更好的协作。

未来:行为树和机器学习

行为树不会与现代机器学习 (ML) 技术竞争;它们是互补的。混合方法通常是最强大的解决方案。

这种混合模型结合了行为树的可预测、可控和设计师友好的结构与机器学习的细微、自适应能力。

结论:现代 AI 的重要工具

行为树代表了从有限状态机的严格限制向前迈出的重要一步。通过为决策提供模块化、可扩展且高度可读的框架,它们使开发人员和设计师能够创建在现代技术中看到的一些最复杂和最可信的 AI 行为。从轰动一时游戏中的狡猾敌人到未来工厂中的高效机器人,行为树提供了将简单代码转化为智能行动的逻辑骨干。

无论您是经验丰富的 AI 程序员、游戏设计师还是机器人工程师,掌握行为树都是对基础技能的投资。它是一种弥合简单逻辑和复杂智能之间差距的工具,它在自主系统世界中的重要性只会继续增长。