天天看點

遺傳算法的matlab實作

遺傳算法的matlab實作

遺傳算法是仿照達爾文生物進化的原理來實作的智能搜尋技術。主要原理如下:對于一個種群,這個種群中有一定數量的個體,而每個個體對這個種群所在的環境的适應性各不相同,适應性強的個體便能有更強的存活幾率,那麼随着種群一代一代的進化,适應性強的個體的基因在後代種群中所占的比例就會越來越大,隻要環境基本保持不變,整個種群對于環境的适應性變回越來越強。

根據這個原理所發明的智能搜尋技術其實可以描述為這樣一個場景:假如我們有一個函數:

f(x,y,z) = x^+*sin(x*y*z)+y^-z^
           

要找到這個函數在

  1. x~(-10,10)
  2. y~(-10,10)
  3. z~(-10,10)

的範圍内這個函數的最小值或者最大值所對應的點,我們使用遺傳算法來求解這個最大值或者最小值,那麼思路就是,首先,我們構造一個種群,假設這個種群中有兩百個個體,每個個體為在坐标範圍x(-10,10)y(-10,10),z(-10,10)内部的一個點,而我們的目的就是尋找到函數的最大值或者最小值,是以每個個體對于環境的适應性可以表述為由每個個體所對應于給定空間中的點的坐标(x0,y0,z0),代入函數f(x,y,z) = x^2-3*sin(x*y*z)+y^2-z^2後所求解得到的函數值,假設我們需要求解最大值,那麼如果一個個體所求解出的函數值越大,我們就認為這個個體越符合我們的要求,那麼這個個體對于環境的适應性就越強。之後,我們再采用仿照生物進化的手段讓種群發生進化,最終得到近似全局最優解。

綜上,我們可以用一個向量[x0,y0,z0]來表示一個個體,那麼一個種群就是個體的集合,也就是一個矩陣,一個有200個個體的種群便是由200個3x1的列向量組成的3x200的矩陣,那麼如何來構造一個種群呢?我們來想象一下草原上的一個牛群,牛群中的牛有的強壯,有的瘦弱,有的是小牛,有的是老牛,這些抽象來說就是牛群中的牛對于這個環境的适應性不同,年輕力壯的牛自然能獲得更多的食物更多的繁衍後代的機會,在遇到天敵是有更多的生存幾率,老弱病殘的牛自然生存的幾率就小的多,是以我們要構造一個這樣的種群,這個種群有年輕力壯的個體,也有老弱病殘的個體,而我們之前構造的個體其實就是空間中的一個坐标點,位于不同空間中的坐标所對應的函數值也不同,是以構造一個種群就是讓這個種群中的個體盡量均勻的分布于這個空間當中,其實就是構造200個列向量,每個列向量都是空間中的随機的一個點,我們可以有matlab中的rands函數來構造,如下:

ans = 
5.0679   -3.7459    3.8999    7.9501  … -6.6495
9.5379   -2.4900   -5.3818   -8.6817  … 4.0117
2.5413   -3.0310    1.1492    3.0234  … -8.7508
           

好了,到目前為止,已經構造好了一個種群了,接下來我們讓這個種群發生變異。

牛群當中的變異主要是由公牛和母牛交配繁殖後代以及後代的基因發生的自然變異,也就是說後代的基因一部分由公牛和母牛的基因組成,另一部分由變異組成。簡化來說就是兩種:1,父代的染色體的交叉2,後代染色體的自我變異。現在來用向量實作上面兩種進化:1,染色體的交叉,由于我們的父代的都是由向量組成的,我們可以把向量當做成染色體,兩個染色體的交叉,其實就對應于兩個父代向量之間交換向量片段。2,後代染色體的自我變異,其實就是後代個體的3x1的列向量中的某一個元素的值随機的發生了變化。到這裡我們已經完成了種群的變異操作,但是一個種群光有變異還不行,假如有一個強壯的牛群,這個牛群中的強壯的牛的數量一定是比一個普通的牛群中強壯的牛的數量要大,也就是說我們要讓我們的種群中的适應性強的個體變得越來越多,那麼我們要做的就是,把種群中适應性差的個體剔除掉,适應性強的個體保留下來,這樣構成的新的種群中适應性強的個體相對來說就比之前的種群要多,然後種群沒變異一次我們就這樣做一次,最終整個種群中的個體的适應性都達到了較高的水準,我們從這些優質個體中選擇出适應性最強的個體,這個個體多代表的空間坐标便就是我們所求的函數的最大值所對應的點了。但是由于進化的過程中引入了随機操作是以每次進化的得到的最終的種群的最優解有一定小幅度的波動。

下面我們看一個具體的執行個體,求解函數

f(x,y,z) = x^2+3*sin(x*y*z)+y^2-z^2

x~(-10,10),y~(-10,10),z~(-10,10)

的範圍内的最大值所對應的點的坐标,按照上面的算法,我們利用matlab求解,得到最優解如下:

遺傳算法的matlab實作

疊代得到的适應度值随着進化代數圖如下

遺傳算法的matlab實作

繼續閱讀