他喵的又在搞飛機了..=ω=a
原文網址:http://blog.udn.com/andy840119/106546228
列印日期:2026/01/15
[機器學習][教學] 如何建置MarI/O,透過機器學習玩模擬器內的遊戲
2017/07/16 19:01:54

前言 : 


最近終於找到工作了(灑花


不過公司有夠遠,就算騎腳踏車(所有不才能夠使用的交通工具中最快的)也要半小時左右


.


不過工作目前還蠻輕鬆的


(應該是)不用加班


程式碼看起來也還算乾淨


可喜可賀


.




正文 : 


https://www.youtube.com/watch?v=qv6UVOQ0F44


話說最近看到這個影片


(如果會過來這邊的估計都有看過這影片吧


.


簡單來說,就是透過機器學習的方式


讓電腦自動玩模擬器內的遊戲


.



遊戲畫面內左上角的圖是電腦實際看到的東西


後來翻了下程式碼是透過記憶體位址去抓的樣子,不是用截圖看顏色的方式


白色是障礙物


黑色是敵人,或是道具


.


右邊是可以按的按鈕


.


然後中間各種顏色的線


看起來像機器學習出來的線(不才不太確定)


只要在線上面有物件


就會觸發按鈕


.


例如說如果螢幕上從左邊數來第三格


由上往下數第五個有東西


就觸發按鈕A...的樣子


.


如果不才是透過牆壁上或是桌子上有東西


才會連想到該撿起地板上的東西


估計會被打死吧wwwww


.


雖然這也算是機器學習的一種就是了


如果以不能把遊戲規則(包含這是橫向卷軸遊戲這件事)寫在程式碼內的話


目前也沒想出有啥比較好的方式


.


簡單來說設定Fitness數字越高(表示人物走到越右邊,也就越接近終點)


就代表越結果越成功


然後失敗條件就是死掉或是待在同個地方太久


.


在每次失敗後都會修正參數


例如修正觸發按鈕的位置等等


.


技術部分說完了


接下來來說一下該怎麼建置環境


.


因為建置環境有點麻煩


所以不才全部包成一份直接給大家使用


.


https://drive.google.com/open?id=0B3hpPe6AAVmzR0RaLVh0Y3l2akE



傳送門


.


首先先打開程式(EmuHawk.exe)


.



然後把NES_ROM 資料夾裡面的遊戲


Super Mario Bros..nes


或是 Super Mario World (USA).smc


其中一個拖移到視窗中


就會在


.



然後點開模擬器中的Tool >> Lua


.



就會出現視窗


簡單來說這個視窗是跑腳本用的


然後把Lua_MachineLearngin >> neatevolve.lua 拖曳進去


.



如果沒問題的話就會開始跑了



然後會多出一個視窗


.



這個是控制台的部分


點開"show Map " 可以看到機器人看到的地圖(左邊有黑白格子的那個)


點開"Show M-Rates" 可以看到下面的參數


.



然後就開始給他跑吧


電腦一開始很笨,連要按按鈕都不知道


不過之後會開始學習


跑個幾百次後就會開始知道要往右邊移動


.


不過不知道為啥就算有存檔


下一次打開腳本時還是會重新學習


.



然後如果覺得跑得有夠慢,可以打開模擬器的View>> speed


我是直接調成400%,不然會跑到天荒地老


快轉對學習結果不會有影響


.


以上


.



然後如果希望機器學習玩其他關卡


要自己玩到那一關後


選擇File >> SaveState


.


遊戲存檔應該是放在NES 或是 SNES 的State 資料夾內


然後改存檔名稱和副檔名


附檔名要記得改,原本的State是大寫,要改成小寫


.


如果是Super Mario Bros..nes就改 SMB1-1.state 


如果是 Super Mario World (USA).smc 就改 DP1.state


.


目前只支援這兩款遊戲


看之後作者會不會新增其他遊戲吧


.


以上


.


然後之後如果有時間再翻一下程式碼好了


.