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)。依賴如下庫: