對遺傳演算法的解讀

2021-08-25 15:54:28 字數 2559 閱讀 5103

當無法窮舉遍歷出所有的解集時,智慧型演算法就登場了。

好像術語太多了,舉個例子吧。六度空間理論說,你和任何乙個陌生人,只要通過六個人就可以認識。比如,你認識a,a認識b,b認識c,等等,最多中間通過六個朋友,你就可以找到那位陌生人。這個神奇的理論是stanley milgram在2023年提出的,現在我們討論如何實現它。假定我們掌握了所有的人際關係網路,現在突然想看看,自己能通過最少幾個人,可以認識到歐巴馬呢?已經可以想見,這幾乎無法窮舉,人口基數太大了,而且每個人的社會關係都有至少幾百人,整個關係網想窮舉不可能,即使能窮舉出所有的網路關係,那麼在這段時間內還不斷的有人死亡有人出生呢。但只有找出所有的社會關係,才能知道"最少"通過幾個人可以認識到歐巴馬,可是其實我們想知道的只是,如何能在幾小時或者幾天內,以盡量少的中間人數量找到這條關係路徑。需要的是時效的平衡,智慧型演算法就是用於解決類似的問題。

複雜的問題,海量的資料,或者對求解時間上的限制,常常會使人們不得不選擇一種智慧型演算法去求解近似最優解,像模擬退火、神經網路、蟻群演算法、粒子群演算法、遺傳演算法等。簡單的了解了下這幾種常見的求近似最優解的智慧型演算法後,我對遺傳演算法最感興趣,回顧下最近對它的一些學習和理解。

顧名思義,遺傳演算法的靈感來自於達爾文的演化論。物競天擇,適者生存,遺傳演算法就是基於這個思想來設計的,所以,它一定是通過模擬乙個種群的進化往下進行,這樣,遺傳演算法的關注點就不是個體了,最關心的就是種族的進化方向。抽象來說,就是在部分解空間中,不斷進化取得更加優秀的解空間,從而找到近似最優解。

可能不太好理解,還是用上面的例子來說明吧。現在還是要找到你和歐巴馬之間的最近關係網路,首先都認識到,獲得所有你到歐巴馬的關係網路是不現實的,偶爾知道乙個,比如通過一千個中間人才能認識到。甚至獲取乙個這樣的關係一下也想不到,沒關係,那我們也找出乙個「不完整的」解空間吧作為種族的第一代吧。比如你認識的所有人,或者你所在學校或者公司對美國有好友的人,或者歐巴馬的所有中國朋友,第一代種族當然越有用,經過n代後的進化越優。在第一代向後進化時,我們使之向好的方向進化下去,最終可能會有許多你需要的關係網路,你從中找出最好的即可。

說到這裡,就涉及到了,什麼才是好的進化方向呢?怎麼解讀「物競天擇,適者生存」?首先是「天擇」,天就是演算法設計者了,你要選擇出某一代解空間裡,最接近最優解的那部分。所以,對每個個體進行評價,根據評價結果來排名是必不可少的。每個個體怎樣成長不需要關注,但是乙個好的評價函式會直接影響演算法的效率。比如繼續上面這個例子,如果把你的所有好友中隨機取出100個,按照誰最可能認識歐巴馬來設計乙個評價函式,比如,有海外經歷的、有博士學位以上的、有從政經歷的返回較高分,分別評價每位好友後排名。那麼這個解空間裡,了解了每個個體的適應度,你才能繼續選擇。

再看「物競」,就是每個個體之間,如何進化出下一代。比如,每雙父母會有乙個兒子,那麼這個兒子所有的染色體中,一部分來自於父親,其餘的來自於母親,應用到演算法中就是,對於這一代中沒有淘汰的解中間,隨機抽取兩個解,把每個解的染色體中任何組合後產生乙個兒子。又有些抽像了,再舉上面的例子,我們先看有完整解空間的情況。抽出兩個解,你->a->b->c->歐巴馬,你->e->b->g->f->歐巴馬,那麼交叉後,可能得到的下一代為:你->e->b->c->歐巴馬。如果還沒有得到完整的解空間,比如你的兩個適應度最高的好友a,b,他們的各自好友中,取出有交集或者最有可能有交集的一位最為下一代。這一步叫做交叉選擇,對特定問題,好的交叉方法很重要,如果想設計更加通用的遺傳演算法,則可能希望把解空間的個體分解為染色體越發的簡單,交叉也是如此。

只是交叉選擇還會存在風險,因為你的評價函式未必是沒有偏差的。完全有可能你認識解空間中乙個解要被淘汰了,或者兩個解中取下一代時,按照正常的交叉選擇會導致,更有可能的最優解沒有被進化到。比如,你的關係網路裡有乙個朋友的鄉下二大爺,曾經救過歐巴馬老婆一命,正常的評價函式裡,直接把二大爺淘汰了,無論如何進化這條二大爺->歐巴馬老婆->歐巴馬的關係網路都見不到了。這樣,變異就出現了。變異就是,未必按照目前考慮完善的進化法則進行,就像蟻群演算法中,總有幾個螞蟻並不按照當前已知的最優路線行進,它們是探險者。所以,在交叉選擇時,就要有變異,甚至直接把相對適應度低的關係拿上來進化。

進化到什麼時候結束呢?可以設定為最多計算一周時間,或者最多進化100萬代,或者找到最少通過四個人就認識歐巴馬了就停止。這樣完整的遺傳演算法就呈現在大家眼前了。遺傳演算法的好處就是關注點在解空間上,對解的個體特徵不必太關注,通用性高。並且在沒有得到所需要的滿足自己的解時,任何時刻都可以得到比初始時更好的解。到問題的規模無法控制時,這個特性太重要了。而且遺傳演算法利於並行求解,這也是個非常重要的特性,對分布式計算很有意義。其實,單cpu計算機都是序列執行命令,它的運算速度遠大於毫秒級的人腦,但是人腦的平行計算卻在很多場合中更有效,人工神經網路這個演算法也由此產生,能夠並行運算確實是很重要的。

現在還有多種群競爭遺傳演算法,就是初始解空間不只乙個,產生後代時每個種群互相影響。具體問題具體分析吧。

總之,遺傳演算法就是由初始解空間,適應度的評價,選擇哪些個體,如何交叉選擇,如何變異,如何停止演算法的執行這些要素組成。很多複雜問題都能被它解決。最近我玩qq七雄爭霸,對裡面的戰略戰用python+tkinter簡單的模擬了下,用遺傳演算法計算出較好的陣形。比如,騎兵的特點是攻擊力強,血少,移動快,弓箭手射程遠,攻擊力低,槍兵射程近,血厚,等等。在兵力固定時,通過遺傳演算法不斷的進化,只是通過變幻陣形往往得出相同的戰場規則下,結果非常優秀的陣形。比如,我選擇80%的種子產生50%的子孫,40%的陣形直接儲存,10%的陣形變異,同等兵力時,可以只死一半兵全滅敵人。

對遺傳演算法的解讀

當無法窮舉遍歷出所有的解集時,智慧型演算法就登場了。好像術語太多了,舉個例子吧。六度空間理論說,你和任何乙個陌生人,只要通過六個人就可以認識。比如,你認識a,a認識b,b認識c,等等,最多中間通過六個朋友,你就可以找到那位陌生人。這個神奇的理論是stanley milgram在1967年提出的,現在...

對遺傳演算法的解讀

當無法窮舉遍歷出所有的解集時,智慧型演算法就登場了。好像術語太多了,舉個例子吧。六度空間理論說,你和任何乙個陌生人,只要通過六個人就可以認識。比如,你認識a,a認識b,b認識c,等等,最多中間通過六個朋友,你就可以找到那位陌生人。這個神奇的理論是stanley milgram在1967年提出的,現在...

python遺傳演算法 Python 遺傳演算法實現

關於遺傳演算法 遺傳演算法是仿照自然界中生物進化而產生的一類優化演算法。個人感覺遺傳演算法簡單粗暴,適應性廣。關於遺傳演算法的介紹網上有很多了,這裡按照我自己的理解簡單概括一下。編碼解碼,將待優化的引數編碼為dna序列,最簡單直接的為二進位制編碼 即有兩種鹼基的dna鏈 生成隨機初代 選擇,適應度 ...