十九世紀,達爾文在加拉帕戈斯群島觀察象龜時發現,在不同的島嶼環境下,象龜的形態也不同。
在高地島的濕潤環境下,象龜體積更大,有著半球形的龜殼和短脖子,而在低地島的乾燥環境下,象龜體積更小,有著馬鞍形狀的龜殼和長脖子。這些差異引發了達爾文的思考,也為日後演化論的誕生做了鋪墊。下圖為四種象龜,可以看出性狀各有不同。
平塔島象龜:孤獨喬治
聖克里斯托巴爾島象龜
加拉帕戈斯·唐福斯託象龜
聖克魯茲島象龜
如今演化論已經成為了學界的共識,不僅僅侷限於生物領域,其他領域的科學家也從中獲得了很多啟發。
下面主要介紹遺傳演算法ga和差分進化演算法de。簡單來說,ga的流程可以概括為:選擇➡交叉➡變異。一代一代地進化,最後選擇適應度最高的個體。
舉個例子,深度學習網路模型的好與壞常常與引數相關,但是人工卻往往難以取得好的引數,這個時候就可以引入遺傳演算法,來尋找適合的網路結構引數。三維卷積神經網路c3d是一種基於時域和空域的深度學習網路,利用ga可以來尋找c3d適合的引數。
方法如下:將c3d引數組看作乙個個體,代表著一種引數的選擇方案,適應度高的個體進入下一代種群,對每乙個體進行評估,直到最後一代評估結束,篩選出最優的個體。如下圖,模型中的各個引數可以看作生物相對應的性狀,交叉即兩個不同引數組之間的某些引數進行交叉,變異即引數組上某些位置的引數變異(比如二進位制表示的就是0到1或者1到0)。
引數名稱
引數意義
卷積層an
該層是否有效
bn卷積核種類
cn是否採用批標準化
dn啟用函式
endropout比例
jn是否採用最大池化
完全連線層
am該層是否有效
km該層神經網路節點數
cm是否採用批標準化
dm啟用函式
emdropout比例
優化器l
優化器但ga在訓練過程中也會遇見一些問題,比如早熟,即快速收斂到了區域性最優解。
科學家也提出了一些方法,比如觸發式超級變異,即當染色體群體的質量下降(彼此的區別減少)時增加變異概率。再比如隨機外來染色體,即偶爾加入一些全新的隨機生成的染色體個體。在電影《waterworld》中有這樣乙個場景:強壯的水手來到浮島後,浮島長老請求其留下基因,因為浮島一直內部crossover導致後代體質越來越弱。水手的基因,就是這個「隨機外來染色體」。
差分進化演算法(differential evolution algorithm,de)是進化演算法家族的乙個年輕分支,主要特點有:
de的流程可以概括為:變異➡交叉➡選擇。變異是de的核心,具體思想如下:選兩個個體得到向量差,再將向量差加到第三個個體上,即完成變異。
在前文提到的平塔島象龜孤獨的喬治作為平塔島象龜已知的最後乙隻,已經於2023年6月24日死去,並且,喬治和另外兩隻亞種雌龜產下的蛋無一孵化成功,這標誌著這一物種的滅絕。
如果你搭上時光機回到當時,懷揣著一塊裝滿了象龜繁衍資料的硬碟,成為了負責這個保護專案的首席科學家。在平塔島象龜存亡之際可以嘗試利用de演算法來選擇出當時最適合平塔島象龜繁衍的環境引數,這些引數可能有:母龜種屬,母龜數量,飼養環境溫度,食物種類及比例,藥物種類,孵化溫度等等。下圖為de流程。另外,採用多種群策略,也可以增強種群的多樣性,減少早熟。
例如一種多種群差分進化演算法,設定三個種群s1,s2,s3,分別存放優秀個體,普通個體,較差個體。能夠保證子種群在進化過程中不受其他種群的干擾,另外,如果乙個種群多樣性變差,可以從另外兩個種群中進行子群遷移來增加多樣性。同時,多種群的機制也使其能夠處理併發問題,減少計算的時間。一般來說,對於進化演算法,自適應的控制引數一般比固定值更有優勢,因為能夠應對更複雜的問題,且能降低演算法停滯的風險。因此,現在也有很多進化演算法自適應方向的研究。
進化計算 進化演算法
從今天開始,將進入另一類智慧型優化演算法 進化計算 evolutionary computation 這些演算法更多的是基於達爾文的 演化論 相關理論進行演算法的設計。進化演算法 evolutionary algorithms,eas 通常包括遺傳演算法 genetic algorithms,ga ...
2019 02 22 演算法 進化
題目描述 給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwkew ...
2019 02 25 演算法 進化
題目描述 給出乙個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。示例1 輸入 123 輸出 321示例2 輸入 123 輸出 321示例3 輸入 120 輸出 21我的解法 public int reverse int x int y 0 boolean findhead fals...