目標:在解空間中儘可能地找到最優解,找不到最優解,就找比較好的解,希望能跳出局部最優解
步驟:
1.在解空間中選擇一部分的點來構成一個種羣,每個點都是一個解,每個點都應該用統一的編碼方式來進行編碼。於是,一個解可以類比成一個染色體,而經過編碼以後,染色體就會以基因的形式而存在。
2.確定一個適應度函數,計算每一個個體(染色體)的適應度。以此作爲某個個體存活可能性大小比較的依據。
3.構建一個新的種羣。構建新的種羣主要經過這麼幾個步驟:選擇------>交叉-------->變異
a. 選擇,選擇的過程主要是從原有的種羣中挑選出滿足交叉率要求的個體
b. 交叉,根據選擇出來的父母本,進行交叉,交換不同的基因片段,產生新的子代
c. 變異,新產生的子代基因會發生變異,可能會出現新的性狀
4.對新構成的種羣,進行上面的操作,直到達成終止條件。
-------------------以上是遺傳算法的基本步驟---------------------------
-------------------以下是一些需要注意的內容--------------------------
1.如何編碼?
2.如何構建種羣?
3.如何選擇?
4.如何交叉?
5.如何變異?
6.如何終止?
7.精英主義
1.如何編碼?
編碼的方式有很多種:比如,二進制編碼,實數編碼,排列編碼等等
二進制編碼就是利用一串01字符來表示個體,需要將每個樣本的每個特徵值都改寫成二進制的形式
實數編碼就是利用一個實數(小數點後四五位通常)來表示個體
排列編碼就是利用1到9 這幾個整數來進行編碼,組成一個整數隊列 eg. randperm(N)
2.如何構建種羣?
在構建新的種羣的過程中,會有很多種不同的方法:
① 從上一代種羣中不斷地挑選父本母本,產生新的子代,放入新的種羣,直到這個種羣被子代填滿爲止。此時得到的種羣裏面的個體全部都是新的子代,上一代種羣的所有染色體全部消失
②從上一代種羣中不斷地挑選父本母本,判斷這兩者是否有可能發生交叉(即隨機生成的交叉概率是否大於既定的交叉概率),如果有,那麼就產生新的子代放入到種羣中;如果沒有,那麼就將這兩個個體放入下一代種羣,成爲下一代種羣裏面的新的個體
③父本母本生成子代以後直接替換掉種羣裏面適應度最低的個體
3.如何選擇?
就選擇方法而言,可以有輪盤賭,排序選擇,競標選擇等等
輪盤賭:(將染色體按適應度從高到低進行排序)將每一個染色體的適應度都normalization,用自己的適應度除以適應度之和,將適應度轉化成[0,1]之間的數。隨機生成一個[0,1]之間的數,落入輪盤中。取累積概率中第一個大於隨機概率的那個染色體作爲選擇出來的父本母本。
4.如何交叉?
根據不同的編碼方式有不同的交叉方式
二進制:單點交叉,多點交叉,均勻交叉,算術交叉。前三種都是交換的形式,最後一種是混合的形式(想象成顏料)
實數:同二進制
排列:選染色體1的交叉點前段整數+染色體2未在染1前段出現的整數
5.如何交叉?
二進制:0變1,1變0
實數:加上或者減去一個特別小的數
排列:染色體裏面的基因(整數)交換位置
6.如何終止?
①.找到了所需的最優解
②.達到了固定的種羣代數
③.達到了資源預算
④.新的子代不再產生更優的解
⑤.人工干預
7.精英主義(Elistim):
在從上代種羣到下代種羣的過程中,我們希望能夠保留那些適應度比較高的個體,讓其在下一代種羣中也出現。
遺傳算法GA: http://www.obitko.com/tutorials/genetic-algorithms/index.php
GA wikipedia : https://en.wikipedia.org/wiki/Genetic_algorithm
輪盤賭:https://en.wikipedia.org/wiki/Fitness_proportionate_selection
選擇策略:http://www.cnblogs.com/legend1130/p/5333087.html