通俗解釋遺傳算法及其Matlab實現

  早上再看一個APP推薦的文章,發現的。html

(1)初識遺傳算法算法

        遺傳算法,模擬達爾文進化論的天然選擇和遺傳學機理的生物進化過程的計算模型,一種選擇不斷選擇優良個體的算法。談到遺傳,想一想天然界動物遺傳是怎麼來的,天然主要過程包括染色體的選擇,交叉,變異(不明白這個的能夠去看看生物學),這些操做後,保證了之後的個體基本上是最優的,那麼之後再繼續這樣下去就能夠一直最優了。函數

(2)解決的問題工具

        先說說本身要解決的問題吧。遺傳算法頗有名,天然能解決的問題不少了,在原理上不變的狀況下,只要改變模型的應用環境和形式,基本上均可以。可是遺傳算法主要仍是解決優化類問題,尤爲是那種不能直接解出來的很複雜的問題,而實際狀況一般也是這樣的。優化

本部分主要爲了瞭解遺傳算法的應用,選擇一個複雜的二維函數來進行遺傳算法優化。函數顯示爲y=10*sin(5*x)+7*abs(x-5)+10,這個函數圖像爲:編碼

  怎麼樣,仍是有點複雜的吧,固然你還能夠任意假設和編寫,只要符合就能夠。那麼如今問你要你一下求出最大值你能求出來嗎?(這個貌似能夠,很容易看出來---如何再複雜一點估計就不行了)這類問題若是用遺傳算法或者其餘優化方法就很簡單了,爲何了,說白了,其實就是計算機太笨,同時計算速度又超快,舉個例子吧,我把x等分爲100萬份,再一會兒都帶值進去算,求出對應的100萬個y的值,再比較他們的大小找到最大值不久能夠了麼,很笨吧,人算是不可能的,可是計算機能夠。而遺傳算法也是很笨的一個個搜索,只不過加了一點什麼了,就是人爲的給它算的方向與策略,讓它有目的的算,這也就是算法了。扯多了,正題吧。。。spa

(3)如何開始設計

        不明白的遺傳算法的會問怎麼開始呢?恩,其實每一個算法都有本身開始的方式,遺傳算法也是。首先是選擇個體了。咱們知道一個種羣中可能只有一我的嗎?不可能吧,確定不少人才對,這樣相互結合的機會纔多,產生的後代纔會多種多樣,纔會有更好的優良基因,有利於種羣的發展。那麼算法也是如此,固然個體多少是個問題,通常來講20-100之間我感受差很少了。那麼個體到底是什麼了?在咱們這個問題中,天然就是x值了,其餘狀況下,個體就是所求問題的變量,這裏咱們假設個體數選100個,也就是開始選了100個不一樣的x值,不明白的話就假設是100個猴子吧。好了如今有了100個猴子組成的一個種羣,那麼這個種羣該怎麼發展才能愈來愈好了?說到這,咱們想一想,如何去定義這個愈來愈好呢?這該有個評價指標吧,在咱們這個題中,好像是對於的y值越大越好是吧,也就是說哪些x對應的y值越大,咱們就認爲這個x越好,對於不一樣的x值,在把他們的y值肯定後,咱們甚至能夠給他們排個名來決定哪些好些。咱們把這個叫作對於個體的適應度,這應該算是算法的後半部分纔對。htm

(4)編碼內存

         首先明白什麼是編碼?爲何要編碼?如何編碼?

        好,什麼是編碼?其實編碼就是把自變量(x)換一個形式而已,在這個形式下,更容易操做其餘過程(好比交叉、變異什麼的)而已。舉個例子吧,假如咱們取x=1,2,3,我能夠把x編碼成x=a,b,c,我就說123對應的就是abc,爲何要這樣作呢,好比問題裏面你可以獲取的都是abc組合之類的,那麼這樣編碼之後,你就能夠再返回去成123來操做了。通常的編碼都有些什麼了?二進制編碼,天然數編碼,矩陣編碼。。不少,不詳寫了。而用的最多的能夠說是二進制編碼吧,感受這和人體DNA、基因的排列很類似,想一想DNA怎麼排的?不就是在兩條長鏈上一對一排的嗎?那麼什麼是二進制編碼?很簡單,就是一、0、一、0對應的來回組合排列而已。好比:1100100010,   0011001001  等等,這些都是位數長度爲10的二進制編碼。再想一想1在計算機的二進制形式是多少?若是以八位來表示的話,是否是就是:0000 0001 ;8是否是就是0000 1000;以此類推,那麼咱們這裏也是這樣,把對應的x值換算成這種編碼形式,咱們這裏能夠看到x的範圍是0~5吧,如何照計算機這樣的方式,是否是到0000 0101 這裏就完事了?想一想這樣多短,前面五位都沒有用上多浪費呀,那麼要想都用上怎麼辦了?也很簡單,咱們把0000 0001 不認爲是1不就能夠了嗎?由於1111 1111 爲255,那麼若是說每一份爲1/255的話,那麼0000 0001不就是1/255(不是1了,比1小不少了),這個時候1怎樣表示了?不就是:1111 1111了。好了咱們把範圍擴大一些吧,每一份不是1/255, 而是1/255*5,那麼這個時候最大值是多少?是否是5,恩,這樣x編碼的範圍不就在0~5之間了嗎。這裏就又有問題了,想一想這樣的話x最小精度爲多少?就是1/255*5,雖然很小,可是在0~1/255*5之間的x你能不能取到?不管如何都不能吧,那麼就又來了一個問題,怎樣去增大這個精度呢?若是要保持0~5不變的話,只能增長位數了,把8位編碼變成10位,20位,100位,哇,夠大了吧,變成了100個0、1組合,很恐怖吧,事實上到底是多少要視狀況來定,通常20左右感受就能夠了,雖說越大越好,可是太大了耗內存呀,速度慢了,不值。本題中,咱們設置它爲一個變量,先暫時取爲10來實驗。好了,若是還不明白爲何要編碼看下面的吧,知道了交叉與變異,你就知道了。

(5)關於交叉與變異

        先說變異吧,什麼是變異?簡單,基因發生了突變就叫變異。有了編碼的概念,那就在編碼的基礎上來講變異了。首先就講最簡單的變異,單個點的變異。如今以10位長度的編碼來講,好比把x=3編碼一下,隨便假設爲11000 10010吧,好了在變異操做時,假設第5位變異了(說一下變異就是對應一位或者多位0或1變成1或0,也只能在0,1之間變,沒辦法呀),那麼這個時候變成什麼了?是否是爲11001 10010(把前面的認爲低位,和計算機裏面的不同了,本身定義而已吧),好了如今看看如今11001 10010 再反編碼回去成x是多少呢?那確定不是3了,變了呀,是多少確定能夠反算回去了,這裏懶得算了,就假設爲3.213吧,發沒發現,這樣一來,x是否是變了?既然變了就好呀,帶到原函數(適應度函數)裏面去比較這兩個x值對應的那個y值大一些,如何後面變異後的大些是否是就是說產生了好的變異呀,就能夠在下一次個體選擇的時候選擇它了。那麼想一想不少x來一塊兒變異會怎麼樣了?確定會生成不少好的解吧,反覆這樣作又會怎麼樣了?只要每次都保留最優解的話,我來循環個100萬次,也總能找到最優解吧,固然這麼屢次得花多久,也不合適。這還只是一個點位在進行變異,若是每次我讓多個點位變異呢?哇,又難以想象了,變化更大了吧。固然,變異不止如此,更多的去看專業論文吧,知道了變異是幹什麼的,剩下的都好說了吧。好了,這還只是變異,想一想天然界遺傳中除了變異還有什麼,交叉吧,那麼交叉又是什麼了?

  學過生物的都知道,動物交配時,部分染色體幹什麼了,是否是交叉了?就是把相應部分的基因交換了,你的給了我,個人給了你,頗有愛吧。再以編碼爲例吧,好比如今隨便從100個x值中選取兩個吧,假設正好選中了x=3和4,對應的編碼假設是:11001 10101和00101 01011,那麼怎麼交叉呢?咱們知道每次交叉的染色體一般是否是一塊一塊的?恩,這裏在算法設計上也來一塊一塊的吧,好比說就把位置在2,3,4號的編碼給總體交叉了吧,那麼x=3對應位置是100吧,x=4對應位置是010吧,好,交換之後x=3對應位置就變成了010,而x=4就變成了100,加回去就變成了什麼了?X=3是否是就爲10101 10101,x=4是否是就爲01001 01011了。而如今,把他們再反編碼回去仍是x=3,4嗎?顯然又不是了吧(固然也有機率是同樣的吧,很小)。那是什麼了?不想算,仍是假設吧,假設爲3.234,和4.358把,好了新的個體是否是又來了?恩,同理,帶到適應度函數裏面去吧,在取優秀個體,完事。一樣,有些專門研究這種算法的開發出來各類各樣的交叉方式,什麼一個個體的前3個與後一個個體的後3個交叉,中間幾位來交叉等等,總之就是生產新個體,而這樣作的目的在哪了?無非是三個字,隨機性,充分保證生產新個體具備隨機性,你說你的x=3變異後爲3.2,3.1什麼的距離3那麼近,在一些存在局部最優解問題上就永遠跳不出局部最優解,相反,你的x=1一會兒變異成了x=5,哇,好大的變化呀,一下從這頭到了那頭,這對於算法的廣闊搜索能力來講是很是好的。

  講完了這部分,如今知道了爲何要編碼了吧?若是你不編碼,你說你想要你的x=3怎麼去變異,怎麼去交叉?固然也不是沒有方法,好比你生成一個小的隨機數加到x=3上,可是你想一想這兩種方法哪個更具備隨機性、廣泛性?顯然的。而更多的時候交叉與變異是在一塊兒操做的,先交叉,再變異(或者反過來)是廣泛遺傳算法的操做步驟。

(6)關於選擇的問題

        說完了上面的部分,在說說選擇吧,選擇是什麼?就是優勝劣汰。好的留下來,差的走人,在天然界中直接gg了是吧。因此纔有了人類這種高級動物。不停的選擇使得種羣一直朝着較好的方向行走。

        對應到本問題來講,遺傳算法的選擇是什麼樣子的呢?在前面說到,每次交叉或者變異是否是產生了新的個體?若是這些個體都保留下來的話,種羣是要爆炸的,第一次循環可能有100個x,第二次就200個,再來那麼10萬次循環,哇哦,多少了,好多。顯然不可能吧,並且在算法裏面,咱們還規定的是每次循環都必須保證都是100個個體,那麼必須在200個個體中剔除100個吧,好了,問題來了,如何剔除呢?有人說很簡單,排名吧,取前100號x不久能夠了嗎?排名這個東西真的準嗎?我就不信,憑什麼差一點的不能選上,搞很差在下一次變異中一會兒衝到了第一呢?這個問題在選擇上也有一些對應的規則,最通用的就是輪盤賭法,簡單來講就是一種機率選擇法(固然還有許多其餘的方法,感興趣本身搜相關的文獻吧,我也沒用過)。什麼是輪盤賭法呢?就是把對應全部y值(適應度函數值)加起來,再用各自的y值去除以這個sum值,這樣是否是誰的機率大誰的機率小就很清楚了?而後再隨機生成一個0~1的機率值p,誰在p的範圍裏面是否是就選擇誰,好比說x=3時在100個x中y的值最大,那麼選擇它的機率是否是就最大,好比說是0.1(0.1小嗎?不小了好吧,想一想其餘的會是什麼,都比0.1小,那麼從機率上講,選100次的話,是否是就有10次選到了x=3,其餘的都不足10次是吧,那麼在下一次100個種羣個體中就有10個x=3了,再來一回可能就有20個x=3了,再就是30個,最最後就只剩下100個x=3,它本身在那裏交叉變異是否是已經沒什麼意義了,若是到了這個時候就意味着這個算法能夠結束了)。再詳細點,以下圖所示吧:如今要在下面三個大類中先去100個x個體,輪盤賭轉100次之後,是否是個體數落在s3中的個體多一些,選擇的原理就是這樣,再不明白直接後面的程序吧,我曾經也研究了很久。。。

(7)還差點什麼呢

        至此,感受也差很少了吧,選擇完後再重複上述步驟交叉、變異等等。那麼何時是個頭了?很簡單辦法就是迭代次數,迭代10次看一下結果,20次,30次,100次,當次數達到必定程度之後,優秀的個體愈來愈多,大都集中在最優解附近,即便變異或者交叉了也是在這個最優解附近,沒有影響的,在下一次選擇後就有變回來了。那麼至此就真的結束了。好比說先來結果吧,該問題按我這個思路作完後,迭代100次變成什麼樣子了?上圖以下:

         看看,全部的解(100個)都集中在了x=0.286附近是吧,也就是基本上達到最優解了。

  代碼:http://www.lai18.com/content/1836211.html  其實有GA工具箱。

相關文章
相關標籤/搜索