#tree-search #multi-agent #mcts #ai #monte-carlo #game-ai #simulation

npc-engine-utils

NPC 引擎的实用模块,提供可重用的支持代码

1个不稳定版本

0.1.0 2022年6月15日

#689 in 算法

MIT/Apache

170KB
3K SLoC

NPC引擎

Build Status

© 2020-2022 苏黎世联邦理工学院和其他贡献者。更多详情见 AUTHORS.txt

由苏黎世联邦理工学院游戏技术中心开发的可定制化蒙特卡洛树搜索 (MCTS) 计划器,具有针对多智能体模拟和涌现叙事的高级功能。

NPC 引擎提供以下功能

  • 领域无关的 MCTS 计划器,
  • 可变持续时间的任务,使其除了计划器外还是调度器,
  • 异构智能体(例如,全局簿记智能体和常规智能体),允许进行干净的领域设计,
  • 支持动态出现和消失的智能体(即使在单个计划树中),
  • 任务变为无效时的行为选择:修剪该子树(如在棋类游戏中),或重新计划(如在模拟中),
  • 除标准滚出外还提供自定义状态值函数,
  • 包含跟踪和以 graphviz 的 dot 格式绘制搜索树等图形的多个调试功能,
  • 包含几个示例、辅助库以及我们研究论文的代码(见下文)。

获取

要获取 NPC 引擎,请克隆此仓库

git clone https://github.com/ethz-gtc/npc-engine.git

请确保您已安装 GIT LFS,您可以在此处阅读如何安装它。如果没有,PNG 文件将无法正确检索,您将看到 PNG 解码错误。

示例

我们提供了几个示例,说明了引擎的各种功能。

要运行示例,您需要安装 Rust

确保您的控制台使用支持Unicode表情符号的字体,因为我们使用表情符号进行可视化。在最近的Linux和MacOS机器上,它们默认支持。在Windows 10及更高版本上,您可以安装最近发布的Windows Terminal,并使用wt

井字棋

cargo run --release --example tic-tac-toe

一个传统的井字棋回合制游戏,您可以与计算机进行互动式游戏。要移动,请输入X Y,其中XY是您移动的坐标(0、1或2)。

源目录:tic-tac-toe

捕获

cargo run --release --example capture

模拟两个代理之间的竞争性战斗,每个代理都试图捕获地点。

代理可以确保地点,收集弹药和医疗包,并互相射击。他们轮流计划。每次任务完成后,模拟输出世界状态和代理状态。

  • 对于世界,它显示了医疗包(❤️)、弹药(•)和捕获地点的状态(⚡)。对于一个捕获地点,"__"表示它不属于任何人,"CX"(X = 0或1)表示一个代理正在捕获它,"HX"(X = 0或1)表示一个代理正在保持该地点。一个保持的地点会在一段时间后带来胜利点。
  • 对于代理,捐赠的"AX"(X为代理ID),以下信息显示:他们的位置(例如0)或位置(例如0-1,如果是移动),他们的健康点(❤️),他们携带的弹药数量(•),以及他们的胜利点数(⚡)。
  • 即将完成的任务将显示,如果由于完成条件自计划以来已更改而导致其执行失败,也会显示。
  • 然后为该代理运行计划,并显示所选任务并排队执行。

此领域展示了各种持续时间的动作,世界代理重生可收集物品,代理消失(死亡时),以及简单执行器工具的使用。

源目录:capture

学习

cargo run --release --example learn

一个一维伐木工模拟,代理的表现随着时间的推移由于自我学习而提高。每次运行后输出收集的木材数量。

代理必须通过在1维世界中砍伐树木来收集木材,同时使用少量的MCTS访问次数。此示例中的状态值函数估计器不是一个标准的 rollout 模拟,而是一个包含两个神经元的单层前馈神经网络。该模拟在多个时期重复进行,每次使用基于MCTS的状态值估计来训练神经网络,以便在下一个时期使用反向传播进行训练。此模拟表明,在数百个时期的过程中,代理的性能——在特定时间段内收集的木材数量——提高了50%以上。

安装了Python 3、scipymatplotlib后,可以使用以下命令查看20次运行的平均性能:

npc-engine-core/examples/learn/plot.py

曲线应该看起来像这样

Wood collected over epochs

源目录:learn

生态系统

cargo run --release --example ecosystem

一个二维生态系统模拟,其中食草动物(🐄)和食肉动物(🐅)吃和死。

世界由一个瓦片地图组成,每个瓦片可以是空地(深绿色)、障碍物(灰色)或草地(绿色)。草地瓦片可以提供1-3单位的食物,用饱和度的增加程度来表示。通过进食,食草动物会减少其站立瓦片上的食物量1单位。食草动物出生时带有5单位食物,可以储存最多5单位食物。食肉动物可以吃相邻瓦片或一个瓦片距离的食草动物。它们还可以以1单位食物的代价跳到一个瓦片距离,包括跳过其他生物,但不能跳过障碍物。食肉动物出生时带有10单位食物,可以储存最多10单位食物。当生物进食时,它们的储存食物会恢复到最大量。每10帧,所有生物消耗1单位食物。如果它们没有食物了,它们就会死亡。

所有生物都在自己的局部世界视图上以多线程方式并行规划。规划持续3帧,其他动作是瞬时的。生物可以看到8个瓦片远处的地图,并考虑3个距离内的其他生物,食草动物分别是6个瓦片,食肉动物分别是3个瓦片。在规划时,如果超过3个其他生物,生物只会考虑最近的3个。它们的规划目标是每轮1000次访问,但如果计算能力不足,规划可能会提前结束。在这种情况下,计划质量会下降。模拟以每秒25帧的速度运行。

一个世界生物,通过一个“步进”动作,每10帧管理每个生物的食物减少量;每30帧为食物为1或2单位的瓦片生长草地。

源代码目录:ecosystem

伐木工

目录:scenario-lumberjacks

在论文《利用高效的规划和轻量级代理定义:迈向涌现叙事的全新途径》中使用的代码,由Raymond等人于2020年发表。这个领域有两个伐木工,其价值函数是收集的总木材量。这两个代理之间没有明确的通信,但由于它们为对方规划,因此出现了一种心智理论。您可以在这个视频中了解这项工作的概述。

要查看此场景的基本运行,请使用以下命令

cargo run --release --bin lumberjacks scenario-lumberjacks/experiments/base.json

您可以通过按“空格”键来逐步进行模拟。有两个代理,红色和黄色,它们依次执行它们的行为。在这个基本场景中,红色代理会收集右边的所有木材,因为它会考虑黄色代理的可能行为,从而以最优顺序收集树木。

可以通过设置带有--s标志的配置参数来非交互式地运行场景

cargo run --release --bin lumberjacks -- -s display.interactive=false scenario-lumberjacks/experiments/base.json

以下是论文中的一些额外有趣的实验

基本竞争

红色代理按照一种顺序收集木材,以防止黄色代理收集任何木材,留下所有木材给自己。

cargo run --release --bin lumberjacks scenario-lumberjacks/experiments/competition-basic/base.json

高级竞争

红色代理通常会将其收集的第一批木材用于建造障碍物,以阻止黄色代理收集更多木材,为自己留下更多。这表明了推理他人和为了更大的、长期的利益而接受短期损失的能力。

cargo run --release --bin lumberjacks scenario-lumberjacks/experiments/barrier/base.json

合作

现在所有与被砍伐的树相邻的代理也会得到一块木材。由于这一点,以及隐含的规划,两个代理同步地砍伐同一棵树。

cargo run --release --bin lumberjacks scenario-lumberjacks/experiments/teamwork-basic/base.json

可持续性

代理可以使用一个水井来浇灌树木,让它重新生长到完整大小。代理不会将树木完全砍倒,而是在树木快要枯死时去井里取水。

cargo run --release --bin lumberjacks scenario-lumberjacks/experiments/optimization/base.json

如果我们还允许代理种植一棵新树(使用一块木头),代理就会砍倒树木,并在靠近水井的地方重新种植一棵。

cargo run --release --bin lumberjacks -- -s features.planting=true scenario-lumberjacks/experiments/optimization/base.json

文档

NPC 引擎由两个包组成:npc-engine-corenpc-engine-utils。可以使用以下命令生成和交互式浏览文档:

cargo doc --open -p npc-engine-core -p npc-engine-utils

关于性能的说明

Rust 严重依赖于编译器优化。请确保在 cargo 调用时包含--release标志以实现高效执行。

生成搜索树图的 PDF

一些示例(生态系统、捕获、井字棋)使用辅助函数plot_tree_in_tmp_with_task_nameplot_tree_in_tmp在您的临时目录中以Graphviz的dot格式生成搜索树的图表。使用生成的.dot文件,您可以使用以下命令创建PDF树:

for file in $(ls *.dot); do dot -Tpdf $file -o `basename -s .dot $file`.pdf; done

请引用我们

如果您在学术环境中使用此软件,请引用我们的论文

@inproceedings{raymond2020leveraging,
	title={Leveraging efficient planning and lightweight agent definition: a novel path towards emergent narrative},
	author={Raymond, Henry and Knobloch, Sven and Z{\"u}nd, Fabio and Sumner, Robert W and Magnenat, St{\'e}phane},
	booktitle={12th Intelligent Narrative Technolgies Workshop, held with the AIIDE Conference (INT10 2020)},
	doi={10.3929/ethz-b-000439084},
	year={2020},
}

感谢及替代方案

我们想感谢Patrick Eppensteiner、Nora Tommila和Heinrich Grattenthaler对此研究项目的贡献。

此工作的某些可能的替代方案(也用Rust编写)包括mctsarborboard-game框架。

许可证

NPC 引擎是免费和开源的!此存储库中的所有代码均在以下两个许可下双许可:

任选其一。

贡献

除非您明确声明,否则,根据Apache-2.0许可证定义,您提交给包括在作品中并由您有意提交的所有贡献均应如上双许可,不附加任何其他条款或条件。

依赖关系

~3–4MB
~77K SLoC