生命遊戲和細胞自動機的學習筆記
Last updated: 23rd. July, 2012
野比 2012 版權所有
(本文為學習筆記,知識淺薄。我會將學習中的實驗記錄和心得記錄在此。)
歡迎對這方面感興趣的愛好者一起研究。
尋求技術指導。
聯系QQ:1429013154
我一直對人工智能很感興趣,苦於數學基礎太差,很多理論方面的東西理解起來十分吃力。最近又翻出以前的學習目標:人工生命。名字挺懸乎,其實很多人都曾和它有過交集,就算沒有用到它進化出的好物種——智能機器人,至少也應該聽過甚至中過它進化的惡劣物種——蠕蟲病毒。
說起人工生命和計算機,就要從計算機歷史的最開始說起。因為計算機之父馮·諾依曼和他的小組成員勃克斯分別撰寫過題為《自我繁衍的自動機理論》和《細胞自動機論文集》的文章,堪稱人工生命最初的狂人。
背景故事就不說了,記在這裏。
人工生命之父——Chris Langton
生命遊戲百科
框架搭建
目前框架已搭建好。C#編寫,.NET 2.0,世界大小30x40。
我的架構和經典架構不同。下面把世界法則對比一下。
經典世界法則如下:
生命視野為1(8格)
生命承受力為3
生命在3時復活
生命在2時不變
其余情況死亡
如果一個細胞周圍有2個細胞為生,則該細胞的生死狀態保持不變。在其它情況下,該細胞為死(即該細胞若原先為生,則轉為死,若原先為死,則保持不變)。
我的世界法則如下:
生命只有上帝創建
生命視野為1(8格)
生命承受力3(否則死亡)
生命不可復活
由於經典法則中所有生命都有機會復活,所以在網上下載的經典實現和絕大部分愛好者實現裏,世界都是被填滿了生命的,通過顏色等「隱藏」死亡的生命,使之「看起來」消失了。我打算設計的是一個模仿真實的世界法則,所以世界裏該空白的地方就不能有生命存在。
這是框架截圖。
下一步的工作
自然隨機數(natrual simulation)
研究並修改世界法則
增加食物概念,生命存活由健康度決定
鄰居可以「殺死」受害者
每個生命增加動態屬性列表
屬性相近的生命有類似的行為
屬性相近的生命會互相靠攏
修改框架,使法則腳本化
需要請教和研究的知識點
怎麽實現記憶(先實現1bit)
怎麽引入進化(最簡單的神經網絡學習)
怎麽實現腳本機制(糾結C#還是Lua)
簡單易行的插件機制(SD架構?MEF?)
Rule Engine
網上的資源
一個用C#實現的標準規則生命遊戲([email protected])
Langton螞蟻的一個粗略實現([email protected])
進展情況
28 May, 2012
1.今天嘗試將世界地圖封裝為控件,失敗了。功能上實現了,但原來2~4%的CPU負荷直接飆升到了25~30%,開銷相當大。具體原因似乎是嵌套調用和太多參數傳遞的問題。而且地圖控件的架構設計也很浪費資源,為每個地圖點緩存了一個Color。此問題留待以後解決。
2.在生物邏輯上加入了自然老化、休息和饑餓捕食的規則。使用了仿真自然隨機數發生器來模擬一切和自然概率(不像System.Random那麽突變)有關的現象,如攻擊判定、進攻或逃跑等。
圖中Legend如下
健康
亞健康
饑餓
Starving
瀕死
邁向生命的第一縷曙光
在增加了健康因素,實驗體會主動覓食,接近並攻擊較弱的實驗體。
在進化的過程中,出現了一些有意思的現象。
有的細胞在非常健康(HP>80+)的時候,也會追著弱小的實驗體「咬」,殺死實驗體後,HP增加不到5點,而代碼中,標稱值是在HP<70時才開始覓食,且會整個吃掉屍體。
有的實驗體甚至有了那麽一點點的「智力」(或者說僅僅是種本能),比如這個第6392代的家夥,它只要吃飽了,就會「繞場一周」,而且總是往墻上撞,企圖逃跑。
隨機數和記憶的加入,立刻讓世界變得絢麗,變化多端。
23rd. July, 2012更新
CSDN網友nanqi0506(神棍,QQ:275096967)制作了一個他的版本:《LifeGame》。簡要摘錄如下,詳情請查閱原文。
細胞屬性
暫時只使用基本的力量、敏捷、智力,屬性影響細胞各個方面。
細胞動作
細胞大多時間在漫步(Wander),但是在有其他細胞攻擊自身時,細胞會出於本能的進行反擊,由於沒有智商(能力),經常會看到兩個細胞致死不休的相互攻擊。當然細胞也會在周圍有其他細胞時主動出擊,或者細胞懶得動(休息)。
細胞視野
細胞所謂的周圍(視野)已經不局限與周圍8個方格,而是由於時間(白天還是黑夜),自身屬性(敏捷影響視野)去決定。例如下面是一個視野為3的細胞。
細胞能力
可以理解為智商。但是感覺更像是遊戲中的技能。例如說細胞在攻擊時發現擊中要害更致命,那麽它以後攻擊的時候都會向要害攻擊(學會【擊中要害】)。
這裏為了讓遊戲更有意思,對思考類能力做了特殊處理,比如說細胞學會了【謀而後動】,那麽它會在每次行動前,考慮自身、對手、周圍細胞等各個因素,然後做一個判斷,決定這次應該做什麽。學會【走為上策】細胞會在自己自身不利情況逃跑。更甚者學會【知己知彼】還會考慮對手情況。
細胞狀態
標準的如戰鬥中、逃跑、瀕死,戰鬥狀態如被拌摔等(與能力有關)
能力中使用位運算
首先在設計狀態的時候使用了位運算判斷,這也是一個很經典的學習案例:
我為了給每個技能增加【稀有度】,提出一個能力最大值的概念,其實我承認很大程度上是因為我發現智力有點廢柴。
每個能力並不全是只有一個1(二進制),如上例中的【擊中要害】二進制就有3個1。
這裏需要說明一下,本身是沒有能力類型的(如上面的共計類型),但是發現由於攻擊類的能力稀有度低(原本的【奮力一擊】是0x00000001【擊中要害】是0x01000002),很多細胞同時擁有【奮力一擊】和【擊中要害】,所以提出了能力類型這個概念,同一個能力類型每個細胞只能擁有兩個(不排除給一些思考類能力增加判斷替換能力的功能)。
當你獲得一個新技能的時候,剩余能力值(能力最大值減去已有能力值)不足,則無法獲得該技能,這樣保證了高智力細胞的優勢。
判斷能力值的方法來源經典的判斷整數二進制中1的個數,也算學有所用。其實完全可以寫一個類的,這我知道,而且在能力中暴露出來的問題(比如說通過0x00000001獲得【奮力一擊】這個能力的名字),也讓我考慮將能力封裝一個類。但是這都是後話。
判斷視野
這真是經驗不足了。
雖然很喜歡遊戲,但是對於遊戲編程還是沒有過多接觸。
本來很簡單的一個問題,但是實現的時候還是出了不少問題,最後寫下如下代碼:
Within方法
野比的話
首先感謝nanqi0506和大家分享創作的經驗和樂趣。其文尚未完成,本人會持續關註。《LifeGame》一文源代碼下載:點擊下載
(未完待續)
野比 2012 版權所有
生命遊戲和細胞自動機的學習筆記