1. 程式人生 > >生命遊戲和細胞自動機的學習筆記

生命遊戲和細胞自動機的學習筆記

自動機 遊戲

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 版權所有


生命遊戲和細胞自動機的學習筆記