ELF是一个用于游戏研究的应用普遍的(Extensive)、轻量级的(Lightweight)、灵活的(Flexible)平台,特别适用于实时战略(RTS)游戏。在C++方面,ELF采用C++线程来并发运行多个游戏。在Python方面,ELF能够一次性返回一批游戏状态,使其对现代RL(强化学习)很是友好。另外一方面,在其余平台(例如OpenAI Gym)中,一个Python接口只能包含一个游戏实例。这使得游戏的并发运行有点复杂,而这又是许多现代强化学习算法的要求。python
对于RTS游戏的研究,ELF配备了一个快速的RTS引擎,以及三个具体的实例环境:MiniRTS、抢旗帜和塔防。 MiniRTS具备实时战略游戏的全部关键特色,包括收集资源、建筑设施和部队、侦察可感知地区之外的未知地区、防护或攻击敌人。用户能够访问其内部表现形式,并能够随意更改游戏设置。git
ELF具备如下几个特色:github
普遍性:任何具备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代码结构以下。 app
elf
下的代码用于处理并发仿真,与游戏无关。atari
包含了游戏Atari(须要ALE)的Python包装器和模型催收系统软件。rts/engine
包含了RTS引擎。 rts/game_MC
、 rts/game_CF
和 rts/game_TD
是基于此引擎构建的三个游戏。下面是ELF的伪代码。框架
初始化代码以下所示:ide
# We run 1024 games concurrently. num_games = 1024 # Wait for a batch of 256 games. batchsize = 256 # The return states contain key 's', 'r' and 'terminal' # The reply contains key 'a' to be filled from the Python side. # The definitions of the keys are in the wrapper of the game. input_spec = dict(s='', r='', terminal='') reply_spec = dict(a='') context = Init(num_games, batchsize, input_spec, reply_spec)
主循环也很简单:oop
# Start all game threads and enter main loop. context.Start() while True: # Wait for a batch of game states to be ready # These games will be blocked, waiting for replies. batch = context.Wait() # Apply a model to the game state. The output has key 'pi' # You can do whatever you want here. E.g., applying your favorite RL algorithms. output = model(batch) # Sample from the output to get the actions of this batch. reply['a'][:] = SampleFromDistribution(output) # Resume games. context.Steps() # Stop all game threads. context.Stop()
须要使用支持C++ 11的C++编译器(例如,gcc 4.9)。依赖如下库: