人工生命—群集智能—蟻群算法js版
前言(摘自網(wǎng)上,代碼是自己想出來的)
對于普通大眾來說,“人工生命”、“群集智能”、“仿生機器人”等等可能是一些新鮮名詞,他們可能會問,這些新鮮而時髦的科技的內(nèi)容到底是什么?它們是否代表未來科技發(fā)展的方向?它們對人們的生活將會有什么樣的影響?人類的未來將是什么樣的?
對于計算機相關(guān)專業(yè)的技術(shù)人員來說,也許“細(xì)胞自動機”、“遺傳算法”、“神經(jīng)網(wǎng)絡(luò)”、“蟻群算法”、“計算智能”等名詞已經(jīng)不陌生,然而這些技術(shù)之間究竟有什么聯(lián)系?技術(shù)人員在同計算機程序中的 Bug 無休止地作斗爭的同時,能不能考慮讓計算機程序自發(fā)地變聰明?計算機程序可以自發(fā)地修正自己的錯誤嗎?
對于生物專業(yè)的人士來說,他們可能更加關(guān)心自然生物 DNA 的合成、培育和生長。然而究竟什么是“活性”的本質(zhì)?生命是一種物質(zhì)還是信息?如何不進(jìn)行昂貴而笨重的生物學(xué)實驗就能驗證研究人員的某個理論?
對于社會科學(xué)家和管理者來說,他們可能很關(guān)心如何讓人們自發(fā)地合作,如何讓一個組織更具活力。我們將會看到,自然界中的螞蟻僅僅遵循簡單的規(guī)則就能達(dá)到整體的合作從而有效、快速地搬運食物。那么,我們能否像螞蟻那樣每個人僅僅根據(jù)簡單的規(guī)則完成簡單的決策就有可能在人類群體中涌現(xiàn)出意想不到的集體效應(yīng)?
這些問題表面上看,差異很大,但令人高興的是,今天它們都可以在一門新興科學(xué)——計算機科學(xué)和生物學(xué)交叉的人工生命中找到答案。人工生命誕生于 20 世紀(jì)末。起初,從事人工生命研究生學(xué)者主要是一些計算機科學(xué)家,他們向大自然學(xué)習(xí),把生物的靈活適應(yīng)本領(lǐng)移植到計算機中,讓程序變得聰明起來!斑z傳算法”、“神經(jīng)網(wǎng)絡(luò)”、“蟻群算法”等等正是計算機科學(xué)家向生物界學(xué)習(xí)的成果。另外,計算機也提供了天然的生物系統(tǒng)的模擬場所,這讓生物學(xué)家們在電腦中就可以進(jìn)行在平常情況下難以進(jìn)行或無法進(jìn)行的一些實驗。
然而,人工生命不僅僅關(guān)心一些具體的技術(shù)問題,它更是一種嶄新的自下而上的科學(xué)思維方法。事實上,在不經(jīng)意間,科學(xué)界已經(jīng)發(fā)生了一次全新的方法論變革:這就是用綜合集成的方法代替還原分解的方法。我們僅掌握原子世界的規(guī)律并不能完全理解生命現(xiàn)象。純粹的還原論已經(jīng)走到了盡頭,而通過計算機的幫助人們就可以把已經(jīng)被分解還原的單個規(guī)律重新綜合組織起來。我們不僅關(guān)心每個計算單元的屬性,而且關(guān)心這些單元組合而成的整體動態(tài)。單個單元也許是非活性的,但單元的組合可能涌現(xiàn)出“活性”。這就是人工生命的方法。
人工生命學(xué)科還很年輕,在很多方面仍然不夠成熟,而且很多學(xué)者對這門新學(xué)科的發(fā)展也各執(zhí)看法,甚至這門學(xué)科的研究范圍都不是很確定。我們所提到的人工生命在技術(shù)上主要指在數(shù)字世界中創(chuàng)造的虛擬版本的人工生命和在現(xiàn)實世界中創(chuàng)造的機器人版本的人工生命;在方法論上則主要強調(diào)自下而上的涌現(xiàn)方法和自發(fā)的適應(yīng)進(jìn)化方法。因此,所述的各種人工生命模型的基本思想是盡量減少人為的外在干預(yù),讓系統(tǒng)自發(fā)的發(fā)展、進(jìn)化。
人工生命自一開始誕生就是一門理論和實際緊密結(jié)合的學(xué)科,它一方面需要人們運用抽象的理性思維看待生命,另一方面又特別強調(diào)計算機模擬實驗。本著這種思路,每一個人工生命的實例都盡量寫出其中的核心代碼。因此熟悉計算機編程的人們可以從這些敘述中直接在自己的計算機上實現(xiàn)各種活靈活現(xiàn)的人工生命模型。
蟻群算法
還沒有完成,現(xiàn)貼個初步的結(jié)果上來,大家?guī)兔σ黄鹧芯肯铝耍x謝! 目前能實現(xiàn)隨意控制螞蟻的軌跡長度(Path)、數(shù)量(Unit)、速度(V)、角度(R)、加速度(dv,dr)。 Kr和Kv是常數(shù),打算將來改成數(shù)組,作為用來控制螞蟻活躍程度的基因。 但是總的div數(shù)量受機器速度限制,數(shù)量多了會很慢,我的機器最多只能跑得動3000只螞蟻(當(dāng)然軌跡要減小到1),已經(jīng)把運動延時設(shè)成和螞蟻數(shù)量相關(guān),希望能有高手幫忙優(yōu)化下。再次感謝!
思路1:用div做點
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
用div做點總覺得不是很值得,哪位大俠有更好的方法還請指點迷經(jīng)!
為了方便大家比較div和move函數(shù)對螞蟻數(shù)量的敏感程度,做了兩個臨時腳本供大家參考都是500只螞蟻,軌跡為1,機器慢的朋友請適當(dāng)減小參數(shù)后再運行。
這是無div的情形:初始化耗時28078ms(僅供參考)
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
這是無move函數(shù)的情形,初始化耗時12437ms(僅供參考)
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
測試結(jié)果顯示div并不是速度的瓶頸,最影響速度的是move函數(shù)本身,所以優(yōu)化它才是解決問題的關(guān)鍵所在! 更新了下,原先測的時間還偏長了些,因為不是嚴(yán)格在調(diào)用init前起獲取時間
思路2:用vml中的path指令做點
經(jīng)過學(xué)習(xí)終于搞明白了怎么用vml做點,并試著生成2000~4000個點看看,結(jié)果顯示生成時間和點的數(shù)量已成正比,基本達(dá)到優(yōu)化的目的,接下來的工作就是用vml實現(xiàn)了。
以下代碼生成隨機4000個由蟻巢出發(fā)的線段,大家放心了,生成中基本速度不減慢(看狀態(tài)欄),當(dāng)然機器較慢的朋友還是請適當(dāng)減小參數(shù)再瀏覽。
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
順便說下這里用到了join函數(shù)來連接坐標(biāo)字符串?dāng)?shù)組從而達(dá)到降低時間復(fù)雜度的目的。
經(jīng)典論壇討論帖: http://www.95time.cn/bbs/NewsDetail.asp?id=2539054
出處:藍(lán)色理想
責(zé)任編輯:moby
◎進(jìn)入論壇網(wǎng)頁制作、網(wǎng)站綜合版塊參加討論
|