遺傳算法小結

這兩天在本部做項目,到現在腦子還是一頭霧水,不知如何進入。
    開會後,分配了“遺傳算法”,好歹也是咱數據挖掘的兄弟,那本書來研究研究。
    學到了點小小小小的意思,放到這,千萬別忘了。
   
    遺傳算法(Genetic Algorithm,簡稱GA),起源於對生物系統所進行的計算機模擬研究,是一種借鑑生物界自然選擇和自然遺傳機制的隨機搜索方法。由美國(怎麼又是美國人,切,古拉基古拉)Michigan大學的Holland教授及其學生創造,並提出遺傳算法的基本定理--模式定理(Schema Theorem)。
    從整個發展過程看,遺傳算法興起於70年代,發展於80年代,90年代進入高潮期,很魯棒哦。
    遺傳算法是模仿自然界生物進化機制發展起來的隨機全局搜索和優化方法,借鑑了偉大的達爾文先生的進化論和孟德爾的遺傳學說。採用“適者生存”的原則,在潛在的解決方案種羣中逐次產生一個近似最優的方案。其實很像人類,從古至今,都是優勝劣汰,長得漂亮的,聰明的才能適應社會嘛。
    然後應用複製、交叉、變異、顯性、倒位等遺傳算子。交叉的作用是很大的,變異則可以阻止局部收斂。最後,種羣中個體的平均性能達到提高,好的個體被保存並且相互產生下一代,而低適應度的個體則小時。
 
    最後,介紹一下遺傳算法的優點吧:
    一、對可行解表示的廣泛性。由於遺傳算法的處理對象並不是參數本身,而是那些通過參數集進行編碼得到的基因個體,因而該算法可以直接對結構對象(如集合、序列、矩陣、樹、鏈和表等)進行操作。
    1、通過對連接矩陣的操作,可用來對神經網絡或自動機的結構或參數加以優化。
    2、通過對集合的操作,可實現對規則集合和知識庫的精練而達到高質量的機器學習目的。
    3、通過對樹結構的操作,可得到用於分類的最佳決策樹。(可以用於對含能化合物進行分類)
    4、通過對人物序列的操作,可用於任務規劃;通過對操作序列的處理,可自動構造順序控制系統。
    二、羣體搜索特性。遺傳算法同時處理羣體中多個個體,即同時對搜索空間中的多個解進行評估。使其具有較好的全局搜索性能,並易於並行化。
    三、不需要輔助信息。僅用適應度函數來評估基因個體,並在此基礎上進行遺傳操作。
    四、內在啓發式隨機搜索特性。遺傳算法不採用確定性規則,而是採用概率的變遷規則來指導搜索方向。
    五、在搜索過程中不易陷入局部最優。即使在所定義的適應度函數是不連續的、非規則的或有噪聲的情況下。
    六、採用自然進化機制來表現複雜的現象。能夠快速準確的解決求解非常困難的問題。
    七、具有固有的並行性和並行計算能力。
    八、具有可擴展性。易於同別的技術混合使用。
 
    寫到這,自然會想到,既然遺傳算法有這麼多的優點,不可能連一點點缺點都沒有吧??
    當然,缺點是必不可少的:〉
    1、編碼不規範及編碼存在表示的不準確性。
    2、單一的遺傳算法編碼不能全面的將優化問題的約束表示出來。
    3、效率通常比較低。
    4、容易出現過早收斂。
    5、對算法的精度、可信度、計算複雜性等方面,還沒有有效的定量分析方法。

-------------------------------------------------------------------------------

早上下雨了,淋了一身,且罷,澆澆腦子,全當施肥,不知清醒否。書還在昨天看到的地方,那就繼續吧。

    對最優化問題,求最優解或近似最優解的傳統方法主要有解析法、隨機法和窮舉法。解析法主要包括爬山法和間接法。隨機法主要包括導向隨機方法和盲目隨機方法。而窮舉法主要包括完全窮舉法、回溯法、動態規劃法和限界剪枝法。

    也可用遺傳算法求解,遺傳算法與傳統方法有本質區別。傳統算法起始於單個點,而遺傳算法則起始於羣體;傳統算法是針對問題特有的特點進行改善,而遺傳算法則是獨立於問題。

  具體區別如下:

  1、遺傳算法與啓發式算法的比較:

  啓發式算法是指通過尋求一種能產生可行解的啓發式規則,找到問題的一個最優解或近似最優解。然而它必須對每一個所求的問題找出其特有的啓發式規則,且一般無通用性,不適用於其他問題。但遺傳算法採用的不適確定性規則,而是強調利用概率轉換來引導搜索過程。

  2、遺傳算法與爬山法的比較:

  爬山法是指接法、梯度法和Hessian法的通稱。首先在最優解可能存在的地方選擇一個初始點,然後通過分析目標函數的特性,由初始點移到一個新的點,然後再繼續這個過程。爬山法的搜索過程是確定的,它通過產生一系列的點收斂到最優解。而遺傳算法的搜索過程是隨機的,它產生一系列隨機種羣序列。二者的主要差異爲:爬山法的初始點只有一個,由決策者給出;遺傳算法的初始點有多個,是隨機產生的。爬山法由一個點產生一個新的點;遺傳算法通過遺傳操作,在當前的種羣中經過交叉、變異和選擇產生下一代種羣。

   3、遺傳算法與窮舉法的比較:

   窮舉法就是對解空間內的所有可能解進行搜索,方法簡單易行,但求解效率太低。而遺傳算法則具有較高的搜索能力和極強的魯棒性。

   4、遺傳算法與盲目隨機法的比較:

   只有解在搜索空間形成緊緻分佈時,盲目隨機法才比較有效。而遺傳算法作爲導向隨機搜索方法,是對一個被編碼的參數空間進行高效搜索。

   總結一下,主要有以下四點不同:

A、 遺傳算法搜索種羣中的點是並行的,而不是單點。

B、  遺傳算法並不需要輔助信息或輔助知識,只需要引進各項搜索方向的目標函數和相   對應的適應度。

C、  遺傳算法使用概率變換規則,而不是確定的變換規則。

D、遺傳算法工作使用編碼參數集,而不是自身的參數集。(除了在實值個體中使用)

  

  一些術語:

  在遺傳算法中,染色體對應的是數據或數組,在標準的遺傳算法中,通常是由一維的串結構數據表現的。串上各個位置對應基因座,各位置上所取的值對應等位基因。遺傳算法處理的是染色體或者叫基因型個體。一定數量的個體組成了羣體,也叫集團。各個體對環境的適應程度叫適應度。

  執行遺傳算法時,包含兩個必要的數據轉換操作,一個是表現型到基因型的轉換,它把搜索空間的參數或解轉換成遺傳空間中的染色體或個體,此過程稱爲編碼操作;另一個是基因型到表現型的轉換,它是前者的一個相反操作,稱爲譯碼操作。(對本項目而言,編碼操作就是將各含能化合物設置成程序可以識別的二進制編碼或其他代碼,譯碼操作則是將生成的解轉換成現實中的含能化合物結構或是分子式)

 

 研究方向:

 1、在遺傳算法中,羣體規模和遺傳算子的控制參數的選取非常困難。存在過早收斂。

 2、遺傳算法的並行性主要有三個方面:個體適應度評價的並行性、整個羣體各個個體適應度評價的並行性和子代羣體產生過程的並行性。

  3、分類系統屬於基於遺傳算法的機器學習中的一類,包括一個簡單的基於串規則的並行生成子系統、規則評價子系統和遺傳算法子系統。

  4、遺傳神經網絡包括連接級、網絡結構和學習規則的進化。

  5、進化算法包括遺傳算法、進化規劃和進化策略,三種算法是獨立發展起來的。

 

  遺傳算法的運行過程:

  遺傳算法模擬了自然選擇和遺傳中發生的複製、交叉和變異等現象,從任一初始種羣(Population)出發,通過隨機選擇、交叉和變異操作,產生一羣更適應環境的個體,使羣體進化到搜索空間中越來越好的區域,這樣一代一代地不斷繁衍進化,最後收斂到一羣最適應環境的個體(Individual),求得問題的最優解。

 

  簡單遺傳算法的僞代碼描述:

  Procedure GA

  Begin

      T=0;

      Initialize  p(t) ; //p(t)表示 t代種羣

      Evaluate  p(t);  //評估第t代種羣

      While not finished do

      Begin

           T=t+1;

           Select p(t) from p(t-1); //從上代種羣衆選擇較優秀的個體到下代子羣

           Reproduce pairs in p(t);

           Evaluate p(t);

      End

End

 

  遺傳算法的三個基本操作:

1、  選擇(Selection):根據各個個體的適應度值,按照一定的規則或方法從上一代羣體中選擇出一些優良的個體遺傳到下一代羣體中。體現了達爾文的適者生存原則。

2、  交叉(Crossover):最主要的遺傳操作。將羣體中的各個個體隨機搭配成對,對每一個個體,以某個概率(稱爲交叉概率,Crossover Rate)交換它們之間的部分染色體。體現了信息交換的思想。

3、  變異(Mutation):對羣體中的每一個個體,以某一概率(稱爲變異概率,Mutation Rate)改變某一個或某一些基因座上的基因值爲其他的等位基因。

     

    基本遺傳算法(也稱標準遺傳算法或簡單遺傳算法,Simple Genetic Algorithm,簡稱SGA)是一種羣體型操作,以羣體中的所有個體爲對象,只使用基本遺傳算子:選擇算子、交叉算子、變異算子。

  基本遺傳算法的步驟:

1、  染色體編碼:使用固定長度的二進制符號串來表示羣體中的個體,其等位基因值由二值{0,1}組成。包括編碼、解碼公式。

2、  個體適應度的監測評估:所有個體的適應度必須爲非負數。需要預先確定好由目標函數值到個體適應度之間的轉換規律,特別是要預先確定好當目標函數爲負數時的處理方法。例如:可選取一個適當大的正數C,使個體的適應度爲目標函數值加上正數C

3、  遺傳算子:

(1)       選擇運算使用比例選擇算子。比例選擇因子是利用比例於各個個體適應度的概率決定其子孫的遺傳可能性。

(2)       交叉運算使用單點交叉算子。任意挑選經過選擇操作中兩個個體作爲交叉對象,隨機產生一個交叉點位置,兩個個體在交叉點位置互換部分基因碼,形成兩個子個體。

(3)       變異運算使用基本位變異算子或均勻變異算子。爲了避免過早收斂,對於二進制的基因碼組成的個體種羣,實現基因碼的小概率翻轉,即0變爲1,1變爲0。

4、  基本遺傳算法的運行參數:

(1)       羣體大小:一般取爲20—100

(2)       遺傳算法的終止進化代數:一般取爲100—500

(3)       交叉概率:一般取爲0.4—0.99

(4)       變異概率:一般取爲0.0001—0.1

  看到現在,覺得問題最難的地方就是適應度和目標函數的確定,如何對數據進行編碼,也沒於頭緒,是不是沒吃早餐的原因,又犯困了,歇會。

遺傳算法目前存在的問題:

1、  適應度值標定方式多種多樣,沒有一個簡潔、通用的方法,不利於對遺傳算法的使用。

2、  遺傳算法的早熟現象(即很快收斂到局部最優解而不是全局最優解)是迄今爲止最難處理的關鍵問題。

3、  快要接近最優解時在最優解附近左右擺動,收斂較慢。

遺傳算法通常需要解決以下問題:確定編碼方案,使硬度函數標定,選擇遺傳操作方式,選擇相關控制操作,停止準則確定等。(每個都得解決,不容易啊)

七種改進的遺傳算法:

1、  分層遺傳算法(Hierarchic Genetic Algorithm)

2、  CHC算法

3、  Messy算法

4、  自適應遺傳算法(Adaption Genetic Algorithm)

5、  基於小生境技術的遺傳算法(Niched Genetic Algorithm,簡稱NGA)

6、  並行遺傳算法(Parallel Genetic Algorithm)

7、  混合遺傳算法:遺傳算法與最速下降法相結合;遺傳算法與模擬退火法(Simulated Annealing)相結合


-------------------------------------------------------------------------------------------------
 改進的遺傳算法(一) 
   經證明,簡單遺傳算法在任何情況下(交叉概率Pc,變異概率Pm,任意初始化,任意交叉算子,任意適應度函數)都是不收斂的,且不能搜索到全局最優解。(充分證明一點:便宜沒好貨,好算法不簡單阿)。通過改進遺傳算法,即在選擇作用前(或後)保留當前最優解,則能保證收斂到全局最優解。
    傳說中危害極大的早熟現象具體表現如下:
    1、羣體中所有的個體都陷於同一極值而停止變化。
    2、接近最優解的個體總是被淘汰,進化過程不收斂。
    消除早熟現象的方法:
    1、動態確定變異概率,既可防止優良基因因變異而遭到破壞,又可在陷入最優解時爲種羣引入新的基因。
    2、改進選擇方式,放棄賭輪選擇,以避免早期的高適應度個體迅速佔據種羣和後期的種羣中因個體的適應度相差不大而導致種羣停止進化。(賭輪選擇方式會使每一個個體都獲得複製一份的機會,體現不出好的個體的競爭力,無法實現遺傳算法優勝劣汰的原則)。於是,採取一種基於種羣的按個體適應度大小排序的選擇算法來代替賭輪選擇方法。
   first() {將種羣衆的個體按適應度大小進行排序}
   while   種羣還沒有掃描完
   do      {排在前面的個體複製兩份;中間的複製一份;後面的不復制;}
  
   下面將改進的遺傳算法具體描述如下:
   1、在初始種羣中,對所有的個體按其適應度大小進行排序,然後計算個體的支持度和置信度。
   2、按一定的比例複製(即將當前種羣中適應度最高的兩個個體結構完整地複製到待配種羣中)。
   3、按個體所處的位置確定其變異概率並變異;按優良個體複製4份,劣質個體不復制的原則。
   4、從複製組中孫繼選擇兩個個體,對這兩個個體進行多次交叉,從所得的結果中選擇一個最優個體存入新種羣
   5、弱滿足結束條件,則停止;不然,轉到第一步,直至找到所有符合條件的規則。
   本算法的優點:在各代的每一次演化過程中,子代總是保留了父代中最好的個體,以在“高適應度模式爲祖先的家族方向”搜索出更好的樣本,從而保證最終可以搜索到全局最優解。
              
                 改進的遺傳算法(二) 
    步驟如下:
    1、劃分尋優空間。根據字符串中表示各個變量的最高位是0或1可將字符串劃分成兩個對等的子空間,假設有m個變量,則存在m種劃分方式,可以形成m對子空間。
    2、設計空間退化。在演化到某一代時,如果適應度最高的前np個個體都位於同一字符串子空間內,可以認爲最優點以很大概率落入該子空間中,可將該子空間作爲下一代的尋優空間。
       還需一定的變化,此處略,未看懂。
    3、尋優空間的移動。如果當前最優解得某個分量處在當前設計空間的邊界,該變量對應的子串的各位相同,均爲0或1,則認爲最有解有可能在當前尋優空間以外。此時,在該分量方向移動尋優空間,以避免尋優空間縮減而導致失去最優解。
                  改進的遺傳算法(三) 
    再囉嗦一下,遺傳算法的5個基本要素,到現在我一個都不知道如何解決
    基本要素:參數編碼、初始羣體的設定、適應度函數的設計、操作設計和控制參數設定
    1、初始羣體的產生。
       要實現全局最優,初始羣體在解空間中應儘可能分散。
       首先根據所給出的問題構造均勻數組或正交數組,然後執行如下算法產生初始羣體:
       (1)講解空間劃分成S個子空間。
       (2)量化每個子空間,運用均勻數組或正交數組選擇M個染色體。
       (3)從M.S個染色體中,選擇適應度函數最大的N個作爲初始羣體。
       同時應保證任意兩個個體之間的距離應大於特定的值。
    2、選擇算子的改進。
       爲解決“早熟收斂”和“搜索遲鈍”問題,採用有條件的最佳保留策略,即有條件地將最佳個體直接傳遞到下一代或至少等同於前一代。
       也可使用“遺傳--災變”算法,即在遺傳算法的基礎上,模擬自然界的災變現象,提高遺傳算法的性能。當判斷連續數代最佳染色體沒有任何變化時,或者各個染色體已過於近似時,即可實施災變。災變方法很多,可以突然增大變異概率或對不同個體實施不同規模的突變。
    3、遺傳算法重要參數的選擇。
       需選擇的參數有:染色體長度l,羣體規模n,交叉概率Pc,變異概率Pm等。
       染色體長度的選擇對二進制編碼來說取決於特定問題的精度,存在定長和變長方式。
       羣體規模通常取20--200。一般來說,求解問題的非線性越大,n的選擇就應該越大。
       將進化過程分爲漸進和突變兩個階段:漸進階段強交叉,弱變異,強化優勢型選擇算子;突變階段弱交叉,強變異,弱化優勢型選擇算子。
    4、適應度函數的設計。
       適應度函數的選擇標準是:規範性(單值、連續、嚴格單調)、合理性(計算量小)、通用性。 
    5、進化過程中動態調整子代個體。
       在進化過程中,可對羣體中的個體進行調整,包括引入移民因子、過濾相似個體、動態補充子代新個體等。
       所謂的移民機制,就是在每一代進化過程中以一定的淘汰率(一般取爲15%--20%)將最差個體淘汰,然後用產生的新個體代替。
       過濾相似個體,可以加快收斂速度,減少基因的單一性。
    6、小範圍競爭擇優的交叉、變異操作。
       將某一對父母A、B進行n次(3-5)交叉、變異操作,生成2n個不同的個體,選出其中一個最高適應度的個體,送入子代對個體中。反覆隨機選擇父母對,直到生成設定個數的子代個體爲止。
  
                       改進的遺傳算法(四) 
     從適應度值標定和羣體多樣化兩方面提出改進方法。
     1、適應度值標定
       適應度值標定:對適應度值超大的特殊個體,爲防止其統治整個羣體使算法陷入局部最優解,需限制其繁殖。在計算臨近結束,遺傳算法逐漸收斂時,由於羣體中個體適應度值比較接近,繼續優化選擇較爲困難,造成在最優解附近左右搖擺,此時應將個體使用度值加以放大,以提高選擇能力。 
    2、羣體多樣化
       遺傳算法的早熟原因是交叉算子在搜索過程中存在着嚴重的成熟化效應。可見,避免早熟的關鍵是使羣體呈多樣化發展,也就是應使搜索點分佈在各極值點坐在的區域。
    改進的遺傳算法步驟如下:
    (1)個體按適應度值大小排序
    (2)求平均適應度值,以此作爲閾值,選擇適應值大於平均適應度值的個體
    (3)判斷相似程度,以最高適應度值爲模板,選擇不同末拌的個體組成羣體
    (4)重複(3),逐次以適應能夠度值高的個體爲模板,選擇不同模板的個體組成羣體。
    (5)判斷是否達到羣體規模。如果是,則進行下一步交叉、變異等遺傳操作;否則,重複(4)。如果不能得到足夠的羣體規模,則去除的個體按適應度值大小順序順次補足羣體所缺數量。
    (6)判斷是否滿足結束要求。如果是,則結束,否則轉到(1)


-------------------------------------------------------------------------------------------

遺傳算法求解多目標優化問題  

解決含多目標和多約束的優化問題稱爲多目標優化問題(Multi-objective Opimization)。    

   本項目爲多目標優化問題

   Pareto最優解:不存在比其更優的解。常用方法:

1、  權重係數變換法:給每個目標函數賦予權重,其線性加權和爲總的目標函數。

2、  並列選擇法:先將羣體中的全部個體按子目標函數的數目均等地劃分爲一些子羣體,對每個子羣體分配一個子目標函數,各個子目標函數在相應的子羣體中獨立地進行選擇運算,各自選擇出一些適應度高的個體組成一個新的子羣體,然後再將所有這些新生成的子羣體合併成一個完整的羣體,在這個羣體中進行交叉和變異操作,從而生成下一代的完整羣體,如此不斷地進行“分割—並列選擇—合併”操作,最終可求出多目標優化問題的Pareto最優解。

3、  排列選擇法:基於Pareto最優個體(Pareto最優個體是指羣體中的這樣一個或一些個體,羣體中的其他個體都不比它或它們更優越),對羣體中的各個個體進行排序,依據這個排列次序來進行進化過程中的選擇運算,從而使得排在前面的Pareto最優個體將有更多的機會遺傳到下一代羣體中。如此這樣經過一定代數的循環之後,最終就可求出多目標最優化問題的Pareto最優解。

4、  共享函數法:利用小生境遺傳算法,將相同個體或類似個體的數量加以限制,以便能夠產生出種類較多的不同的最優解。對於一個個體X,在它的附近還存在有多少種、多大程度相似的個體,是可以度量的,這種度量值稱爲小生鏡數。

5、  混合法:選擇算子的主體使用並列選擇法,然後通過引入保留最佳個體和共享函數的思想來彌補只使用並列選擇法的不足之處。(1)並列選擇過程;(2)保留Pareto最優個體過程,對於子羣體中的Pareto最優個體,不讓其參與個體的交叉運算和變異運算,而是將這個或這些Pareto最優個體直接保留到下一代子羣體中;(3)共享函數處理過程。

遺傳算法有效性的理論依據爲模式定理和積木塊假設。模式定理保證了較優的模式(遺傳算法的較優解)的樣本呈指數級增長。積木塊假設提出,遺傳算法具備尋找到全局最優解的能力,即具有低階、短距、高平均適應度的模式(積木塊)在遺傳算子作用下,相互結合,能生成高階、長距、高平均適應度的模式,最終生成全局最優解。

   基於三值字符集{0,1,*}所產生的能描述具有某些結構相似性的0、1字符串集的字符串稱作模式。模式H中確定位置的個數稱作該模式的階數。一個模式的階數越高,其樣本數就越少,因而確定性越高。模式H中第一個確定位置和最後一個確定位置之間的距離稱作該模式的定義距。

  

  

   模式定理:在遺傳算子選擇、交叉和變異的作用下,具有階數低、長度短、平均適應度高於羣體平均適應度的模式在子代中將以指數級增長。

 

   積木塊假設(Building Block Hypothesis):階數低、長度短、適應度高的模式(積木塊)在遺傳算子作用下,相互結合,能生成階數高、長度長、適應度高的模式,可最終生成全局最優解。

 

   在遺傳算法中,將所有妨礙適應度高的個體的生成從而影響算法正常工作的問題統稱爲欺騙問題(Deceptive Problem)。

 

   競爭模式:若模式H和H’中*的位置完全一致,但任一確定位的編碼均不同,則稱H和H’互爲競爭模式。

 

   欺騙性:假設f(X)的最大值對應的X的集合爲X*,H爲一包含X*的m階模式,H的競爭模式爲H’,而且f(H)>f(H’),則f爲m階欺騙。

 

   最小欺騙性:在欺騙問題中,爲了造成騙局所需設置的最小的問題規模(即階數)成爲最小欺騙性。

 

   早熟(Premature Convergence,簡稱PC):未成熟收斂,即羣體中個體的多樣性過早地丟失,從而使算法陷入局部最優點。主要表現在兩個方面:

1、  羣體中所有的個體都陷入同一極值而停止進化。

2、  接近最優解的個體總是被淘汰,進化過程不收斂。

 

未成熟收斂的主要原因:

1、  理論上考慮的選擇、交叉、變異操作都是絕對精確的,它們之間相互協調,能搜索到整個解空間,但是在具體實現時很難達到這個要求。

2、  所求解的問題是遺傳算法欺騙問題。當解決的問題對於標準遺傳算法來說比較困難時,遺傳算法就會偏離尋優方向,這種問題被稱爲遺傳算法欺騙問題。

3、  遺傳算法處理的羣體是有限的,因而存在隨機誤差,它主要包括取樣誤差和選擇誤差。取樣誤差是指所選擇的有限羣體不能代表整個羣體所產生的誤差。選擇誤差是指不能按期望的概率進行個體選擇。

 

遺傳算法早熟的具體表現:

1、  在進化初始階段,生成了具有很高適應度的個體X。

2、  在基於適應度比例的選擇下,其他個體被淘汰,大部分個體與X一致。

3、  相同的兩個個體交叉,從而未能生成新個體。

4、  通過變異所生成的個體適應度高但數量少,所以被淘汰的概率很大。

5、  羣體中的大部分個體都處於與X一致的狀態。

 

   防止未成熟收斂的方法:

1、  重新啓動法:碰到未成熟問題而不能繼續時,隨即選擇一組初始值重新進行遺傳算法操作。

2、  配對策略(Mating Strategies):爲了維持羣體的多樣性,有目的的選擇配對個體,以防止根本不相似的個體進行配對。Eshelman提出了一種可以更直接的防止相似個體交配的方法—防止亂倫機制(Incest Prevention Mechanism):參與交配的個體是隨機配對的,但只有當參與配對的個體間的海明距離超過一定閾值時,才允許他們進行交配。

3、  重組策略(Recombination Strategies):就是使用交叉算子。主要是從使用頻率和交叉點兩方面考慮,來維持羣體的多樣性。

4、  替代策略(Replacement Strategies):確定在選擇、交叉產生的個體中,選擇哪一個個體進入新一代羣體。

 

性能評估:

目前,遺傳算法的評估指標大多采用適應度值。

1、  在線性能(On-line Performance)評估準則:可用從第一代到當前的優化進程的平均值來表示。

2、  離線性能(Off-line Performance)評估準則:是在特定時刻或特定值的最佳性能的累積平均。即在進化過程中,每進化一代,就統計目前爲止的各代中的最佳適應度或最佳平均適應度,並計算對進化代數的平均值。

離線性能用於測試算法的收斂性,在應用時,優化問題的求解可以得到模擬,在一定的優化進程停止準則下,當前最好的解可以被保存和利用;而在線性能優於測量算法的動態性,在應用時,優化問題的求解必須通過真實的實驗在線實現,可以迅速得到較好的優化結果。

 

一個好的優化算法爲:當xi能穩定地接近於全局極小點(或極大點)的鄰域時,迅速收斂於x*,當滿足給定的收斂準則時,迭代中止。

 

   小生境技術:排擠機制----在一個有限的生存空間中,各種不同的生物爲了延續生存,必須相互競爭各種有限的生存資源。差別較大的個體由於生活習性不同而很少競爭,處於平衡狀態的大小固定的種羣,新生個體將代替與之相似的舊個體。排擠機制用海明距離來度量個體之間的相似性。

 

   共享函數:用來度量兩個個體的相鄰關係和程度。給定個體g,它的共享函數由它與種羣中的其他個體的相似程度決定。將g與種羣中其他個體逐個比較,若很相似,則對g的共享函數加一個較大值;否則,就加一個較小值。個體共享度爲該個體與羣體內其他個體共享函數之和。


---------------------------------------------------------------------------------------

遺傳算法的基本原理和方法

一、編碼

 

編碼:把一個問題的可行解從其解空間轉換到遺傳算法的搜索空間的轉換方法。

解碼(譯碼):遺傳算法解空間向問題空間的轉換。

 

二進制編碼的缺點是漢明懸崖(Hamming Cliff),就是在某些相鄰整數的二進制代碼之間有很大的漢明距離,使得遺傳算法的交叉和突變都難以跨越。

格雷碼(Gray Code):在相鄰整數之間漢明距離都爲1。

 

(較好)有意義的積木塊編碼規則:所定編碼應當易於生成與所求問題相關的短距和低階的積木塊;最小字符集編碼規則,所定編碼應採用最小字符集以使問題得到自然的表示或描述。

 

二進制編碼比十進制編碼搜索能力強,但不能保持羣體穩定性。

 

動態參數編碼(Dynamic Paremeter Coding):爲了得到很高的精度,讓遺傳算法從很粗糙的精度開始收斂,當遺傳算法找到一個區域後,就將搜索現在在這個區域,重新編碼,重新啓動,重複這一過程,直到達到要求的精度爲止。

 

編碼方法

1、  二進制編碼方法

缺點:存在着連續函數離散化時的映射誤差。不能直接反映出所求問題的本身結構特徵,不便於開發針對問題的專門知識的遺傳運算算子,很難滿足積木塊編碼原則

2、  格雷碼編碼:連續的兩個整數所對應的編碼之間僅僅只有一個碼位是不同的,其餘碼位都相同。

3、  浮點數編碼方法:個體的每個基因值用某一範圍內的某個浮點數來表示,個體的編碼長度等於其決策變量的位數。

4、  各參數級聯編碼:對含有多個變量的個體進行編碼的方法。通常將各個參數分別以某種編碼方法進行編碼,然後再將他們的編碼按照一定順序連接在一起就組成了表示全部參數的個體編碼。

5、  多參數交叉編碼:將各個參數中起主要作用的碼位集中在一起,這樣它們就不易於被遺傳算子破壞掉。

 

評估編碼的三個規範:完備性、健全性、非冗餘性。

 

二、選擇

 

遺傳算法中的選擇操作就是用來確定如何從父代羣體中按某種方法選取那些個體遺傳到下一代羣體中的一種遺傳運算,用來確定重組或交叉個體,以及被選個體將產生多少個子代個體。

 

常用的選擇算子:

1、  輪盤賭選擇(Roulette Wheel Selection):是一種回放式隨機採樣方法。每個個體進入下一代的概率等於它的適應度值與整個種羣中個體適應度值和的比例。選擇誤差較大。

2、  隨機競爭選擇(Stochastic Tournament):每次按輪盤賭選擇一對個體,然後讓這兩個個體進行競爭,適應度高的被選中,如此反覆,直到選滿爲止。

3、  最佳保留選擇:首先按輪盤賭選擇方法執行遺傳算法的選擇操作,然後將當前羣體中適應度最高的個體結構完整地複製到下一代羣體中。

4、  無回放隨機選擇(也叫期望值選擇Excepted Value Selection):根據每個個體在下一代羣體中的生存期望來進行隨機選擇運算。方法如下

(1)       計算羣體中每個個體在下一代羣體中的生存期望數目N。

(2)       若某一個體被選中參與交叉運算,則它在下一代中的生存期望數目減去0.5,若某一個體未被選中參與交叉運算,則它在下一代中的生存期望數目減去1.0。

(3)       隨着選擇過程的進行,若某一個體的生存期望數目小於0時,則該個體就不再有機會被選中。

5、  確定式選擇:按照一種確定的方式來進行選擇操作。具體操作過程如下:

(1)       計算羣體中各個個體在下一代羣體中的期望生存數目N。

(2)       用N的整數部分確定各個對應個體在下一代羣體中的生存數目。

(3)       用N的小數部分對個體進行降序排列,順序取前M個個體加入到下一代羣體中。至此可完全確定出下一代羣體中M個個體。

6、無回放餘數隨機選擇:可確保適應度比平均適應度大的一些個體能夠被遺傳到下一代羣       體中,因而選擇誤差比較小。

7、均勻排序:對羣體中的所有個體按期適應度大小進行排序,基於這個排序來分配各個個體被選中的概率。

8、最佳保存策略:當前羣體中適應度最高的個體不參與交叉運算和變異運算,而是用它來代替掉本代羣體中經過交叉、變異等操作後所產生的適應度最低的個體。

9、隨機聯賽選擇:每次選取幾個個體中適應度最高的一個個體遺傳到下一代羣體中。

10、排擠選擇:新生成的子代將代替或排擠相似的舊父代個體,提高羣體的多樣性。

 

三、交叉

 

遺傳算法的交叉操作,是指對兩個相互配對的染色體按某種方式相互交換其部分基因,從而形成兩個新的個體。

 

適用於二進制編碼個體或浮點數編碼個體的交叉算子:

1、單點交叉(One-point Crossover):指在個體編碼串中只隨機設置一個交叉點,然後再該點相互交換兩個配對個體的部分染色體。

2、兩點交叉與多點交叉:

(1)   兩點交叉(Two-point Crossover):在個體編碼串中隨機設置了兩個交叉點,然後再進行部分基因交換。

(2)   多點交叉(Multi-point Crossover)

3、均勻交叉(也稱一致交叉,Uniform Crossover):兩個配對個體的每個基因座上的基因都以相同的交叉概率進行交換,從而形成兩個新個體。

4、算術交叉(Arithmetic Crossover):由兩個個體的線性組合而產生出兩個新的個體。該操作對象一般是由浮點數編碼表示的個體。

 

四、變異

遺傳算法中的變異運算,是指將個體染色體編碼串中的某些基因座上的基因值用該基因座上的其它等位基因來替換,從而形成以給新的個體。

 

以下變異算子適用於二進制編碼和浮點數編碼的個體:

1、基本位變異(Simple Mutation):對個體編碼串中以變異概率、隨機指定的某一位或某幾位僅因座上的值做變異運算。

2、均勻變異(Uniform Mutation):分別用符合某一範圍內均勻分佈的隨機數,以某一較小的概率來替換個體編碼串中各個基因座上的原有基因值。(特別適用於在算法的初級運行階段)

3、邊界變異(Boundary Mutation):隨機的取基因座上的兩個對應邊界基因值之一去替代原有基因值。特別適用於最優點位於或接近於可行解的邊界時的一類問題。

4、非均勻變異:對原有的基因值做一隨機擾動,以擾動後的結果作爲變異後的新基因值。對每個基因座都以相同的概率進行變異運算之後,相當於整個解向量在解空間中作了一次輕微的變動。

5、高斯近似變異:進行變異操作時用符號均值爲P的平均值,方差爲P的正態分佈的一個隨機數來替換原有的基因值。

 

五、適應度函數

 

適應度函數也稱評價函數,是根據目標函數確定的用於區分羣體中個體好壞的標準。適應度函數總是非負的,而目標函數可能有正有負,故需要在目標函數與適應度函數之間進行變換。

 

評價個體適應度的一般過程爲:

1、對個體編碼串進行解碼處理後,可得到個體的表現型。

2、由個體的表現型可計算出對應個體的目標函數值。

3、根據最優化問題的類型,由目標函數值按一定的轉換規則求出個體的適應度。

 

適應度函數的設計主要應滿足以下要求:

1、單值、連續、非負、最大化。

2、合理、一致性。較難。

3、計算量小。

4、通用性強。

 

由目標函數f(x)到適應度函數Fit(f(x))的轉換方法有以下三種:

1、直接以待解的目標函數f(x)轉換爲適應度函數。

      Fit(f(x))=f(x)  目標函數爲最大化問題

      Fit(f(x))=-f(x) 目標函數爲最小化問題

問題:可能不滿足常用的輪盤賭選擇中概率非負的要求;某攜帶求解的函數在函數值分佈上相差很大,由此得到的平均適應度可能不利於體現種羣的平均性能。

2、做轉換。(具體轉換方法略)

3、同2,轉換公式不同。

 

    適應度尺度變換(Fitness Scaling Transform):在遺傳算法的不同階段,對個體的適應度進行適當的擴大或縮小。常用的尺度變換方法如下:

1、線性尺度變換:F'=aF+b

2、       乘冪尺度變換:F'=F

3、       指數尺度變換:F'=exp(-beitaF)

 

六、約束條件處理

1、搜索空間限定法:對遺傳算法的搜索空間的大小加以限制,使得搜索空間中表示一個個體的點與解空間中的表示一個可行解的點有一一對應關係。

2、可行解變換法:在由個體基因型向個體表現型的變換中,增加使其滿足約束條件的處理過程,即尋找個體基因型與個體表現型的多對一變換關係,擴大了搜索空間,使進化過程中所產生的個體總能通過這個變換而轉化成傑空間中滿足約束條件的一個可行解。

3、罰函數法:對在解空間中無對應可行解的個體計算其適應度時,處以一個懲罰函數,從而降低該個體的適應度,使該個體被遺傳到下一代羣體中的概率減小。

------------------------------------------------------------------------
這兩天寫代碼總算有點成績,跑出來的結果雖然並不太理想,至少給了我點信心---看來俺還是挖進去了。
    早上用一組數據進行了測試,迭代了100次,每次都初始化羣體,並在初始化時設定模型最大變量個數爲10,每次迭代設置代數爲100代,在20組數據中選擇16組作爲擬合數據,其餘4組作爲測試數據,算法結束時,求每個個體的平均誤差率和每次迭代落入一定誤差範圍內的個數。結果不是很好,平均誤差率分別爲:7.7%、8.5%、8.2%、9.4%.
    誤差還是太大,並且每次運行的結果都不相同,選擇的變量個數爲16,但是基本上每組選擇的變量都不相同。這可能就是誤差很大,且結果不穩定的主要原因,方法可能還存在很大漏洞,只是目前只知道細節上的不足,大方向上還沒有想法。
    並且,在初始羣體設定時,我發現變量個數如果不加限制,效果很差;設置爲10,改進非常大,但是<10目前並沒有發現性能更好,此處還需再進行測試。
    誤差如果能改進到2%左右,就比較完美了。可是那一天還太遙遠。
    今天晚上準備跑1000次,看看平均效果能達到哪種程度。
    明天晚上如果可以的話,準備將模型最大變量個數設置到從1到10各跑100次,以求證究竟哪個變量個數可以提高算法性能。
    朋友找我,問題只能留下了......

----------------------------------------------------------------------

這兩天看書,覺得有啓迪的地方:

                     種羣的表示和初始化

一般情況下,在遺傳算法中大多采用單層的二進制串染色體表示方法。

採用格雷碼,可用來克服傳統的二進制表示方法的不足。

不足:1、表示途中臨近值之間過大的海明(Hamming)距離使用標準的二進制表示情況下,搜索過程易導致欺騙性結果或不能有效定位於全局最小值。

     2、對一些問題域,有一個爭論時二進制表示事實上是靠不住的,它掩蓋了搜索的自然性。

      3、Wright聲稱使用實值基因的遺傳算法在數值函數優化上與二進制編碼相比有許多的優點。表現爲:在函數計算前,不需要從染色體到表現值的轉換,提高了遺傳算法的效率;計算機內部高效的浮點表示可直接使用,減少了內存需要;相對於離散的二進制或其他值,沒有精度損失;對應用不同的遺傳算子非常自由。(Michalewicz在其著作《進化策略(Evolution Strategies)》)中描述了使用實值編碼的細節)

 如果通過重組產生的新種羣的個體數目少於原始種羣的大小,新種羣和舊種羣大小的差異被稱爲代購。在這種情況下,每一代產生的新個體數較少,這時的遺傳算法稱爲“穩態”或“增量”的。如果一個或多個最適合個體被連續代繁殖,則遺傳算法被稱爲得到“精英策略”。

穩態遺傳算法(Steady-State  GA)最重要的一個特徵是在每一代中不創建比現存種羣多的後代,計算次數被減少,並且剷射功能後代時由於有少的新個體存儲,內存要求也小。

策略:將最差適應度個體進行替代,將最老個體進行替代,要求最佳個體必須確保繁殖到下一代種羣中。

遺傳算法工具箱裏有一個體函數reins使個體可在重組後重插入種羣中。

以前總是認爲,遺傳算法的個體應該只剩下最後一個,所以編程出現了很大的誤差,最後發現種羣的數目不應該減少,從上文中又對此處有了新的認識,可以在小範圍內減少個體數目,目前我的算法就是這樣實現的。

下禮拜來可以看看書中的例子,剛翻了一下,有很多值得借鑑的地方。在很多細微之處對基本遺傳算法進行了改進。

-----------------------------------------------------------------------------
本以爲自己的算法已經初步達到了要求,沒想到再對先前算法進行整合時,發現了一個很大的漏洞,這也是導致在預測y2時效果比其他算法好得多的原因。改正後,發現預測性能一下子就降低了將近20個百分點,真如五雷轟頂呀,不過既然發現了錯誤,才能找到改正的方向,看來做任何事情絕不能停滯於一點點的成績,正是因爲y2較高的誤差,算法才需要切實地進一步改進。
 
    昨天下午,在開會的時候,認真地想了想算法目前還存在的問題及自認爲尚需改進的地方,現總結如下:
 
    1、對上述程序中出現的漏洞,已解決,但是結果是誤差變大。
 
    2、算法一直以來就存在一個警告,歸其原因,是因爲擬合矩陣爲病態矩陣的原因。如果變量是與另一個變量完全冗餘,這個矩陣稱爲病態矩陣,即矩陣不能求逆。例如,有一個變量是其他三個變量之和,這個變量也存在於模型中,這個矩陣就是病態矩陣。矩陣A和b存在的微小擾動δA和δb,會引起方程組Ax=b解的很大變化,則稱Ax=b爲病態方程組,稱矩陣A爲病態矩陣解決方法:GS迭代和SOR迭代,matlab中無自帶函數,必須自己寫
 對付病態的線性方程組,可有如下途徑:
(1)增加計算機字長(即機器精度)。例如,若在PC機上用單精度和GAUSS主元消去法或LU分解,可求出直至以5階矩陣爲係數矩陣的方程組Ax=y的穩定近似解,而當高於5階時,上述算法即失效;若採用雙精度計算,利用上述算法對20到30階的方程組求解,仍能得到3位以上的有效數字。
(2)條件預優法,即:選擇一個非奇異矩陣P,使得cond(PA)<<cond(A),這時可求解方程組 PAx=Py,由於該方程組與Ax=y的解等價,從而避開了病態所帶來的困難.當然,選擇P是一個困難問題,不過現在已經研究了一些相當成功的方法來構造P.
(3)正則化方法.(由於篇幅較長,請參閱相關文獻,如<<不適定問題的正則化方法>>
 正則化技術,regularization)。比如在對角元素上加一個很小的量就是一種很常見的做法
(尚需進一步研究,現在還有疑問,是否真的是病態矩陣,或許是奇異矩陣八議遺傳算法
 
    3、對於遺傳算法,由於x的係數爲係數矩陣,Matlab如何求解維數巨大的稀疏矩陣方程?
  Matlab提供了非常豐富的迭代型矩陣求解器,方法包括CG,BiCG,BiCGSTAB,     CGS,GMRES,LSQR,MINRES,P-CG,QMR,SYMMLQ等,爲了加快矩陣求解速度,還        提供了兩個Preconditioner函數:luinc(不完全LU分解),和cholinc(不完全     Cholesky分解)。下面是一個使用GMRES求解方程Amat*x=rhs的一個簡單例子:
       
        [L2,U2] = luinc(Amat,1e-3);
        tic
           x=gmres(Amat,rhs,[],1e-6,100,L2,U2);
        toc
 
4、關於個人的論文問題,得抓緊,今天看到了一份徵文報告,很好的雜誌,應該沒戲,不過決定試一下。

-----------------------------------------------------------
 這兩天終於將程序整合到了一塊,目前爲止除過上篇文章中提出的warning問題,還沒有發現其他大的問題,下面就該將算法性能作爲首要解決的問題。
   以前的尋找最優解函數,只是隨機挑選測試數據,然後迭代100次之後尋找最優解,重複n次後,得到整個系統的最優解。
   覺得這樣不僅浪費時間,而且有很多是無用功,本項目的目標是準確率達到98%以上,故只要得到誤差率小於2%的最優個體,即可結束。
   於是,準備在以下幾個方面對前面的函數進行改進:
    1、設置迭代次數爲n,每次迭代循環m次,若在循環過程中,得到最小誤差小於2%,則認爲已找到最優解,可直接結束程序。
    2、若在每次迭代中,連續p代的最小誤差都相同,則認爲算法陷入了局部最優解的誤區,此時應該直接將適應度較小的q個個體從羣體中濾去,任意生成或利用較優的個體生成q個個體,重新放入種羣中。
    3、應該改變單一的變異率和交叉率,設置動態的交叉變異率。具體情況查閱資料。
    4、在舊算法執行結束後,y1的效果已達到目標,但是y2效果較差,故改進的算法驗證主要依據y2來進行。
    目前能想到的問題就這麼多,先把上述幾個問題解決了看看效果再說。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章