MATLAB(1)基於遺傳算法解決最優化問題及相應的MATLAB遺傳工具箱使用

MATLAB(1)基於遺傳算法解決最優化問題及相應的MATLAB遺傳工具箱使用


     摘要:本文將簡明扼要的介紹一下遺傳算法,並以一個簡單的二元一次方程組求解爲例,演示用MATLAB工具箱快捷地實現遺傳算法。

     對於取最小值的最優化問題,遺傳算法借鑑生物遺傳現象使具有一定數量的候選解的種羣向更好的解進化,該方法是通過種羣進化,使得適應度函數代入估計參數後達到最值來得到最優解。借鑑生物種羣的進化,遺傳算法先隨機產生一組初始解,作爲初始種羣,以數值解爲例,這些解都是通過二進制代碼存儲在計算機中,類似於染色體,於是可以進行生物上的交叉、變異、遺傳等。通過對第一代個體選擇,保留一些個體並讓上一代解“組合”、“變異”、“遺傳”,由此產生下一代的解。而每一代中都有個體被淘汰,淘汰的指標就是適應度函數。生物法則“適者生存”,通過目標來建立適應度函數,在每一代中挑選適應度函數值大的個體留下來,對比目標的容許誤差,達到目標容許誤差,或達到預先設定的遺傳代數,則停止計算,返回最優解。
      遺傳算法的一個很大的特點就是能跳出極值。對於一些多峯的問題,一些算法極其容易陷入局部最優解而得不到全局最優解。而歸功於遺傳算法中的變異交叉步驟,遺傳算法在每一代中都能不受上一代最優解控制的產生新解,由此爲跳出局部最優解提供了途徑。
     此外,還有一點想要說明的是,筆者在閱讀一些相關資料時,發現準則是適應度函數是取最大值,而實際應用中是讓適應度函數取最小值,至少在MATLAB中是這樣的。我個人還是比較認可第一種的,因爲“適者生存”嘛,自然是適應度高的解應當生存下來。對於第二種,我猜想可能是在實際應用中,爲了方便,不區分適應度函數和目標函數,二者混用,確實表達的是一個意思。所幸,這一點在運用時並不會產生什麼麻煩。
     起初接觸遺傳算法時,想到要自己設置種羣規模,規定交叉變異遺傳方式等等就頗爲頭疼,幸好後面發現MATLAB有自帶的遺傳工具箱,下面我就舉個簡單的例子來演示一下如何使用MATLAB的遺傳工具箱。
     對於求解方程組:{x-y-3=0;  3x-8y-14=0}
     爲近似求解上述方程組,令 f1=x-y-3; f2=3x-8y-14; f=f1^2+f2^2; 則問題轉換爲求解使得f取最小值的x,y變量值,f即可當做適應度函數。使用MATLAB2015a的遺傳工具箱實現求解。
     首先根據對問題的轉換,編寫m文件如下:
    
   然後在命令窗口輸入:  >>optimtool('ga')   通過此命令來打開遺傳工具箱,初始界面如下:
 
  可以看到工具箱主要分爲兩欄,左邊主要是求解的函數的基本信息,右邊是對遺傳算法中參數的設置。在此例中,我們在Fitness function中輸入句柄函數格式@ga1,又因爲此例中變量的數目爲2(x,y),所以在 number of variables中輸入2,而對於下面的Constrains(約束), 由於在此例中變量的取值範圍爲整個實數域,因而沒有約束條件,該部分保持空白即可。

     對於右邊對遺傳算法參數的設置,我一般都只是更改Population size(種羣的規模), Generations(遺傳算法運行的總代數,可以理解爲遺傳到多少代時停止),Stall generations(停滯的代數,可以理解爲當連續遺傳多少代後適應度函數的加權平均值變化小於Function tolerance時停止計算),Function tolerance(適應度函數值偏差),其他的我基本都是用默認設置,不做更改。當然,有時,也會根據實驗對其他參數進行調試,如對精英數量,交叉比例等。在此例中,我們設置Population size 爲100,Generations和Stall generations均爲200,Function tolerance爲1e-100. 同時在Plot functions中勾選best fitness 和best individual如下:

       然後點擊偏左下方的Start按鈕,運行,最後的結果將顯示在左下方的final point中。一次運行的結果如下:



      由於此題的方程組非常簡單,筆算可得解爲x=2,y=-1, 對比遺傳算法的結果可以知道解是非常逼近真實值的,而且智能算法的時間複雜度低,運行效率高。當然在使用遺傳算法時,由於算法對初始種羣的選取是隨機的,因而每次計算結果可能不同,讀者必須運行多次,分析結果,將離羣點排除後取均值是個不錯的選擇。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章