python玩轉(zhuǎn)街機游戲,操作親民!

這是一個允許你在幾乎任何街機游戲中訓(xùn)練你的強化學(xué)習(xí)算法的Python庫,它目前在Linux系統(tǒng)上可用。通過這個工具包,你可以定制算法逐步完成游戲過程,同時接收每一幀的數(shù)據(jù)和內(nèi)部存儲器地址值以跟蹤游戲狀態(tài),以及發(fā)送與游戲交互的動作。

安裝

GitHub地址:github.com/M-J-Murray/MAMEToolkit/blob/master/README.md

你可以用pip安裝這個庫,只需運行以下命令:

pip install MAMEToolkit

演示:街霸

街霸是史上最經(jīng)典的游戲之一。現(xiàn)在工具包內(nèi)包含的街霸版本是街頭霸王3:三度沖擊(Japan 990608, NO CD),我們以此為例,用以下代碼寫一個隨機智能體:

支持hogwild!

hogwild!? Niu等人引入了一個叫做 Hogwild! 的更新策略,可以使 SGD 可以在多 CPU 上并行更新。處理器在無需對參數(shù)加鎖的情況下就可以訪問共享內(nèi)存。但僅在輸入的是稀疏數(shù)據(jù)時才有效,因為每次更新僅修改所有參數(shù)的一小部分。他們展示了在這種情況下,更新策略幾乎可以達到一個最優(yōu)的收斂率,因為處理器不太可能覆蓋掉有用的信息。


建立自己的游戲環(huán)境

這個工具包之所以易于上手,是因為它和模擬器本身不需要太多交互,只需注意兩點——一是查找你關(guān)注的內(nèi)部狀態(tài)相關(guān)聯(lián)的內(nèi)存地址值,二是用選取的環(huán)境跟蹤狀態(tài)。你可以用MAME Cheat Debugger,它會反饋游戲的內(nèi)存地址值如何隨時間變化。如果要創(chuàng)建游戲模擬,你得先獲得正在模擬的游戲的ROM,并知道MAME使用的游戲ID,比如街霸的ID是'sfiii3n'。

游戲ID

你可以通過運行以下代碼找到游戲的ID

這個命令會打開MAME仿真器。你可以搜索游戲列表以找到想要的游戲,游戲的ID位于游戲標(biāo)題末尾的括號中。

內(nèi)存地址

如果獲得了ID,也有了想要跟蹤的內(nèi)存地址,你可以開始模擬:

這會啟動仿真器,并在工具包連接到模擬器進程時暫停。

分步運行仿真器

連接工具箱后,你可以分步運行仿真器:

step函數(shù)會把幀數(shù)據(jù)作為NumPy矩陣返回,同時,它也會返回該時間步長的所有內(nèi)存地址整數(shù)值。

如果要向仿真器輸入動作,你還需要確定游戲支持的輸入端口和字段。比如玩街霸需要先投幣,這個代碼是:

要確定哪些端口可用,請使用list actions命令:

下面這個返回的列表就包含街霸環(huán)境中可用于向步驟函數(shù)發(fā)送動作的所有端口和字段:

[

{'port':':scsi:1:cdrom:SCSI_ID','field':'SCSI ID'},{'port':':INPUTS','field':'P2 Jab Punch'},{'port':':INPUTS','field':'P1 Left'},{'port':':INPUTS','field':'P2 Fierce Punch'},{'port':':INPUTS','field':'P1 Down'},{'port':':INPUTS','field':'P2 Down'},{'port':':INPUTS','field':'P2 Roundhouse Kick'},{'port':':INPUTS','field':'P2 Strong Punch'},{'port':':INPUTS','field':'P1 Strong Punch'},{'port':':INPUTS','field':'2 Players Start'},{'port':':INPUTS','field':'Coin 1'},{'port':':INPUTS','field':'1 Player Start'},{'port':':INPUTS','field':'P2 Right'},{'port':':INPUTS','field':'Service 1'},{'port':':INPUTS','field':'Coin 2'},{'port':':INPUTS','field':'P1 Jab Punch'},{'port':':INPUTS','field':'P2 Up'},{'port':':INPUTS','field':'P1 Up'},{'port':':INPUTS','field':'P1 Right'},{'port':':INPUTS','field':'Service Mode'},{'port':':INPUTS','field':'P1 Fierce Punch'},{'port':':INPUTS','field':'P2 Left'},{'port':':EXTRA','field':'P2 Short Kick'},{'port':':EXTRA','field':'P2 Forward Kick'},{'port':':EXTRA','field':'P1 Forward Kick'},{'port':':EXTRA','field':'P1 Roundhouse Kick'},{'port':':EXTRA','field':'P1 Short Kick'}

]

仿真器類還有一個frame_ratio參數(shù),可用于調(diào)整算法所見的幀速率。默認(rèn)情況下,MAME以每秒60幀的速度生成幀,如果你覺得這太多了,想把它改成每秒20幀,可以輸入以下代碼:

MAME性能基準(zhǔn)測試

目前這個工具包的開發(fā)和測試已在8核AMD FX-8300 3.3GHz CPU以及3GB GeForce GTX 1060 GPU上完成。在使用單個隨機智能體的情況下,街頭霸王環(huán)境可以以正常游戲速度的600%+運行。而如果是用8個隨機智能體進行hogwild!訓(xùn)練,環(huán)境可以以正常游戲速度的300%+運行。

ConvNet智能體

為了確保工具包能夠訓(xùn)練算法,作者還設(shè)置了一個簡單的5層ConvNet,只需少量調(diào)整,你就可以用它進行測試。在街霸實驗中,這個算法能夠成功學(xué)習(xí)到游戲的一些簡單技巧,比如連擊(combo)和格擋(blocking)。街霸本身的游戲機制是分成10個關(guān)卡(難度遞增),玩家在每個關(guān)卡都要迎戰(zhàn)不同的對手。剛開始的時候,這個智能體平均只能打到第2關(guān)。但在經(jīng)過2200次訓(xùn)練后,它平均能打到第5關(guān)。


至于智能體的學(xué)習(xí)率,它是用每一局智能體所造成的凈傷害和所承受的傷害來計算的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容