能玩Super Mario World的人工智能MarI/O
這篇文章是我嘗試的記錄,所以夾雜較多的廢話,見諒!
在開源雜志oszine的網站上有這么一篇文章:
文章大意是介紹了一個開源的AI:MarI/O。MarI/O只有短短的一千多行代碼,但是卻能通過不斷地試錯和學習找出通關方法。
MarI/O只有幾個簡單的參數,它只是通過嘗試一切它能做出的動作。其中有一個“Fitness”值,只有當馬里奧向右移動時值才會增加。而MarI/O的設定是使得Fitness值不斷增加,這就會促使它向右移動。
在周四(11.12)晚上,我看到了這篇文章,當時就覺得很有趣,所以就復制了源代碼后開始嘗試。
源代碼是用腳本語言Lua寫的,通過一個的模擬器the BizHawk emulator運行游戲“Super Mario World (USA)"(簡稱SMW)或"Super Mario Bro."并調用腳本就可以在自己的電腦上運行MarI/O。
一開始我沒有留心源碼上的英文注釋,以為隨便找個模擬器和馬里奧的游戲就可以運行,事實證明我想得太簡單了。
由于我前段時間有接觸過Lua,電腦上也有Lua的運行環境,所以我也沒想太多。誰知道模擬器和游戲下載好后,雙擊Lua腳本,結果就呵呵了,一閃而過,然而啥事都沒有,想象中高大上的MarI/O也沒有出來。
沒辦法,硬著頭皮看那段英文注釋。在注釋中我得到了兩個重要信息,一個是模擬器,一個是游戲版本。得到了這兩個信息后,我馬上打開瀏覽器,Ctrl + V,百度谷歌一起搜,download了BizHawk和SMW,然后就開始了第二次嘗試。
然而這次嘗試還是失敗告終,原因之后說。
第二天我試著手打了一千多行源代碼,因為我懷疑是復制的問題導致腳本運行不了。誰知道手打完了,結果還是一樣。崩潰的心啊,嘩啦啦碎了一地。這時候只有再次祭出百度谷歌大法了。
我在伯樂在線上搜到這篇文章,里面也貼出了源代碼,當時我心想有沒有可能是oszine上的源碼有錯呢,然后便復制了伯樂在線那篇文章里的源代碼。結果真的跑起來了,當時那個興奮勁呀!(沒想到真的是源碼有錯,浪費了一天--!!!)
其實腳本能跑之后還有點小波折,就是一開始的SMW運行這個腳本的話會出現內存溢出的問題,所以我又重新下了一個SMW。
歷經波折,我的MarI/O昨晚也開始跑起來了,我果斷地讓它跑個通宵,還開了四倍速。到了下午(11.14),它已經有了百分之七八十的通過概率了。
MarI/O的嘗試過程超級有趣,看著它做出嘗試的時候,我想到了一個名詞——獎勵機制。同時也想到了從圖書館借的那本《通靈芯片——計算機運作的簡單原理》里面的第八章:自學習與自適應的計算機的內容。
然后我就有了一個想法,就是可以制造一個會做出簡單動作的機器人,它會嘗試一切自己能夠做的動作,通過識別人類的語音來判斷自己的行為是否正確,然后保留正確的動作,改變錯誤的動作。通過不斷地試錯與學習,是不是就會成為智能機器人呢?(笑)
其實獎勵機制讓我想到的還有一個人的成長過程。當一個嬰孩誕生在這個世界上時,他就開始了不斷地嘗試探索這個世界,以及通過周圍人的反饋去改變自己的行為,不斷地學習,這是不是很想MarI/O的成長過程呢?
一開始嬰孩腦海里也是一片空白,什么概念都沒有,存在的只有本能——尋找對自己有益的。MarI/O一開始也不知道怎么去通關一個游戲,它的本能就是去是"Fitness值"增長。
嬰孩通過嘗試自己能夠做出的動作來使得這個世界有所反應,然后他根據反饋去調整自己,通過不斷地學習,他也就擁有了自我的判斷能力。MarI/O也是如此,從一開始在原地上下左右望和跳,發現了向右可以增長"Fitness值",便開始了它的通關之路。
啰啰嗦嗦說了這么多也不容易呀!(笑)
附上下載鏈接,有興趣的人也可以試試,看著馬里奧在不斷地嘗試真的是很有趣的事情!(笑)
PS:NEAT的意思如下
?這種學習方式稱之為神經網絡進化拓撲結構(NeuroEvolution of Augmenting Topologies,簡稱NEAT),雖然這并不是一項新技術,但是在這里,作者卻將其使用的非常高效。在一千多行Lua代碼下,即實現了與估值四億美金Deepmind類似的效果,不可不謂十分之神奇。?????--www.oszine.com
PPS:運行MarI/O前需要自己創建一個叫做"DP1.state"的存檔文件(SMB是"SMB1-1.state"文件),并將之復制到Lua目錄下和BizHawk根目錄下。而且最好是進入了關卡內的存檔。
最后附上一些圖片:
源碼
游戲界面
打開游戲ROM
Tools選項
腳本運行框(Lua Console)
一開始蠢萌蠢萌的MarI/O
學聰明的MarI/O(在經過24個遍歷輪回后--!!)
四倍速