遺傳演算法

遺傳演算法（Genetic Algorithm，GA）是計算數學中用於解決最佳化的搜尋演算法，是進化演算法的一種。進化演算法最初是借鑑了進化生物學中的一些現象而發展起來的，這些現象包括遺傳、突變、自然選擇以及雜交等等。

遺傳演算法通常實現方式為一種計算機模擬。對於一個最最佳化問題，一定數量的候選解（稱為個體）可抽象表示為染色體，使種群向更好的解進化。傳統上，解用二進位制表示（即 0 和 1 的串），但也可以用其他表示方法。進化從完全隨機個體的種群開始，之後一代一代發生。在每一代中評價整個種群的適應度，從當前種群中隨機地選擇多個個體（基於它們的適應度），透過自然選擇和突變產生新的生命種群，該種群在演算法的下一次迭代中成為當前種群。

遺傳演算法的機理

在遺傳演算法裡，最佳化問題的解被稱為個體，它表示為一個變數序列，叫做染色體或者基因串。染色體一般被表達為簡單的字串或數字串，不過也有其他的依賴於特殊問題的表示方法適用，這一過程稱為編碼。首先，演算法隨機生成一定數量的個體，有時候操作者也可以干預這個隨機產生過程，以提高初始種群的質量。在每一代中，都會評價每一個體，並透過計算適應度函式得到適應度數值。按照適應度排序種群個體，適應度高的在前面。這裡的 “高” 是相對於初始的種群的低適應度而言。

下一步是產生下一代個體並組成種群。這個過程是透過選擇和繁殖完成，其中繁殖包括交配（crossover，在演算法研究領域中我們稱之為交叉操作）和突變（mutation）。選擇則是根據新個體的適應度進行，但同時不意味著完全以適應度高低為導向，因為單純選擇適應度高的個體將可能導致演算法快速收斂到區域性最優解而非全域性最優解，我們稱之為早熟。作為折中，遺傳演算法依據原則：適應度越高，被選擇的機會越高，而適應度低的，被選擇的機會就低。初始的資料可以透過這樣的選擇過程組成一個相對最佳化的群體。之後，被選擇的個體進入交配過程。一般的遺傳演算法都有一個交配機率（又稱為交叉機率），範圍一般是 0.6~1，這個交配機率反映兩個被選中的個體進行交配的機率。例如，交配機率為 0.8，則 80% 的 “夫妻” 會生育後代。每兩個個體透過交配產生兩個新個體，代替原來的 “老” 個體，而不交配的個體則保持不變。交配父母的染色體相互交換，從而產生兩個新的染色體，第一個個體前半段是父親的染色體，後半段是母親的，第二個個體則正好相反。不過這裡的半段並不是真正的一半，這個位置叫做交配點，也是隨機產生的，可以是染色體的任意位置。再下一步是突變，透過突變產生新的 “子” 個體。一般遺傳演算法都有一個固定的突變常數（又稱為變異機率），通常是 0.1 或者更小，這代表變異發生的機率。根據這個機率，新個體的染色體隨機的突變，通常就是改變染色體的一個位元組（0 變到 1，或者 1 變到 0）。

經過這一系列的過程（選擇、交配和突變），產生的新一代個體不同於初始的一代，並一代一代向增加整體適應度的方向發展，因為總是更常選擇最好的個體產生下一代，而適應度低的個體逐漸被淘汰掉。這樣的過程不斷的重複：評價每個個體，計算適應度，兩兩交配，然後突變，產生第三代。週而復始，直到終止條件滿足為止。一般終止條件有以下幾種：

進化次數限制；
計算耗費的資源限制（例如計算時間、計算佔用的記憶體等）；
一個個體已經滿足最優值的條件，即最優值已經找到；
適應度已經達到飽和，繼續進化不會產生適應度更好的個體；
人為干預；
以及以上兩種或更多種的組合。

1.1 演算法

選擇初始生命種群
迴圈
評價種群中的個體適應度
以比例原則（分數高的挑中機率也較高）選擇產生下一個種群（輪盤法（roulette wheel selection）、競爭法（tournament selection）及等級輪盤法（Rank Based Wheel Selection））。不僅僅挑分數最高的的原因是這麼做可能收斂到區域性的最佳點，而非整體的。
改變該種群（交叉和變異）
直到停止迴圈的條件滿足.

1.2 GA 引數

種群規模（P,population size）：即種群中染色體個體的數目。
字串長度（l, string length）：個體中染色體的長度。
交配機率（pc, probability of performing crossover）：控制著交配運算元的使用頻率。交配操作可以加快收斂，使解達到最有希望的最佳解區域，因此一般取較大的交配機率，但交配機率太高也可能導致過早收斂，則稱為早熟。
突變機率（pm, probability of mutation）：控制著突變運算元的使用頻率。
中止條件（termination criteria）

1.3 特點

遺傳演算法在解決最佳化問題過程中有如下特點：

遺傳演算法在適應度函式選擇不當的情況下有可能收斂於區域性最優，而不能達到全域性最優。
初始種群的數量很重要，如果初始種群數量過多，演算法會佔用大量系統資源；如果初始種群數量過少，演算法很可能忽略掉最優解。
對於每個解，一般根據實際情況進行編碼，這樣有利於編寫變異函式和適應度函式 (Fitness Function)。
在編碼過的遺傳演算法中，每次變異的編碼長度也影響到遺傳演算法的效率。如果變異程式碼長度過短，變異的多樣性會受到限制；如果變異程式碼過長，變異的效率會非常低下，選擇適當的變異長度是提高效率的關鍵。
變異率也是一個重要的引數。
對於動態資料，用遺傳演算法求最優解比較困難，因為染色體種群很可能過早地收斂，而對以後變化了的資料不再產生變化。對於這個問題，研究者提出了一些方法增加基因的多樣性，從而防止過早的收斂。其中一種是所謂觸發式超級變異，就是當染色體群體的質量下降（彼此的區別減少）時增加變異機率；另一種叫隨機外來染色體，是偶爾加入一些全新的隨機生成的染色體個體，從而增加染色體多樣性。
選擇過程很重要，但交叉和變異的重要性存在爭議。一種觀點認為交叉比變異更重要，因為變異僅僅是保證不丟失某些可能的解；而另一種觀點則認為交叉過程的作用只不過是在種群中推廣變異過程所造成的更新，對於初期的種群來說，交叉幾乎等效於一個非常大的變異率，而這麼大的變異很可能影響進化過程。
遺傳演算法很快就能找到良好的解，即使是在很複雜的解空間中。
遺傳演算法並不一定總是最好的最佳化策略，最佳化問題要具體情況具體分析。所以在使用遺傳演算法的同時，也可以嘗試其他演算法，互相補充，甚至根本不用遺傳演算法。
遺傳演算法不能解決那些 “大海撈針” 的問題，所謂 “大海撈針” 問題就是沒有一個確切的適應度函式表徵個體好壞的問題，使得演算法的進化失去導向。
對於任何一個具體的最佳化問題，調節遺傳演算法的引數可能會有利於更好更快收斂，這些引數包括個體數目、交叉率和變異率。例如太大的變異率會導致丟失最優解，而過小的變異率會導致演算法過早的收斂於區域性最優點。對於這些引數的選擇，現在還沒有實用的上下限。
適應度函式對於演算法的速度和效果也很重要。

變數

最簡單的遺傳演算法將染色體表示為一個數位串，數值變數也可以表示成整數，或者實數（浮點數）。演算法中的雜交和突變都是在位元組串上進行的，所以所謂的整數或者實數表示也一定要轉化為數位形式。例如一個變數的形式是實數，其範圍是 0～1，而要求的精度是 0.001，那麼可以用 10 個數位表示：0000000000 表示 0，1111111111 表示 1。那麼 0110001110 就代表 0.398。

在遺傳演算法裡，精英選擇是一種非常成功的產生新個體的策略，它是把最好的若干個個體作為精英直接帶入下一代個體中，而不經過任何改變。

透過平行計算實現遺傳演算法一般有兩種，一種是所謂粗糙並行遺傳演算法，即一個計算單元包含一個種群；而另一種是所謂精細並行遺傳演算法，每一個計算單元處理一個染色體個體。

遺傳演算法有時候還引入其他變數，例如在即時最佳化問題中，可以在適應度函式中引入時間相關性和干擾。

適用的問題

遺傳演算法擅長解決的問題是全域性最最佳化問題，例如，解決時間表安排問題就是它的一個特長，很多安排時間表的軟體都使用遺傳演算法，遺傳演算法還經常被用於解決實際工程問題。

跟傳統的爬山演算法相比，遺傳演算法能夠跳出區域性最優而找到全域性最優點。而且遺傳演算法允許使用非常複雜的適應度函式（或者叫做目標函式），並對變數的變化範圍可以加以限制。而如果是傳統的爬山演算法，對變數範圍進行限制意味著複雜的多的解決過程，這方面的介紹可以參看受限最佳化問題和非受限最佳化問題。

發展歷史

遺傳演算法由密歇根大學的約翰・霍蘭德和他的同事於二十世紀六十年代在對細胞自動機（英文：cellular automata）進行研究時率先提出。在二十世紀八十年代中期之前，對於遺傳演算法的研究還僅僅限於理論方面，直到在匹茲堡召開了第一屆世界遺傳演算法大會。隨著計算機計算能力的發展和實際應用需求的增多，遺傳演算法逐漸進入實際應用階段。1989 年，紐約時報作者約翰・馬科夫寫了一篇文章描述第一個商業用途的遺傳演算法 -- 進化者（英文：Evolver）。之後，越來越多種類的遺傳演算法出現並被用於許多領域中，財富雜誌 500 強企業中大多數都用它進行時間表安排、資料分析、未來趨勢預測、預算、以及解決很多其他組合最佳化問題。

應用領域

計算機自動設計 （CAD, Computer-Automated Design）
工業工程與運作管理
物流系統設計
生產排程
製造系統控制
系統最佳化設計
汽車設計，包括材料選擇、多目標汽車元件設計、減輕重量等。
機電系統設計。
分佈計算機網路的拓撲結構。
電路設計，此類用途的遺傳演算法叫做進化電路。
電子遊戲設計，例如計算平衡解決方案。
機器智慧設計和機器人學習。
模糊控制系統的訓練。
移動通訊最佳化結構。
時間表安排，例如為一個大學安排不衝突的課程時間表。
旅行推銷員問題。
神經網路的訓練，也叫做神經進化。

相關技術

遺傳程式是 John Koza 與遺傳演算法相關的一個技術，在遺傳程式中，並不是引數最佳化，而是計算機程式最佳化。遺傳程式一般採用樹型結構表示計算機程式用於進化，而不是遺傳演算法中的列表或者陣列。一般來說，遺傳程式比遺傳演算法慢，但同時也可以解決一些遺傳演算法解決不了的問題。

互動式遺傳演算法是利用人工評價進行操作的遺傳演算法，一般用於適應度函式無法得到的情況，例如，對於影像、音樂、藝術的設計和 “最佳化”，或者對運動員的訓練等。

模擬退火是解決全域性最佳化問題的另一個可能選擇。它是透過一個解在搜尋空間的隨機變動尋找最優點的方法：如果某一階段的隨機變動增加適應度，則總是被接受，而降低適應度的隨機變動根據一定的機率被有選擇的接受。這個機率由當時的退火溫度和適應度惡化的程度決定，而退火溫度按一定速度降低。從模擬退火演算法看，最最佳化問題的解是透過尋找最小能量點找到的，而不是尋找最佳適應點找到的。模擬退火也可以用於標準遺傳演算法裡，只要把突變率隨時間逐漸降低就可以了。