如果需要建模的問題太復(fù)雜,無法套用已知的線性、非線性或隨機(jī)優(yōu)化之類的數(shù)學(xué)式求解方法解決,那么這個時候可以考慮遺傳算法(也叫進(jìn)化算法,Genetic Algorithms,GAs)。

遺傳算法是什么?
遺傳算法是一種受生物進(jìn)化論(特別是自然選擇和遺傳學(xué))啟發(fā)的搜索和優(yōu)化算法。它模擬了“物競天擇,適者生存”的過程,用于解決復(fù)雜的優(yōu)化問題,尤其是在傳統(tǒng)數(shù)學(xué)方法難以奏效的情況下。
遺傳算法是模仿遺傳繁衍的繁衍過程來實(shí)現(xiàn)的,所以可以回顧一下生物物種進(jìn)化的過程。
物種進(jìn)化
梳理一個生物物種的進(jìn)化過程:
-
一個種群中有許多個體。
-
每個個體都有其獨(dú)特的基因(DNA),決定了它的性狀(比如身高、速度、智力......)。
-
環(huán)境資源有限,個體之間需要競爭。更適應(yīng)環(huán)境的個體有更大概率能生存下來并繁衍后代(自然選擇)。
-
后代通過交叉(父母的基因混合)基礎(chǔ)父輩基于 和 變異(基因發(fā)生微小隨機(jī)變化)更新基因。
-
經(jīng)過一代又一代的繁衍,整個種群的適應(yīng)度會越來越高,因?yàn)閮?yōu)良的基因被保留和組合,最終進(jìn)化出更能適應(yīng)環(huán)境的個體。
遺傳算法就是將這個過程數(shù)字化,以尋找問題的最優(yōu)解。
目標(biāo): 找到一個問題的最優(yōu)解;
做法: 用數(shù)字化模擬這個過程。
數(shù)字模擬化的過程:

遺傳算法的工作流程其實(shí)是一個循環(huán)迭代的過程,可以概括為以下五步:
1 初始化: 隨機(jī)生成一個由多個“個體”(潛在解)組成的初始種群。
2 評估: 用適應(yīng)度函數(shù)計(jì)算種群中每個個體的適應(yīng)度分?jǐn)?shù)。
3 選擇: 根據(jù)適應(yīng)度高低,擇優(yōu)選擇“父母”個體。高適應(yīng)度個體有更高概率被選中繁衍后代。
4 交叉: 模擬基因重組,將選中的“父母”的染色體部分交換,產(chǎn)生新的“后代”個體。
5 變異: 以很低概率隨機(jī)改變后代染色體中的部分基因,引入新特性。
∞ 循環(huán): 新產(chǎn)生的后代形成新的種群,取代舊的種群。然后重復(fù)步驟 2-5,直到滿足終止條件(如找到足夠好的解或達(dá)到最大迭代次數(shù))。
提示:這些只是理論上的流程,具體參數(shù)和流程需要在設(shè)計(jì)算法的時候考慮和調(diào)整以獲得更好的結(jié)果。
案例——背包問題
一些術(shù)語了解:
-
個體與染色體:在算法中,一個可能的解決方案(比如一個設(shè)計(jì)參數(shù)、一個時間表)被看作一個“個體”。這個個體的完整“基因藍(lán)圖”就是它的染色體,通常用一串?dāng)?shù)字(二進(jìn)制或十進(jìn)制)表示。
-
種群:不是單個個體在進(jìn)化,而是一群個體(一個種群)在一起進(jìn)化,這模擬了自然界中的生物種群。
-
環(huán)境與適應(yīng)度:待解決的問題本身(如“成本最低”、“效率最高”)就是算法的“環(huán)境”。衡量一個解決方案好壞的標(biāo)準(zhǔn)被量化為適應(yīng)度函數(shù)。個體越適應(yīng)環(huán)境(解決方案越好),其適應(yīng)度得分就越高。
-
......
場景設(shè)定:
你是一個要去野營的孩子,你有一個容量有限的背包。你面前擺著5件物品,每件物品的價值和體積都不同。
你的目標(biāo)是:在背包容量限制下,選擇一些物品裝進(jìn)去,使得背包里所有物品的總價值最高。
物品列表如下:
| 物品 | 價值(元) | 體積(升) |
|---|---|---|
| 水壺 | 10 | 2 |
| 書 | 5 | 4 |
| 零食 | 15 | 3 |
| 外套 | 20 | 5 |
| 手電筒 | 12 | 2 |
第一步 — 初始化
核心是:將一個數(shù)學(xué)優(yōu)化問題,轉(zhuǎn)化為一個用“數(shù)字基因”表示的“虛擬生物”的生存與繁衍問題。(這一步也叫編碼過程)
我們?nèi)绾斡靡粋€“基因”來表示一種裝包方案?
我們用一串二進(jìn)制代碼(0和1)來表示,長度等于物品的數(shù)量。
1代表“拿”這個物品0代表“不拿”這個物品
例如:
- 染色體
10101表示:拿水壺(1)、不拿書(0)、拿零食(1)、不拿外套(0)、拿手電筒(1)。 - 染色體
01010表示:不拿水壺、拿書、不拿零食、拿外套、不拿手電筒。
我們隨機(jī)生成幾種不同的裝包方案,作為初始的“想法”或“種群”。
假設(shè)我們初始的4個“個體”(裝包方案)是:
- 個體A:
1 0 1 0 1(拿水壺、零食、手電筒) - 個體B:
0 1 1 0 0(拿書、零食) - 個體C:
1 1 0 1 0(拿水壺、書、外套) - 個體D:
0 0 0 1 1(拿外套、手電筒)
第二步 — 適應(yīng)度評估
目的:設(shè)計(jì)一個適應(yīng)度函數(shù) 來評估每個個體對環(huán)境的適應(yīng)程度,即解的好壞。適應(yīng)度越高,個體越優(yōu)秀。
我們的“適應(yīng)度函數(shù)”就是計(jì)算這個方案的總價值。2個關(guān)鍵:
- 如果總體積超過8升,這個方案就是無效的,我們給它很低的分?jǐn)?shù)(比如0分)。
- 誰的總價值高,誰就保留誰下來。
我們來計(jì)算一下:
- 個體A
10101:物品 = 水壺(2L) + 零食(3L) + 手電筒(2L)。總體積 = 7L (<8L),總價值 = 10+15+12 = 37元。適應(yīng)度 = 37。 - 個體B
01100:物品 = 書(4L) + 零食(3L)。總體積 = 7L,總價值 = 5+15 = 20元。適應(yīng)度 = 20。 - 個體C
11010:物品 = 水壺(2L) + 書(4L) + 外套(5L)。總體積 = 11L (>8L)!超重了! 適應(yīng)度 = 0。 - 個體D
00011:物品 = 外套(5L) + 手電筒(2L)。總體積 = 7L,總價值 = 20+12 = 32元。適應(yīng)度 = 32。
第三步 — 遺傳操作(進(jìn)化核心:選擇、交叉、變異)
a. 選擇
根據(jù)適應(yīng)度高低來選擇父母。個體A和D分?jǐn)?shù)高,更可能被選中。個體C因?yàn)闊o效,最容易被淘汰。
假設(shè)我們選中了 個體A (10101) 和 個體D (00011) 作為父母。
b. 交叉
我們讓他們在中間某個位置(比如第2位之后)交換基因。
- 父母A:
10 | 101 - 父母D:
00 | 011
交換后,得到兩個孩子:
- 孩子1:
10 | 011->10011(拿水壺、不拿書、不拿零食、拿外套、拿手電筒) - 孩子2:
00 | 101->00101(不拿水壺、不拿書、拿零食、不拿外套、拿手電筒)
c. 變異
以很小的概率,隨機(jī)改變孩子某個位子的選擇。
假設(shè)孩子1 10011 的第三位(零食)發(fā)生了變異,從0變成了1。
- 孩子1就變成了
10111。
∞ 循環(huán)
形成新種群與終止檢查:
-
我們用新生的孩子(
10111,00101等)替換掉老一代中較差的個體(如個體B和C),形成新一代種群。 -
檢查終止條件:
- 我們計(jì)算新種群中每個個體的適應(yīng)度。比如
10111(拿水壺、零食、外套、手電筒)總體積=12L,超重!適應(yīng)度為0。而00101(拿零食、手電筒)總體積=5L,價值=27元。 - 我們發(fā)現(xiàn)還沒有一個方案的價值能超過第一代個體A的37元,或者我們設(shè)定的迭代次數(shù)還沒到。
- 于是,我們回到第2-3步,繼續(xù)評估、選擇、交叉、變異...
- 在不斷的迭代中,算法可能會組合出像
10101(價值37)或10001(拿水壺和手電筒,價值22,但體積小,為后續(xù)組合留空間)這樣的優(yōu)秀基因,并最終可能找到一個比37元更優(yōu)的解(如果存在的話)。
- 我們計(jì)算新種群中每個個體的適應(yīng)度。比如
總結(jié)
通過背包問題,可以看到遺傳算法如何聰明地探索所有可能的組合:
它不會盲目地嘗試所有\(2^5\)=32種可能。而是通過保留高價方案(選擇)、組合不同方案的優(yōu)點(diǎn)(交叉)、以及偶爾嘗試新選擇(變異),像搭積木一樣,一步步地“進(jìn)化”出接近最優(yōu)的裝包方案。
遺傳算法已經(jīng)成功應(yīng)用于車輛路線、破產(chǎn)預(yù)測、Web搜索...等高度復(fù)雜的現(xiàn)實(shí)問題。
局限性
并非所有問題都可以用遺傳算法來構(gòu)建,它也是有一定的限制性的:
-
在一些情況下,來自少數(shù)相對高度適應(yīng)(但不是最優(yōu))的個體的“基因”可能會主導(dǎo)種群,導(dǎo)致其收斂于局部最大值。當(dāng)種群已經(jīng)收斂時,遺傳算法就不再具備繼續(xù)尋找更好解的能力了。
-
大多數(shù)遺傳算法都依賴于每次模型運(yùn)行時產(chǎn)生不同結(jié)果的隨機(jī)數(shù)生成器,雖然兩次運(yùn)行之間可能具有高度的一致性,但是它們也可能會有所不同。(即使參數(shù)相同,隨機(jī)選擇、交叉和變異可能引導(dǎo)算法走向不同路徑。)
-
找到適用于特定問題的好變量是很困難的。獲取數(shù)據(jù)以填充變量同樣要求很高。
-
選擇系統(tǒng)進(jìn)化的方法需要思考和評估。如果可能解的范圍很小,那么遺傳算法就會很快收斂到一個解上。當(dāng)進(jìn)化進(jìn)行得太快,以致太快改變好的解這可能會錯過最優(yōu)解。
浙公網(wǎng)安備 33010602011771號