《复杂》读书笔记(part7)--遗传算法
學(xué)習(xí)筆記
學(xué)習(xí)書目:《復(fù)雜》- 梅拉妮·米歇爾
文章目錄
- 遺傳算法
- 遺傳算法菜譜
- 掃易拉罐的機(jī)器人小黃
- GA如何演化出好的技巧
遺傳算法
在對(duì)“機(jī)器能否復(fù)制自身”的問題給予肯定回答后,馮·諾依曼很自然地想讓計(jì)算機(jī)(或計(jì)算機(jī)程序)復(fù)制自己和產(chǎn)生變異,并在某種環(huán)境中為生存競(jìng)爭資源。這就會(huì)遇到前面提到的生存本能以及進(jìn)化和適應(yīng)的問題。
20世紀(jì)60年代初,一些研究團(tuán)體開始在計(jì)算機(jī)中進(jìn)行進(jìn)化實(shí)驗(yàn),這些研究現(xiàn)在統(tǒng)稱為進(jìn)化計(jì)算。其中最為著名的是密歇根大學(xué)的霍蘭德和他的同事、學(xué)生進(jìn)行的遺傳算法研究。
霍蘭德在讀費(fèi)希爾的名著《自然選擇的遺傳理論》時(shí)被達(dá)爾文的進(jìn)化論深深吸引。他從計(jì)算機(jī)科學(xué)的角度思考:“這就是遺傳算法的由來,我想到,是不是可以像繁育良種馬和良種玉米那樣繁殖程序。”
霍蘭德的主要興趣在于適應(yīng)現(xiàn)象——生物如何進(jìn)化以應(yīng)對(duì)其他生物和環(huán)境變化,計(jì)算機(jī)系統(tǒng)是不是也可以用類似的規(guī)則產(chǎn)生適應(yīng)性。他在1975年的著作《自然和人工系統(tǒng)的適應(yīng)》中列出了一組適應(yīng)性的普遍原則,并且提出了遺傳算法的構(gòu)想。
遺傳算法菜譜
算法其實(shí)就是圖靈說的明確程序,就好比做菜的菜譜:一步一步將輸入變成輸出。
對(duì)于遺傳算法(GA),期望的輸出就是特定問題的解。GA的輸入包括兩部分:候選程序群體和適應(yīng)性函數(shù)。適應(yīng)性函數(shù)用來確定候選程序的適應(yīng)度,度量程序完成指定任務(wù)的能力。候選程序可以表示成位、數(shù)字或符號(hào)組成的字符串。
下面是GA菜譜。我們將下面的步驟重復(fù)代數(shù):
- 第1步:生成候選方案的初始群體。生成初始群體最簡單的辦法就是隨機(jī)生成大量“個(gè)體”,在這里個(gè)體是程序(字符串)。
- 第2步:計(jì)算當(dāng)前群體中各個(gè)個(gè)體的適應(yīng)度。
- 第3步:選擇一定數(shù)量適應(yīng)度最高的個(gè)體作為下一代的父母。
- 第4步:將選出的父母進(jìn)行配對(duì)。用父母進(jìn)行重組產(chǎn)生出后代,伴有一定的隨機(jī)突變概率,后代加入形成新一代群體。選出的父母不斷產(chǎn)生后代,直到新的群體數(shù)量達(dá)到上限(即與初始群體數(shù)量一樣)。新的群體成為當(dāng)前群體。
- 第5步:轉(zhuǎn)到第2步。
上面描述GA時(shí)似乎很簡單,但是遺傳算法已被用于解決科學(xué)和工程領(lǐng)域的許多難題,甚至應(yīng)用到藝術(shù)、建筑和音樂。
掃易拉罐的機(jī)器人小黃
下面我們用一個(gè)更詳細(xì)的例子來進(jìn)一步闡述GA的主要思想。
我有一個(gè)叫小黃的機(jī)器人,它的世界是二維的,到處是丟棄的易拉罐。我們將用遺傳算法為小黃進(jìn)化出一個(gè)"腦"(即控制策略)。
小黃的工作是清理它的世界中的空易拉罐。由上圖所示,小黃的世界由10x10的100個(gè)格子組成。小黃在位置(0, 0)。我們可以假設(shè)周圍圍繞著一堵墻。許多格子中散落著易拉罐(每個(gè)格子中的易拉罐不會(huì)多于一個(gè))。 小黃貌似不是很聰明的樣子,他只能看到東南西北相鄰的4個(gè)格子以及本身所在格子中的情況。格子可以是空的(沒有罐子),或者有一個(gè)罐子,或者是墻。
每次清掃工作小黃可以執(zhí)行200個(gè)動(dòng)作。動(dòng)作可以是以下7種:
-
往北移動(dòng)
-
往南移動(dòng)
-
往東移動(dòng)
-
往西移動(dòng)
-
隨機(jī)移動(dòng)
-
不動(dòng)
-
收集罐子
每個(gè)動(dòng)作都會(huì)受到獎(jiǎng)賞或懲罰,如果小黃所在的格子中有罐子并且收集起來了,就會(huì)得到10分的獎(jiǎng)賞。如果進(jìn)行收集罐子的動(dòng)作而格子中又沒有罐子,就會(huì)被罰1分。如果撞到了墻,會(huì)被罰5分,并彈回原來的格子。
顯然,小黃盡可能地多收集罐子,別撞墻,沒罐子的時(shí)候別去撿,得到的分?jǐn)?shù)就最高。
這是一個(gè)比較簡單的問題,人工為小黃設(shè)計(jì)一個(gè)好策略可能也不是很難。不過,有了遺傳算法我們就可以什么也不用干,我們只需要等著計(jì)算機(jī)替我們進(jìn)化出來。
下面我們用遺傳算法來為小黃進(jìn)化出一個(gè)好策略。
要做的第一步,就是搞清楚我們想要進(jìn)化的到底是啥?也就是說具體策略是啥?
一般來說,策略指的是一組規(guī)則,規(guī)則給出了在各種情形下你應(yīng)當(dāng)采取的行動(dòng)。那么多少種可能的情形呢?小黃可以看到5個(gè)格子(當(dāng)前格子、東、南、西、北),每個(gè)格子可以標(biāo)為空、罐和墻。這樣就有243種可能情形(353^535種可能)
比如說,下面這張策略表顯示的就是一個(gè)策略:
要知道下一步怎么做,小黃只需要查看策略表。
小黃在(0, 0)位置時(shí),查到對(duì)應(yīng)的行動(dòng)是往西移動(dòng)。因此它往西移動(dòng)一格,結(jié)果一頭撞到墻上。
我之前并沒有說這是個(gè)好的策略,尋找好策略不關(guān)我的事,這事歸遺傳算法管。
我們寫了一個(gè)遺傳算法程序來進(jìn)化小黃的策略。算法中,群體里每一個(gè)個(gè)體都是一個(gè)策略(與各種可能情形相對(duì)應(yīng)的行動(dòng)列表)。也就是說,對(duì)于上面策略表中的策略,GA用來演化的個(gè)體就是最右側(cè)243個(gè)行動(dòng)依次列出的列表。
現(xiàn)在,我們?cè)俅谓忉屢幌翯A的工作原理:
- 第1步:生成初始群體,初始群體有200個(gè)隨機(jī)個(gè)體,程序中用一個(gè)偽隨機(jī)數(shù)發(fā)生器來進(jìn)行各種隨機(jī)選擇。
從現(xiàn)在開始我們重復(fù)1000次步驟2~步驟4。
- 第2步:計(jì)算群體中每個(gè)個(gè)體的適應(yīng)度。比如說,通過讓小黃執(zhí)行100次不同的清掃任務(wù)來確定策略的適應(yīng)度。每次將小黃置于位置(0, 0),隨機(jī)撒一些易拉罐(每個(gè)格子至多1個(gè)易拉罐,格子有易拉罐的概率是50%)。然后讓小黃根據(jù)策略在每次任務(wù)中執(zhí)行200個(gè)動(dòng)作。小黃的得分就是策略執(zhí)行各任務(wù)的分?jǐn)?shù)。策略的適應(yīng)度是執(zhí)行100次任務(wù)的平均得分,每次的罐子分布都不一樣。
- 第3步:進(jìn)化,讓當(dāng)前群體進(jìn)化,產(chǎn)生出下一代群體,直到新群體有200個(gè)個(gè)體。進(jìn)化的步驟如下:(a)根據(jù)適應(yīng)度隨機(jī)選擇出一對(duì)個(gè)體A和B作為父母。策略的適應(yīng)度越高,被選中的概率則越大。(b)父母交配產(chǎn)生兩個(gè)子代個(gè)體。隨機(jī)選擇一個(gè)位置將兩個(gè)數(shù)字串截?cái)?#xff1b;將A的前段與B的后段合在一起形成一個(gè)子代個(gè)體,將A的后段與B的前段個(gè)體合在一起形成另一個(gè)子代個(gè)體。?讓子代個(gè)體以很小的概率產(chǎn)生變異。以小概率選出1個(gè)或幾個(gè)數(shù),用0到6之間的隨機(jī)數(shù)替換。
- 第4步:新群體產(chǎn)生200個(gè)個(gè)體后,回到第2步,對(duì)新一代群體進(jìn)行處理。
GA如何演化出好的技巧
要回答GA如何演化出好的技巧這個(gè)問題,我們可以看一看策略是如何一代一代改進(jìn)的。下圖繪制出了每一代中最佳策略的適應(yīng)度:
由上圖可以看出,前300代提高得很快,此后的提高要慢一些。
第1代有200個(gè)隨機(jī)生成的策略,可以想象它們都很糟糕。最好的策略適應(yīng)度才-81,最糟糕的到了-825。在一些環(huán)境設(shè)定中,小黃移動(dòng)了幾步就卡住了,之后在整個(gè)任務(wù)過程中都停止不動(dòng)。在一些情況下,則不停地撞墻,直到任務(wù)結(jié)束。有時(shí)候則一直不斷地去撿罐子,雖然當(dāng)前位置上沒有罐子。
到第10代,群體中最佳策略的適應(yīng)度已經(jīng)變成正數(shù)了。這個(gè)策略經(jīng)常會(huì)停滯不動(dòng),有時(shí)候還會(huì)在兩個(gè)格子之間不停地來回移動(dòng)。但基本不怎么撞墻。
到200代時(shí),最好的策略已經(jīng)具有向罐子移動(dòng)并撿起罐子這個(gè)最重要的能力—至少大部分時(shí)候是這樣。不過,如果周圍沒有罐子,它也會(huì)浪費(fèi)很多時(shí)間用來隨機(jī)游走。
到了400代,適應(yīng)度超過了400分。
到800代時(shí),GA發(fā)現(xiàn)了將罐子留作相鄰罐子的路標(biāo)的技巧。
GA就這樣不斷改進(jìn)最佳適應(yīng)度。
在實(shí)際應(yīng)用中,GA經(jīng)常能演化出有用的答案,但是很難看出為什么會(huì)有用。這是因?yàn)镚A找到的好答案與人類想出的相當(dāng)不同。美國國家航空航天局(NASA)的遺傳算法專家羅恩曾這樣說:“進(jìn)化算法是探索設(shè)計(jì)死角的偉大工具。但是,我們經(jīng)常發(fā)現(xiàn)進(jìn)化出來的設(shè)計(jì)完全無法理解。”
總結(jié)
以上是生活随笔為你收集整理的《复杂》读书笔记(part7)--遗传算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS样式表优先级(w3cschool)
- 下一篇: 《自卑与超越》读书笔记(part1)--