機器學習模式 - LanKuDot/MLGame GitHub Wiki

MLGame API 主要幫助遊戲以機器學習模式執行,也就是分離遊戲的控制部分,將遊戲與玩家的程式執行在不同的 process 中,並提供兩者之間的溝通介面。

以下介紹:

  • 運作流程:MLGame 如何執行遊戲並與玩家程式互動
  • 玩家程式與機器學習端:MLGame 如何配置玩家程式到機器學習端

運作流程

在機器學習模式下,遊戲會分成:

  • 遊戲端:遊戲主要運作的部分;
  • 機器學習端(控制端):玩家撰寫程式玩遊戲的部分。因為可以用機器學習來幫助玩遊戲(當然也可以不用),所以稱為機器學習端。

遊戲執行

MLGame 執行時,會在遊戲端與機器學習端使用專屬的執行類別來控制運作流程,執行類別會呼叫遊戲類別或是 MLPlay 類別來取得所需的物件或是將物件傳給類別。

執行類別之間的運作流程如下圖:

Imgur

流程可以分成兩個階段:

  • 準備階段:遊戲與機器學習端都有各自需要初始化的部分,遊戲端會等待機器學習端準備好才能開始遊戲;
  • 執行階段:遊戲端會從遊戲類別取得場景資訊,將場景資訊傳送給機器學習端。機器學習端將收到的場景資訊傳給 MLPlay 類別,待其處理完資訊後取得產生的指令,並傳送回遊戲端供執行(如果是多人遊戲,所收到的指令會被儲存到 list 中才傳給遊戲類別),持續到遊戲結束。

要注意的是,遊戲端並不會等待機器學習端傳送指令。如果遊戲端檢查沒有指令可收,會產生 None 來更新遊戲。遊戲端等待機器學習端的時間取決於執行遊戲時指定的間隔時間(-f/--fps 選項)。當機器學習端無法及時回傳指令時,就稱為「延遲」。執行階段每執行一次就稱為一個影格,在個別的執行類別中都有一個計數器來紀錄影格數。機器學習端傳送指令時,會包含其紀錄的影格數供遊戲端檢查是否延遲,如果有延遲,MLGame 會輸出訊息告知玩家。

遊戲結束

當遊戲類別的 update() 回傳 "RESET" 或是 "QUIT" 時,遊戲端會判定遊戲此時結束,而進行遊戲收尾與重設階段。流程如下:

Imgur

流程一樣分成兩個階段:

  • 遊戲收尾階段:遊戲端向遊戲類別取得場景資訊,此時的場景資訊必須要有遊戲結束的資訊(例如:有個 status 欄位,其值為 "GAME_OVER"),讓 MLPlay 類別可以判斷遊戲結束,以在 update() 回傳 "RESET" 告知機器學習端要進行重設。由於遊戲端在遊戲結束後,會去取得遊戲最後的場景資訊,所以遊戲端不能在遊戲結束後自行重設,否則取得的場景資訊會是錯的。
  • 重設階段:遊戲端與機器學習端會呼叫個別類別的 reset() 來進行重設。遊戲端重設完成後,一樣會等待機器學習端重設完成,才開始新的一輪遊戲。但是當遊戲類別的 update() 是回傳 "QUIT" 或是執行 MLGame 時指定 -1/--one-shot,則 MLGame 不會執行重設階段,而是直接結束執行。

遊戲紀錄檔

在執行 MLGame 時如果有指定 -r/--record 的話,遊戲端所得到的場景資訊與收到的指令會被儲存起來,在遊戲收尾階段時會匯出到檔案中。詳見遊戲紀錄檔

玩家程式與機器學習端

MLGame 會依照指定的玩家程式順序,依序分配給機器學習端。使用的玩家程式數量不會超過機器學習端的數量,多餘的玩家程式不會被使用。但如果指定的玩家程式數量少於機器學習端的數量,則配置方式與遊戲是否為動態玩家人數有關。

非動態玩家人數

如果遊戲為非動態玩家人數(即 GAME_SETUPdymanic_ml_clientsFalse),則多出來的機器學習端都使用最後一個玩家程式。

Imgur

動態玩家人數

如果遊戲為動態玩家人數(即 GAME_SETUPdymanic_ml_clientsTrue),則多出來的機器學習端不會啟動。

Imgur