您好,登錄后才能下訂單哦!
這是一個(gè)允許你在幾乎任何街機(jī)游戲中訓(xùn)練你的強(qiáng)化學(xué)習(xí)算法的Python庫(kù),它目前在Linux系統(tǒng)上可用。通過(guò)這個(gè)工具包,你可以定制算法逐步完成游戲過(guò)程,同時(shí)接收每一幀的數(shù)據(jù)和內(nèi)部存儲(chǔ)器地址值以跟蹤游戲狀態(tài),以及發(fā)送與游戲交互的動(dòng)作。
跟大家推薦一下我的Python學(xué)習(xí)交流裙【 784758214 】?jī)?nèi)有安裝包和學(xué)習(xí)視頻資料,零基礎(chǔ),進(jìn)階,,大牛在線(xiàn)解答疑問(wèn)。希望可以幫助你快速了解Python、學(xué)習(xí)python
安裝
GitHub地址:github.com/M-J-Murray/MAMEToolkit/blob/master/README.md
你可以用pip安裝這個(gè)庫(kù),只需運(yùn)行以下命令:
pip install MAMEToolkit
演示:街霸
街霸是史上最經(jīng)典的游戲之一?,F(xiàn)在工具包內(nèi)包含的街霸版本是街頭霸王3:三度沖擊(Japan 990608, NO CD),我們以此為例,用以下代碼寫(xiě)一個(gè)隨機(jī)智能體:
import randomfrom MAMEToolkit.sf_environment import Environment roms_path = "roms/"env = Environment("env1", roms_path) env.start()while True: move_action = random.randint(0, 8) attack_action = random.randint(0, 9) frames, reward, round_done, stage_done, game_done = env.step(move_action, attack_action) if game_done: env.new_game() elif stage_done: env.next_stage() elif round_done: env.next_round()
支持hogwild!
hogwild!? Niu等人引入了一個(gè)叫做 Hogwild! 的更新策略,可以使 SGD 可以在多 CPU 上并行更新。處理器在無(wú)需對(duì)參數(shù)加鎖的情況下就可以訪(fǎng)問(wèn)共享內(nèi)存。但僅在輸入的是稀疏數(shù)據(jù)時(shí)才有效,因?yàn)槊看胃聝H修改所有參數(shù)的一小部分。他們展示了在這種情況下,更新策略幾乎可以達(dá)到一個(gè)最優(yōu)的收斂率,因?yàn)樘幚砥鞑惶赡芨采w掉有用的信息。
from threading import Threadimport randomfrom MAMEToolkit.sf_environment import Environment def run_env(env): env.start() while True: move_action = random.randint(0, 8) attack_action = random.randint(0, 9) frames, reward, round_done, stage_done, game_done = env.step(move_action, attack_action) if game_done: env.new_game() elif stage_done: env.next_stage() elif round_done: env.next_round() def main(): workers = 8 # Environments must be created outside of the threads roms_path = "roms/" envs = [Environment(f"env{i}", roms_path) for i in range(workers)] threads = [Thread(target=run_env, args=(envs[i], )) for i in range(workers)] [thread.start() for thread in threads]
建立自己的游戲環(huán)境
這個(gè)工具包之所以易于上手,是因?yàn)樗湍M器本身不需要太多交互,只需注意兩點(diǎn)——一是查找你關(guān)注的內(nèi)部狀態(tài)相關(guān)聯(lián)的內(nèi)存地址值,二是用選取的環(huán)境跟蹤狀態(tài)。你可以用MAME Cheat Debugger,它會(huì)反饋游戲的內(nèi)存地址值如何隨時(shí)間變化。如果要?jiǎng)?chuàng)建游戲模擬,你得先獲得正在模擬的游戲的ROM,并知道MAME使用的游戲ID,比如街霸的ID是'sfiii3n'。
游戲ID
你可以通過(guò)運(yùn)行以下代碼找到游戲的ID
from MAMEToolkit.emulator import Emulator emulator = Emulator("env1", "", "", memory_addresses)
這個(gè)命令會(huì)打開(kāi)MAME仿真器。你可以搜索游戲列表以找到想要的游戲,游戲的ID位于游戲標(biāo)題末尾的括號(hào)中。
內(nèi)存地址
如果獲得了ID,也有了想要跟蹤的內(nèi)存地址,你可以開(kāi)始模擬:
from MAMEToolkit.emulator import Emulatorfrom MAMEToolkit.emulator import Address roms_path = "roms/"game_id = "sfiii3n"memory_addresses = { "fighting": Address('0x0200EE44', 'u8'), "winsP1": Address('0x02011383', 'u8'), "winsP2": Address('0x02011385', 'u8'), "healthP1": Address('0x02068D0B', 's8'), "healthP2": Address('0x020691A3', 's8') } emulator = Emulator("env1", roms_path, "sfiii3n", memory_addresses)
這會(huì)啟動(dòng)仿真器,并在工具包連接到模擬器進(jìn)程時(shí)暫停。
連接工具箱后,你可以分步運(yùn)行仿真器:
data = emulator.step([]) frame = data["frame"] is_fighting = data["fighting"] player1_wins = data["winsP1"] player2_wins = data["winsP2"] player1_health = data["healthP1"] player2_health = data["healthP2"]
step函數(shù)會(huì)把幀數(shù)據(jù)作為NumPy矩陣返回,同時(shí),它也會(huì)返回該時(shí)間步長(zhǎng)的所有內(nèi)存地址整數(shù)值。
如果要向仿真器輸入動(dòng)作,你還需要確定游戲支持的輸入端口和字段。比如玩街霸需要先投幣,這個(gè)代碼是:
from MAMEToolkit.emulator import Action insert_coin = Action(':INPUTS', 'Coin 1') data = emulator.step([insert_coin])
要確定哪些端口可用,請(qǐng)使用list actions命令:
from MAMEToolkit.emulator import list_actions roms_path = "roms/"game_id = "sfiii3n"print(list_actions(roms_path, game_id))
下面這個(gè)返回的列表就包含街霸環(huán)境中可用于向步驟函數(shù)發(fā)送動(dòng)作的所有端口和字段:
[ {'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'} ]
仿真器類(lèi)還有一個(gè)frame_ratio參數(shù),可用于調(diào)整算法所見(jiàn)的幀速率。默認(rèn)情況下,MAME以每秒60幀的速度生成幀,如果你覺(jué)得這太多了,想把它改成每秒20幀,可以輸入以下代碼:
from MAMEToolkit.emulator import Emulator emulator = Emulator(roms_path, game_id, memory_addresses, frame_ratio=3)
目前這個(gè)工具包的開(kāi)發(fā)和測(cè)試已在8核AMD FX-8300 3.3GHz CPU以及3GB GeForce GTX 1060 GPU上完成。在使用單個(gè)隨機(jī)智能體的情況下,街頭霸王環(huán)境可以以正常游戲速度的600%+運(yùn)行。而如果是用8個(gè)隨機(jī)智能體進(jìn)行hogwild!訓(xùn)練,環(huán)境可以以正常游戲速度的300%+運(yùn)行。
為了確保工具包能夠訓(xùn)練算法,作者還設(shè)置了一個(gè)簡(jiǎn)單的5層ConvNet,只需少量調(diào)整,你就可以用它進(jìn)行測(cè)試。在街霸實(shí)驗(yàn)中,這個(gè)算法能夠成功學(xué)習(xí)到游戲的一些簡(jiǎn)單技巧,比如連擊(combo)和格擋(blocking)。街霸本身的游戲機(jī)制是分成10個(gè)關(guān)卡(難度遞增),玩家在每個(gè)關(guān)卡都要迎戰(zhàn)不同的對(duì)手。剛開(kāi)始的時(shí)候,這個(gè)智能體平均只能打到第2關(guān)。但在經(jīng)過(guò)2200次訓(xùn)練后,它平均能打到第5關(guān)。
至于智能體的學(xué)習(xí)率,它是用每一局智能體所造成的凈傷害和所承受的傷害來(lái)計(jì)算的。
跟大家推薦一下我的Python學(xué)習(xí)交流群【 784758214 】?jī)?nèi)有安裝包和學(xué)習(xí)視頻資料,零基礎(chǔ),進(jìn)階,,大牛在線(xiàn)解答疑問(wèn)。希望可以幫助你快速了解Python、學(xué)習(xí)python
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。