機器學習(MACHINE LEARNING)MATLAB遺傳算法

1 概述

遺傳算法(Genetic Algorithm, GA)是模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,是一種通過模擬自然進化過程搜索最優解(所找到的解是全局最優解)的方法。

參數編碼、初始羣體的設定、適應度函數的設計、遺傳操作設計、控制參數設定五個要素組成了遺傳算法的核心內容。

2 步驟

2.1 種羣初始化

(1)二進制編碼

二進制編碼的字符串長度與問題所求解的精度有關。需要保證所求解空間內的每一個個體都可以被編碼。

優點:編、解碼操作簡單,遺傳、交叉便於實現

缺點:長度大

(2)其他編碼方法

格雷碼、浮點數編碼、符號編碼、多參數編碼等
我們需要首先通過隨機生成的方式來創造一個種羣,一般該種羣的數量爲100~500,這裏我們採用二進制將一個染色體(解)編碼爲基因型。隨後用進制轉化,將二進制的基因型轉化成十進制的表現型。

2.2 適應度計算(種羣評估)

這裏我們直接將目標函數值作爲個體的適應度。
適應度函數要有效反映每一個染色體與問題的最優解染色體之間的差距。

2.3 篩選

根據種羣中個體的適應度大小,通過輪盤賭等方式將適應度高的個體從當前種羣中選擇出來。其中輪盤賭即是與適應度成正比的概率來確定各個個體遺傳到下一代羣體中的數量。
具體步驟如下:

 (1)首先計算出所有個體的適應度總和Σfi。

 (2)其次計算出每個個體的相對適應度大小fi/Σfi,類似於softmax。

 (3)再產生一個0到1之間的隨機數,依據隨機數出現在上述哪個概率區域內來確定各個個體被選中的次數。

2.4 交叉(交配)運算

步驟是遺傳算法中產生新的個體的主要操作過程,它用一定的交配概率閾值(pc,一般是0.4到0.99)來控制是否採取單點交叉,多點交叉等方式生成新的交叉個體。

 具體步驟如下:

 (1)先對羣體隨機配對。

 (2)再隨機設定交叉點的位置。

 (3)再互換配對染色體間的部分基因。 

2.5 突變

該步驟是產生新的個體的另一種操作。一般先隨機產生變異點,再根據變異概率閾值(pm,一般是0.0001到0.1)將變異點的原有基因取反。
避免收斂於一個局部最小值。

2.6 終止判斷

如果滿足條件(迭代次數,一般是200~500)則終止算法,否則返回step2。
我們首先從函數出發,既然是尋找全局最優解,我們可以想象一個多元函數的圖像。遺傳算法中每一條染色體,對應着遺傳算法的一個解決方案,一般我們用適應性函數(fitness function)來衡量這個解決方案的優劣。所以從一個基因組到其解的適應度形成一個映射。可以把遺傳算法的過程看作是一個在多元函數裏面求最優解的過程。可以這樣想象,這個多維曲面裏面有數不清的“山峯”,而這些山峯所對應的就是局部最優解。而其中也會有一個“山峯”的海拔最高的,那麼這個就是全局最優解。而遺傳算法的任務就是儘量爬到最高峯,而不是陷落在一些小山峯。(另外,值得注意的是遺傳算法不一定要找“最高的山峯”,如果問題的適應度評價越小越好的話,那麼全局最優解就是函數的最小值,對應的,遺傳算法所要找的就是“最深的谷底”)
在這裏插入圖片描述
我們從一元函數出發,已知這樣一個函數:
在這裏插入圖片描述

3 代碼

在matlab下繪製該函數圖像 我們可以發現

x=-1:0.01:2;
y=-x.*sin(10*pi*x)+2;
plot(x,y)

在這裏插入圖片描述
我們嘗試尋找這個函數在定義域內的最高點和最低點,可以嘗試下列幾種方法:

既然我們把函數曲線理解成一個一個山峯和山谷組成的山脈。那麼我們可以設想所得到的每一個解就是一隻袋鼠,我們希望它們不斷的向着更高處跳去,直到跳到最高的山峯。所以求最大值的過程就轉化成一個“袋鼠跳”的過程。

下面介紹介紹“袋鼠跳”的幾種方式。

爬山算法:一隻袋鼠朝着比現在高的地方跳去。它找到了不遠處的最高的山峯。但是這座山不一定是最高峯。這就是爬山算法,它不能保證局部最優值就是全局最優值。

模擬退火:袋鼠喝醉了。它隨機地跳了很長時間。這期間,它可能走向高處,也可能踏入平地。但是,它漸漸清醒了並朝最高峯跳去。這就是模擬退火算法。

遺傳算法:有很多袋鼠,它們降落到喜瑪拉雅山脈的任意地方。這些袋鼠並不知道它們的任務是尋找珠穆朗瑪峯。但每過幾年,就在一些海拔高度較低的地方射殺一些袋鼠。於是,不斷有袋鼠死於海拔較低的地方,而越是在海拔高的袋鼠越是能活得更久,也越有機會生兒育女。就這樣經過許多年,這些袋鼠們竟然都不自覺地聚攏到了一個個的山峯上,可是在所有的袋鼠中,只有聚攏到珠穆朗瑪峯的袋鼠被帶回了美麗的澳洲。

而這裏我們使用的就是遺傳算法來解決這個問題,首先我們使用matlab中的ga()函數來直接尋找到答案。

關於ga函數就是將上面的算法思想進行封裝成的一個函數

function y = simple_fitness(x)
 
y = x*sin(10*pi*x)+2
 
end

在這裏插入圖片描述

ObjectiveFunction = @simple_fitness;
nvars = 1;%變量個數
LB = [-1]%定義域下限
UB = [2]%定義域上限
 
[x,fval] = ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB)%調用ga函數

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章