遺傳演算法簡單介紹與MATLAB實現(一)

2021-08-09 01:36:44 字數 3814 閱讀 3215

第一次聽說遺傳演算法是在高三晚上放學回家的路上,同行的小夥伴問我:你知道遺傳演算法麼?我自然沒聽說過,於是追問細節。

「聽說遺傳演算法能夠自我迭代,讓他本身系統內的東西進行優勝劣汰的自然選擇,把好的保留下來,次一點的東西就排除掉。是不是特別像人工智慧的那種感覺?」

這麼高階的麼?那時候我就對這個演算法產生了一點興趣,畢竟乙個演算法是如何做到自我判斷什麼是好什麼是壞。

因為如此,在我接觸到程式設計以後,我終於有能力去深入研究一下遺傳演算法了。最後覺得,其實這個演算法也沒有當初想得那麼玄乎。

當初年輕不懂事時,對未知的事物有著天然的好奇,自然會把遺傳演算法想的無限大,甚至認為可以自我淘汰不好的**,學習優秀的**等。

其實現在再看過來,遺傳演算法的本質始終沒變,依舊是優勝劣汰,選出最優秀的個體。只不過它的作用被我規劃成了「求乙個系統/模型的最優解」。

顧名思義,學過高中生物的都應該可以理解「遺傳」是什麼,染色體變異、染色體交叉等術語應該也能夠大概知道是什麼意思。其實遺傳演算法主要就是模擬這乙個過程。

不過我也不是專業搞生物的,高中的知識細節部分我早都忘光了,因此拋開其他的,接下來我用我的理解來定義一下遺傳演算法的過程。

遺傳演算法四個基礎概念

遺傳演算法中,乙個基本單位為「個體」,乙個種群(系統)中擁有好多個體。每個個體攜帶兩個內容:染色體與適應度。

為了形象起見,我們可以把乙個個體比喻成一頭羊,一堆羊聚集在一起就成了乙個種群。每乙隻羊長的(肥瘦程度)都不同,有的很肥,有的很瘦。我們作為乙個牧場的牧場主,最終目的是養出最肥的羊。而我們的羊比較奇葩,每天都會產仔,並且產完仔就會死去,令我們牧場羊的數量保持在乙個確定的數量上。

為了逼迫羊們越來越肥,我們每天殺死最瘦的羊,然後越肥的羊就越有機率交配生孩子,生出的孩子有可能變肥,也有可能變瘦。這樣長此以往下去,我們羊群的羊將會越來越肥,而我們也達到了我們的目的。

所以簡單的總結一下,上面每一頭羊都是乙個「個體」,整個牧場就是乙個種群。每一頭羊有「決定肥瘦程度的染色體」與「肥瘦程度」。這個肥瘦程度就是我們要說的遺傳演算法的「適應度」。每一天我們將其稱之為迭代一次,也就是換一批新羊。

或者用生物上的話來說,每一頭羊都有染色體,染色體決定了他們表現出來的性狀是怎樣的。所以說,染色體決定了每一頭羊的肥瘦程度。

因此我們建立以下對應關係:

明確了上面四個基礎概念以後,我們就可以引出他們之間的相互關係。

種群中包含了若干個個體,每個個體都擁有兩個屬性:染色體與適應度。每一次迭代中,種群中的個體數量不變。

染色體其實需要細講的主要還是染色體。

染色體是遺傳演算法與「被求最優解模型」直接相關之處。通常來說乙個模型想要求最優解,那麼就肯定會存在變數,通過控制變數的值讓模型的最終值達到最優。

所以在這裡,模型中所有變數就構成了一條染色體。其中每乙個變數稱之為染色體上的乙個基因。

比如說我們這裡有乙個多元函式f=

f(x,

y),這個函式擁有最大值fm

ax,但是對應的最大值點(x

max,

ymax

) 我們並不知道,用通常方法也十分難求出來,所以我們可以利用遺傳演算法來簡單求解一下。所以就將染色體設定為兩個節點(基因),第乙個節點為

x ,第二個節點為y。

這是對於乙個個體來說的,也就是對於單個個體,他的染色體值我可以寫成乙個向量為ch

rom=

[x,y

] 適應度那麼得到了染色體,模型的最優解如何評價呢?就是利用適應度來尋找最優解。

每個個體的適應度就相當於這個模型在「這個染色體的變數的值下的解」。也就是說這個個體的染色體值為ch

rom=

[x1,

y1] ,所以我們把(x

1,y1

) 帶入到之前的多元函式中,可以得到這個函式的乙個解為f1

=f(x

1,y1

) ,解f1

就是這一條染色體(個體)的適應度。

尋找最優解

對於整個種群,我們假設有

n 個個體,所以對應的,也就有

n條染色體,

n 個適應度。因此可以寫成以下形式ch

rom=

⎡⎣⎢⎢

⎢⎢x1

x2…x

ny1y

2…xn

⎤⎦⎥⎥

⎥⎥fi

tnes

s=[f

1,f2

,…,f

n]t

其中每一行都代表著乙個個體。

我們在這裡假設每個個體的染色體的值各不相同,因此適應度(模型的解)也就各不相同。所以我們就可以從中挑出來最大的適應度,它就是在當前情況下的最優解,但不一定是真正的最大值fm

ax。所以接下來的就是開始尋找真正的最大值(最優解)。

遺傳演算法流程

一次迭代包括以下幾個過程:

染色體變異。即改變某個染色體的值;

染色體交叉。任意選擇兩個染色體交換部分基因;

計算適應度。計算每個染色體在當前迭代下對應的適應度。

優勝劣汰。選出最劣適應度的染色體,並將其用最優適應度染色體替換。

染色體變異

染色體變異作用於每乙個個體,目的就是修改當前染色體,從而讓其變得「更好」,也有可能變得「更壞」。

為了能夠讓已經就很優的個體不要貿然的跌下神壇,讓不算特別好的個體突破階級限制進入最優,我們可以做出以下規定:

這樣子就能夠令整個種群的階級隨時保持流動。

假設某個個體的染色體的某個節點

x 要發生變異,我們現在必須已知:當前迭代下種群中的最優適應度fb

est;當前個體的適應度

f 。

然後我們產生乙個隨機數ra

nd,就是這個節點的變化值,所以通過公式xn

ew=x

[1±r

and(

1−ff

best

)2]

可以得到新的染色體節點值xn

ew.其中,正負號隨機決定,代表著當前染色體節點值應該變大還是變小。

這個式子代表著,當

f 越趨近於fb

est時,

(1−f

fbes

t)2 就趨近於0,說明對原

x 的改變越小(變化量幾乎為0);當f遠離

fbes

t 時,(1

−ffb

est)

2 越趨近於1,說明對原

x 的改變越大。

染色體交叉

染色體交叉比較容易,隨機選擇兩個染色體,在隨機選擇一對節點,相互交換對應的值即可。

比如有兩個個體的染色體為ch

romm

=[xm

,ym]

,chr

omn=

[xn,

yn],我們選擇將其第乙個節點上的兩個節點進行交叉互換,得到新的兩個染色體值為ch

romm

=[xn

,ym]

,chr

omn=

[xm,

yn] 。

計算適應度

計算適應度其實就是將每個個體的染色體帶入到模型中進行計算,計算出來其對應的適應度。

優勝劣汰

為了讓我們種群的適應度整體水平上公升,我們必須殺死排名最後的那個個體。

殺死之後種群數量就變少了,所以就必須要讓比較優良的個體多生點來把種群數量補回來。在這裡我為了方便,直接把最劣的個體的染色體替換成了最優個體的染色體。

這樣子就是優勝劣汰,略微的把整體適應度水平提公升了一點。

以上就是遺傳演算法的大概流程。因為遺傳演算法的實現方法較多,所以這是按照我個人習慣整合成的乙個遺傳演算法。一般來說,遺傳演算法的染色體還可以由二進位制表示,優勝劣汰的方法也有其他方法,在這裡我們就不多贅述。

下一章將會引入matlab**,引入實際模型來進行乙個具體的計算。

遺傳演算法及matlab簡單實現

遺傳演算法的實現 遺傳演算法的一次迭代稱為一代,每一代都有一組解。新的一組解不但可以有選擇的保留一些適度值高的舊的解,而且可以包括一些由其它解結合得到的新解。最初的一組解 初始群體 是隨機生成的,之後的每組解由遺傳操作生成。每個解都通過乙個與目標函式相關的適應度函式給予評價,通過遺傳過程不斷重複,達...

遺傳演算法介紹

遺傳演算法介紹 2 基於遺傳演算法的人工神經網路的應用 基於遺傳演算法的人工神經網路的應用的基本原理是用遺傳演算法 ga 對神經網路的連線權值進行優化學習,利用ga的尋優能力來獲取最佳權值。由於遺傳演算法具有魯棒性強 隨機性 全域性性以及適於並行處理的優點,所以被廣泛應用於神經網路中,其中有許多成功...

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 行 種群大小,列 染色...