Facebook开源游戏平台ELF:一个用于实时战略游戏研究的轻量级平台
时间:2022-04-28
本文章向大家介绍Facebook开源游戏平台ELF:一个用于实时战略游戏研究的轻量级平台,主要内容包括代码结构、ELF代码结构如下。、基本用法、下面是ELF的伪代码。、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
ELF是一个用于游戏研究的应用广泛的(Extensive)、轻量级的(Lightweight)、灵活的(Flexible)平台,特别适用于实时战略(RTS)游戏。在C++方面,ELF采用C++线程来并发运行多个游戏。在Python方面,ELF可以一次性返回一批游戏状态,使其对现代RL(强化学习)非常友好。另一方面,在其他平台(例如OpenAI Gym)中,一个Python接口只能包含一个游戏实例。这使得游戏的并发运行有点复杂,而这又是许多现代强化学习算法的要求。
对于RTS游戏的研究,ELF配备了一个快速的RTS引擎,以及三个具体的实例环境:MiniRTS、抢旗帜和塔防。 MiniRTS具有实时战略游戏的所有关键特点,包括收集资源、建筑设施和部队、侦察可感知地区以外的未知地区、防御或攻击敌人。用户可以访问其内部表现形式,并可以随意更改游戏设置。
ELF具有以下几个特点:
- 广泛性:任何具有C/C++接口的游戏都可以通过编写一个简单的包装器来嵌入到这个框架中来。例如,我们已经将Atari游戏结合到我们的框架中,并可以看到每个核心的模拟速度与单核版本相当,因此这比使用多处理器或Python多线程的实现要快得多。
- 轻量级:ELF运行速度非常快,开销很小。基于RTS引擎的简单的游戏(MiniRTS)在MacBook Pro上运行的话,每个核可以跑出每秒40K帧的速度。如果是从头开始训练一个模型,则使用6个CPU和1个GPU需花费一天的时间。
- 灵活性:环境和actor(演员,译者注:可以理解为执行某些固定操作的独立单元)之间的搭配非常灵活,例如,一个环境对应一个代理(例如Vanilla A3C)、一个环境对应多个代理(例如自动播放/MCTS)的,或多个环境对应一个actor的(例如, BatchA3C、GA3C)。此外,任何构建在RTS引擎顶层的游戏都可以完全访问其内部表示和动态。除了高效的模拟器,我们还提供了一个轻巧而又强大的强化学习框架。该框架可以承载大多数现有的RL算法。在这个开源版本中,我们提供了用PyTorch编写的最先进的Actor-Critic(演员-评判家)算法。
代码结构
ELF代码结构如下。
- 文件夹
elf
下的代码用于处理并发仿真,与游戏无关。 - 文件夹
atari
包含了游戏Atari(需要ALE)的Python包装器和模型。 - 文件夹
rts/engine
包含了RTS引擎。rts/game_MC
、rts/game_CF
和rts/game_TD
是基于此引擎构建的三个游戏。
基本用法
下面是ELF的伪代码。
初始化代码如下所示:
主循环也很简单:
依赖
需要使用支持C++ 11的C++编译器(例如,gcc 4.9)。依赖以下库:
参考文献
在你使用ELF的时候,请参考arXiv的相关文章(https://arxiv.org/abs/1707.01067)。
- 剑指OFFER之丑数(九度OJ1214)
- 剑指OFFER之把数组排成最小的数(九度OJ1504)
- 剑指OFFER之从1到n中出现1的次数(九度OJ1373)
- 剑指OFFER之最大子向量和(连续子数组的最大和)(九度OJ1372)
- 剑指OFFER之最小的K个数(九度OJ1371)
- 剑指OFFER之数组中出现次数超过一半的数字(九度OJ1370)
- 如何成为一名10x的数据分析师?
- 肥料生产商全套三拼在手:拟融资1.47亿元
- 《外媒Cointelegraph专访Qtum量子链Jordan Earls》—浅谈目前Dapps的主要问题
- ASP .Net Core 2.0 修改默认端口
- 不满一岁的潜力股:2017年3D打印机器人盘点
- Reporting Service报表开发
- 不要信任云:这不只是安全的问题
- C#温故而知新—闲话.Net
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法