現代生物遺傳學中描述的生物進化理論:
遺傳物質的主要載體是染色體(chromsome),染色體主要由dna和蛋白質組成。其中dna為最主要的遺傳物質。
基因(gene)是有遺傳效應的片斷,它儲存著遺傳資訊,可以準確地複製,也能發生突變,並可通過控制蛋白質的合成而控制生物的狀態.生物自身通過對基因的複製(reproduction)和交叉(crossover,即基因分離,基因組合和基因連鎖互換)的操作時其性狀的遺傳得到選擇和控制。生物的遺傳特性,使生物界的物種能保持相對的穩定;生物的變異特性,使生物個體產生新的性狀,以至於形成了新的物種(量變積累為質變),推動了生物的進化和發展。
遺傳學演算法和遺傳學中的基礎術語比較
染色體(chromosome) 資料,陣列,序列
基因(gene) 單個元素,位
等位基因(allele) 資料值,屬性,值
基因座(locus) 位置,iterator位置
表現型(phenotype) 引數集,解碼結構,候選解
遺傳隱匿(epistasis) 非線性
染色體又可以叫做基因型個體(individuals),一定數量的個體組成了群體(population),群體中個體的數量叫做群體大小。各個個體對環境的適應程度叫做適應度(fitness)
遺傳演算法的準備工作:
1)資料轉換操作,包括表現型到基因型的轉換和基因型到表現型的轉換。前者是把求解空間中的引數轉化成遺傳空間中的染色體或者個體(encoding),後者是它的逆操作(decoding)
2)確定適應度計算函式,可以將個體值經過該函式轉換為該個體的適應度,該適應度的高低要能充分反映該個體對於解得優秀程度。非常重要的過程!
遺傳演算法的基本步驟
遺傳演算法是具有"生成+檢測"(generate-and-test)的迭代過程的搜尋演算法。
基本過程為:
1)編碼,建立初始集團
2)集團中個體適應度計算
3)評估適應度
4)根據適應度選擇個體
5)被選擇個體進行交叉繁殖,
6)在繁殖的過程中引入變異機制
7)繁殖出新的集團,回到第二步
乙個簡單的遺傳演算法的例子:求 [0,31]範圍內的y=(x-10)^2的最小值
1)編碼演算法選擇為"將x轉化為2進製的串",串的長度為5位。(等位基因的值為0 or 1)
2)計算適應度的方法是:先將個體串進行解碼,轉化為int型的x值,然後使用y=(x-10)^2作為其適應度計算合適(由於是最小值,所以結果越小,適應度也越好)
3)正式開始,先設定群體大小為4,然後初始化群體 => (在[0,31]範圍內隨機選取4個整數就可以,編碼)
4)計算適應度fi(由於是最小值,可以選取乙個大的基準線1000,fi = 1000 - (x-10)^2)
5)計算每個個體的選擇概率.選擇概率要能夠反映個體的優秀程度.這裡用乙個很簡單的方法來確定選擇概率
p=fi / total(fi).
6)選擇.
根據所有個體的選擇概率進行淘汰選擇.這裡使用的是乙個賭輪的方式進行淘汰選擇.先按照每個個體的選擇概率建立乙個賭輪,然後選取4次,每次先產生乙個0-1的隨機小數,然後判斷該隨機數落在那個段內就選取相對應的個體.這個過程中,選取概率p高的個體將可能被多次選擇,而概率低的就可能被淘汰.
下面是乙個簡單的賭輪的例子
13% 35% 15% 37%
個體1 個體2 個體3 ^0.67 個體4
隨機數為0.67落在了個體4的端內.本次選擇了個體4.
被選中的個體將進入配對庫(mating pool,配對集團)準備開始繁殖.
7)簡單交叉
先對配對庫中的個體進行隨機配對.然後在配對的2個個體中設定交叉點,交換2個個體的資訊後產生下一代.
比如( | 代表簡單串的交叉位置)
( 0110|1, 1100|0 ) --交叉--> (01100,11001)
( 01|000, 11|011 ) --交叉--> (01011,11000)
2個父代的個體在交叉後繁殖出了下一代的同樣數量的個體.
複雜的交叉在交叉的位置,交叉的方法,雙親的數量上都可以選擇.其目的都在於盡可能的培育出更優秀的後
代8)變異
變異操作時按照基因座來的.比如說沒計算2萬個基因座就發生乙個變異(我們現在的每個個體有5個基因座.也就是說要進化1000代後才會在其中的某個基因座發生一次變異.)變異的結果是基因座上的等位基因發生了變化.我們這裡的例子就是把0變成1或則1變成0.
至此,我們已經產生了乙個新的(下一代)集團.然後回到第4步,周而復始,生生不息下去:)
偽**例項(適合愛看**的朋友~):
//init population
foreach individual in population
individual = encode(random(0,31));
//計算個體適應度
int totalf = 0;
foreach individual in population
individual.f = 1000 - (decode(individual)-10)^2;
totalf += individual.f;
//------選擇過程,計算個體選擇概率-----------
foreach individual in population
individual.p = individual.f / totalf;
//選擇
for(int i=0;i<4;i++)
//selectindividual(float p)是根據隨機數落在段落計算選取哪個個體的函式
matingpool[i] = population[selectindividual(random(0,1))];
//-------簡單交叉---------------------------
//由於只有4個個體,配對2次
for(int i=0;i<2;i++)
matingpool.parents[i].mother = matingpool.randompop();
matingpool.parents[i].father = matingpool.randompop();
//交叉後建立新的集團
population.clean();
foreach parent in matingpool.parents
//注意在copy 雙親的染色體時在某個基因座上發生的變異未表現.
child1 = parent.mother.divheader + parent.father.divend;
child2 = parent.father.divheader + parent.mother.divend;
population.push(child1);
population.push(child2);
小結:遺傳演算法中最重要的過程就是選擇和交叉。
選擇要能夠合理的反映"適者生存"的自然法則,而交叉必須將由利的基因盡量遺傳給下一代(這個演算法很關鍵!)
還有就是編碼的過程要能夠使編碼後的染色體能充分反映個體的特徵並且能夠方便計算。
遺傳演算法介紹
遺傳演算法介紹 2 基於遺傳演算法的人工神經網路的應用 基於遺傳演算法的人工神經網路的應用的基本原理是用遺傳演算法 ga 對神經網路的連線權值進行優化學習,利用ga的尋優能力來獲取最佳權值。由於遺傳演算法具有魯棒性強 隨機性 全域性性以及適於並行處理的優點,所以被廣泛應用於神經網路中,其中有許多成功...
遺傳演算法簡單例項
遺傳演算法的手工模擬計算示例 為更好地理解遺傳演算法的運算過程,下面用手工計算來簡單地模擬遺傳演算法的各 個主要執行步驟。例 求下述二元函式的最大值 1 個體編碼 遺傳演算法的運算物件是表示個體的符號串,所以必須把變數 x1,x2 編碼為一種符號串。本題中,用無符號二進位制整數來表示。因 x1,x2...
Matlab遺傳演算法例項
clear clc popsize input 輸入種群大小 n lengh input 請輸入染色體長度 n popsize 100 lengh 10 a 1 b 2 y x sin 10 pi x 1.0 初始種群 pop round rand popsize,lengh 行 種群大小,列 染色...