使用MATLAB遺傳算法工具實例()_第1頁
使用MATLAB遺傳算法工具實例()_第2頁
使用MATLAB遺傳算法工具實例()_第3頁
使用MATLAB遺傳算法工具實例()_第4頁
使用MATLAB遺傳算法工具實例()_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

./免費文檔,歡迎下載第八章使用MATLAB遺傳算法工具最新發(fā)布的MATLAB7.0Release14已經包含了一個專門設計的遺傳算法與直接搜索工具箱〔GeneticAlgorithmandDirectSearchToolbox,GADS。使用遺傳算法與直接搜索工具箱,可以擴展MATLAB及其優(yōu)化工具箱在處理優(yōu)化問題方面的能力,可以處理傳統(tǒng)的優(yōu)化技術難以解決的問題,包括那些難以定義或不便于數(shù)學建模的問題,可以解決目標函數(shù)較復雜的問題,比如目標函數(shù)不連續(xù)、或具有高度非線性、隨機性以及目標函數(shù)沒有導數(shù)的情況。本章8.1節(jié)首先介紹這個遺傳算法與直接搜索工具箱,其余各節(jié)分別介紹該工具箱中的遺傳算法工具及其使用方法。8.1遺傳算法與直接搜索工具箱概述本節(jié)介紹MATLAB的GADS〔遺傳算法與直接搜索工具箱的特點、圖形用戶界面及運行要求,解釋如何編寫待優(yōu)化函數(shù)的M文件,且通過舉例加以闡明。工具箱的特點GADS工具箱是一系列函數(shù)的集合,它們擴展了優(yōu)化工具箱和MATLAB數(shù)值計算環(huán)境的性能。遺傳算法與直接搜索工具箱包含了要使用遺傳算法和直接搜索算法來求解優(yōu)化問題的一些例程。這些算法使我們能夠求解那些標準優(yōu)化工具箱范圍之外的各種優(yōu)化問題。所有工具箱函數(shù)都是MATLAB的M文件,這些文件由實現(xiàn)特定優(yōu)化算法的MATLAB語句所寫成。使用語句typefunction_name就可以看到這些函數(shù)的MATLAB代碼。我們也可以通過編寫自己的M文件來實現(xiàn)來擴展遺傳算法和直接搜索工具箱的性能,也可以將該工具箱與MATLAB的其他工具箱或Simulink結合使用,來求解優(yōu)化問題。工具箱函數(shù)可以通過圖形界面或MATLAB命令行來訪問,它們是用MATLAB語言編寫的,對用戶開放,因此可以查看算法、修改源代碼或生成用戶函數(shù)。遺傳算法與直接搜索工具箱可以幫助我們求解那些不易用傳統(tǒng)方法解決的問題,譬如表查找問題等。遺傳算法與直接搜索工具箱有一個精心設計的圖形用戶界面,可以幫助我們直觀、方便、快速地求解最優(yōu)化問題。功能特點遺傳算法與直接搜索工具箱的功能特點如下:圖形用戶界面和命令行函數(shù)可用來快速地描述問題、設置算法選項以及監(jiān)控進程。具有多個選項的遺傳算法工具可用于問題創(chuàng)建、適應度計算、選擇、交叉和變異。直接搜索工具實現(xiàn)了一種模式搜索方法,其選項可用于定義網(wǎng)格尺寸、表決方法和搜索方法。遺傳算法與直接搜索工具箱函數(shù)可與MATLAB的優(yōu)化工具箱或其他的MATLAB程序結合使用。支持自動的M代碼生成。圖形用戶界面和命令行函數(shù)遺傳算法工具函數(shù)可以通過命令行和圖形用戶界面來使用遺傳算法。直接搜索工具函數(shù)也可以通過命令行和圖形用戶界面來進行訪問。圖形用戶界面可用來快速地定義問題、設置算法選項、對優(yōu)化問題進行詳細定義。遺傳算法與直接搜索工具箱還同時提供了用于優(yōu)化管理、性能監(jiān)控及終止準則定義的工具,同時還提供大量標準算法選項。在優(yōu)化運行的過程中,可以通過修改選項來細化最優(yōu)解,更新性能結果。用戶也可以提供自己的算法選項來定制工具箱。使用其他函數(shù)和求解器遺傳算法與直接搜索工具箱與MATLAB及優(yōu)化工具箱是緊密結合在一起的。用戶可以用遺傳算法或直接搜索算法來尋找最佳起始點,然后利用優(yōu)化工具箱或用MATLAB程序來進一步尋找最優(yōu)解。通過結合不同的算法,可以充分地發(fā)揮MATLAB和工具箱的功能以提高求解的質量。對于某些特定問題,使用這種方法還可以得到全局〔最優(yōu)解。顯示、監(jiān)控和輸出結果遺傳算法與直接搜索工具箱還包括一系列繪圖函數(shù)用來可視化優(yōu)化結果。這些可視化功能直觀地顯示了優(yōu)化的過程,并且允許在執(zhí)行過程中進行修改。工具箱還包括一系列繪圖函數(shù)用來可視化優(yōu)化結果。這些可視化功能直觀地顯示了優(yōu)化的過程,并且允許在執(zhí)行過程中進行修改。該工具箱還提供了一些特殊繪圖函數(shù),它們不僅適用于遺傳算法,還適用于直接搜索算法。適用于遺傳算法的函數(shù)包括函數(shù)值、適應度值和函數(shù)估計。適用于直接搜索算法的函數(shù)包括函數(shù)值、分值直方圖、系譜、適應度值、網(wǎng)格尺寸和函數(shù)估計。這些函數(shù)可以將多個繪圖一并顯示,可直觀方便地選取最優(yōu)曲線。另外,用戶也可以添加自己的繪圖函數(shù)。使用輸出函數(shù)可以將結果寫入文件,產生用戶自己的終止準則,也可以寫入用戶自己的圖形界面來運行工具箱求解器。除此之外,還可以將問題的算法選項導出,以便日后再將它們導入到圖形界面中去。所需的產品支持遺傳算法與直接搜索工具箱作為其他優(yōu)化方法的補充,可以用來尋找最佳起始點,然后可以再通過使用傳統(tǒng)的優(yōu)化技術來進一步尋找最優(yōu)解。工具箱需要如下產品支持:<1>MATLAB。<2>優(yōu)化工具箱。相關產品與遺傳算法與直接搜索工具箱相關的產品有:統(tǒng)計工具箱——應用統(tǒng)計算法和概率模式。神經網(wǎng)絡工具箱——設計和仿真神經網(wǎng)絡。模糊邏輯工具箱——設計和仿真基于模糊邏輯的系統(tǒng)。金融工具箱——分析金融數(shù)據(jù)和開發(fā)金融算法。所需的系統(tǒng)及平臺遺傳算法和直接搜索工具箱對于對于運行環(huán)境、支持平臺和系統(tǒng)的需求,可隨時通過訪問網(wǎng)站http://了解最新發(fā)布的信息。這里介紹的MATLAB7.0Release14所需的最低配置是:Windows系列操作系統(tǒng),PentiumIII500CPU、64MBRAM,空閑硬盤空間600MB以上。8.1.2編寫待優(yōu)化函數(shù)的M文件為了使用遺傳算法和直接搜索工具箱,首先必須編寫一個M文件,來確定想要優(yōu)化的函數(shù)。這個M文件應該接受一個行向量,并且返回一個標量。行向量的長度就是目標函數(shù)中獨立變量的個數(shù)。本節(jié)將通過實例解釋如何編寫這種M文件。編寫M文件舉例下面的例子展示了如何為一個想要優(yōu)化的函數(shù)編寫M文件。假定我們想要計算下面函數(shù)的最小值:M文件確定這個函數(shù)必須接受一個長度為2的行向量X,分別與變量x1和x2相對應,并且返回一個標量X,其值等于該函數(shù)的值。為了編寫這個M文件,執(zhí)行如下步驟:在MATLAB的File菜單中選擇New菜單項。選擇M-File,將在編輯器中打開一個新的M文件。在該M文件中,輸入下面兩行代碼:functionz=my_fun<x>z=x<1>^2-2*x<1>*x<2>+6*x<1>+x<2>^2-6*x<2>;在MATLAB路徑指定的目錄中保存該M文件。為了查看該M文件是否返回正確的值,可鍵入my_fun<[23]>ans=-5注意:在運行遺傳算法工具或模式搜索工具時,不要使用編輯器或調試器來調試目標函數(shù)的M文件,否則會導致在命令窗口出現(xiàn)Java異常消息,并且使調試更加困難。最大化與最小化遺傳算法和直接搜索工具箱中的優(yōu)化函數(shù)總是使目標函數(shù)或適應度函數(shù)最小化。也就是說,它們求解如下形式的問題:如果我們想要求出函數(shù)f<x>的最大值,可以轉而求取函數(shù)g<x>=-f<x>的最小值,因為函數(shù)g<x>最小值出現(xiàn)的地方與函數(shù)f<x>最大值出現(xiàn)的地方相同。例如,假定想要求前面所描述的函數(shù)的最大值,這時,我們應當編寫一個M文件來計算,求函數(shù)的最小值。自動代碼生成遺傳算法與直接搜索工具箱提供了自動代碼生成特性,可以自動生成求解優(yōu)化問題所需要的M文件。例如,圖8.1所示的就是使用遺傳算法工具的自動代碼生成特性所產生的M文件。另外,圖形用戶界面所輸出的優(yōu)化結果可以作為對來自命令行調用代碼的一種解釋,這些代碼還用于使例程和保護工作自動化。圖8.1遺傳算法M文件代碼的自動生成8.2使用遺傳算法工具初步遺傳算法與直接搜索工具箱包含遺傳算法工具和直接搜索工具。從本節(jié)至章末,將主要介紹其中的遺傳算法工具及其使用方法。本節(jié)主要介紹遺傳算法工具使用的初步知識,內容包括:遺傳算法使用規(guī)則,遺傳算法工具的使用方式,舉例說明如何使用遺傳算法來求解一個優(yōu)化問題,解釋遺傳算法的一些基本術語,最后闡述遺傳算法的工作原理與工作過程。遺傳算法使用規(guī)則遺傳算法是一種基于自然選擇、生物進化過程來求解問題的方法。遺傳算法反復修改對于個體解決方案的種群。在每一步,遺傳算法隨機地從當前種群中選擇若干個體作為父輩,并且使用它們產生下一代的子種群。在連續(xù)若干代之后,種群朝著優(yōu)化解的方向進化。我們可以用遺傳算法來求解各種不適宜于用標準優(yōu)化算法求解的優(yōu)化問題,包括目標函數(shù)不連續(xù)、不可微、隨機或高度非線性的問題。遺傳算法在每一步使用下列三類規(guī)則從當前種群來創(chuàng)建下一代:選擇規(guī)則〔Selectionrules,選擇對下一代種群有貢獻的個體,稱為父輩。交叉規(guī)則〔Crossoverrules,將兩個父輩結合起來構成下一代的子輩種群。變異規(guī)則〔Mutationrules,施加隨機變化給父輩個體來構成子輩。遺傳算法與標準優(yōu)化算法主要在兩個方面有所不同,它們的比較情況歸納于表8.1中。表8.1遺傳算法與標準優(yōu)化算法比較標準算法遺傳算法每次迭代產生一個單點,點的序列逼近一個優(yōu)化解每次迭代產生一個種群,種群逼近一個優(yōu)化解通過確定性的計算在該序列中選擇下一個點通過隨機進化選擇計算來選擇下一代種群遺傳算法使用方式遺傳算法工具有兩種使用方式:以命令行方式調用遺傳算法函數(shù)ga。使用遺傳算法工具,從圖形用戶界面到遺傳算法。本節(jié)對這些方式做一個簡要的介紹。在命令行調用函數(shù)ga對于在命令行使用遺傳算法,可以用下列語法調用遺傳算法函數(shù)ga:[xfval]=ga<@fitnessfun,nvars,options>其中:@fitnessfun是適應度函數(shù)句柄;nvars是適應度函數(shù)的獨立變量的個數(shù);options是一個包含遺傳算法選項參數(shù)的結構。如果不傳遞選項參數(shù),則ga使用它本身的缺省選項值。函數(shù)所給出的結果:fval——適應度函數(shù)的最終值;x——最終值到達的點。我們可以十分方便地把遺傳算法工具輸出的結果直接返回到MATLAB的workspace〔工作空間,或以不同的選項從M文件多次調用函數(shù)ga來運行遺傳算法。調用函數(shù)ga時,需要提供一個選項結構options。后面的有關章節(jié)對于在命令行使用函數(shù)ga和創(chuàng)建選項結構options提供了詳細的描述。通過GUI使用遺傳算法遺傳算法工具有一個圖形用戶界面GUI,它使我們可以使用遺傳算法而不用工作在命令行方式。為了打開遺傳算法工具,可鍵入gatool打開的遺傳算法工具圖形用戶界面如圖8.2所示。輸入適應度函數(shù)輸入適應度函數(shù)輸入適應度函數(shù)輸入適應度函數(shù)的變量數(shù)目開始遺傳算法顯示結果顯示參數(shù)描述圖8.2遺傳算法工具為了使用遺傳算法工具,首先必須輸入下列信息:Fitnessfunction〔適應度函數(shù)——欲求最小值的目標函數(shù)。輸入適應度函數(shù)的形式為@fitnessfun,其中fitnessfun.m是計算適應度函數(shù)的M文件。在前面"編寫待優(yōu)化函數(shù)的M文件"一節(jié)里已經解釋了如何編寫這種M文件。符號@產生一個對于函數(shù)fitnessfun的函數(shù)句柄。Numberofvariables〔變量個數(shù)——適應度函數(shù)輸入向量的長度。對于"編寫待優(yōu)化函數(shù)的M文件"一節(jié)所描述的函數(shù)My_fun,這個參數(shù)是2。點擊Start按鈕,運行遺傳算法,將在StatusandResults〔狀態(tài)與結果窗格中顯示出相應的運行結果。在Options窗格中可以改變遺傳算法的選項。為了查看窗格中所列出的各類選項,可單擊與之相連的符號"+"。8.2.3舉例:Rastrigin函數(shù)本節(jié)介紹一個例子,講述如何尋找Rastrigin函數(shù)的最小值和顯示繪制的圖形。Rastrigin函數(shù)是最常用來測試遺傳算法的一個典型函數(shù)。Rastrigin函數(shù)的可視化圖形顯示,它具有多個局部最小值和一個全局最小值,遺傳算法可以幫助我們確定這種具有多個局部最小值函數(shù)的最優(yōu)解。Rastrigin函數(shù)具有兩個獨立變量的Rastrigin函數(shù)定義為Rastrigin函數(shù)的圖形如圖8.3所示。工具箱包含一個M文件,即rastriginsfcn.m,是用來計算Rastrigin函數(shù)值的。全局最小點[0,0]全局最小點[0,0]圖8.3Rastrigin函數(shù)圖形如圖8.3所示,Rastrigin函數(shù)有許多局部最小值——在圖上顯示為"谷底〔valleys"。然而,該函數(shù)只有一個全局最小值,出現(xiàn)在x-y平面上的點[0,0]處,正如圖中豎直線指示的那樣,函數(shù)的值在那里是0。在任何不同于[0,0]的局部最小點處,Rastrigin函數(shù)的值均大于0。局部最小處距原點越遠,該點處Rastrigin函數(shù)的值越大。Rastrigin函數(shù)之所以最常用來測試遺傳算法,是因為它有許多局部最小點,使得用標準的、基于梯度的查找全局最小的方法十分困難。圖8.4所示是Rastrigin函數(shù)的輪廓線,它顯示出最大最小交替變化的情形。全局最小點[0,0]局部最小點全局最小點[0,0]局部最小點局部最小點圖8.4Rastrigin函數(shù)的輪廓線尋找Rastrigin函數(shù)的最小值本節(jié)解釋如何使用遺傳算法來尋找Rastrigin函數(shù)的最小值。注意:因為遺傳算法使用隨機數(shù)據(jù)來進行它的搜索,所以該算法每一次運行時所返回的結果會稍微有些不同。為了查找最小值,進行下列步驟:在命令行鍵入gatool,打開遺傳算法工具。在遺傳算法工具的相應欄目,輸入適應度函數(shù)和變量個數(shù)。在"Fitnessfunction〔適應度函數(shù)"文本框中,輸入@rastriginsfcn;在"Numberofvariables〔變量個數(shù)"文本框中,輸入2,這就是Rastrigin函數(shù)獨立變量的個數(shù)。這一步操作如圖8.5所示。圖8.5輸入適應度函數(shù)與變量個數(shù)在"Runsolver〔運行求解器"窗格中,單擊Start按鈕,如圖8.6所示。圖8.6單擊運行求解器Start按鈕在算法運行的同時,"Currentgeneration〔當前代數(shù)"文本框中顯示出當前的代數(shù)。通過點擊"暫?!睵ause"按鈕,可以使算法臨時暫停一下。當這樣做的時候,該按鈕的名字變?yōu)?Resume〔恢復"。為了從暫停處恢復算法的運行,可單擊這個"Resume"按鈕。當算法完成時,"Statusandresults"窗格出現(xiàn)如圖8.7所示的情形。最終點的適應度函數(shù)值最終點最終點的適應度函數(shù)值最終點圖8.7狀態(tài)與結果顯示"Statusandresults"窗格顯示下列信息:算法終止時適應度函數(shù)的最終值:Fitnessfunctionvalue:0.0067749206244585025注意:所顯示的值非常接近于Rastrigin函數(shù)的實際最小值0。"遺傳算法舉例"一節(jié)描述了一些方法,可以用來得到更接近實際最小值的結果。算法終止的原因:Optimizationterminated:maximumnumberofgenerationsexceeded.即退出的原因是:超過最大代數(shù)而導致優(yōu)化終止。在本例中,算法在100代后結束,這是"Generations〔代數(shù)"選項的缺省值,此選項規(guī)定了算法計算的最大代數(shù)。最終點,在本例中是[0.00274-0.00516]。從命令行查找最小值為了從命令行查找Rastrigin函數(shù)的最小值,可鍵入[xfvalreason]=ga<@rastriginsfcn,2>這將返回x=0.0027-0.0052fval=0.0068reason=Optimizationterminated:maximumnumberofgenerationsexceeded.其中:x是算法返回的最終點;fval是該最終點處適應度函數(shù)的值;reason是算法結束的原因。顯示繪制圖形"Plots〔繪圖"窗格可以顯示遺傳算法運行時所提供的有關信息的各種圖形。這些信息可以幫助我們改變算法的選項,改進算法的性能。例如,為了繪制每一代適應度函數(shù)的最佳值和平均值,選中復選框"Bestfitness〔最佳適應度",如圖8.8所示。圖8.8繪圖對話框當點擊Start按鈕時,遺傳算法工具顯示每一代適應度函數(shù)的最佳值和平均值的繪制圖形。當算法停止時,所出現(xiàn)的圖形如圖8.9所示。最佳值0.0067796平均值0.014788最佳值0.0067796平均值0.014788圖8.9各代適應度函數(shù)的最佳值和平均值在每一代中,圖的底部的點表示最佳適應度值,而其上的點表示平均適應度值。圖的頂部還顯示出當前一代的最佳值0.0067796和平均值0.014788。為了得到最佳適應度值減少到多少為更好的直觀圖形,我們可以將圖中y軸的刻度改變?yōu)閷?shù)刻度。為此,需進行如下操作:<1>從繪圖窗格的Edit〔編輯菜單中選擇"AxesProperties〔坐標軸屬性",打開屬性編輯器,如圖8.10所示。選擇對數(shù)刻度單擊Y表項選擇對數(shù)刻度單擊Y表項圖8.10繪圖屬性編輯器<2>點擊Y表項。<3>在"Scale〔刻度"窗格,選擇"Log<對數(shù)>"。繪制的圖形如圖8.11所示。最佳值0.0067796平均值0.014788最佳值0.0067796平均值0.014788圖8.11每一代適應度函數(shù)最佳值和平均值的對數(shù)圖形典型情況下,在早期各代中,當個體離理想值較遠時,最佳值會迅速得到改進。在后來各代中,種群越接近最佳點,最佳值改進得越慢。8.2.4遺傳算法的一些術語本節(jié)解釋遺傳算法的一些基本術語,主要包括:適應度函數(shù)〔FitnessFunctions。個體〔Individuals。種群〔Populations和代〔Generations。適應度值〔FitnessValues和最佳適應度值〔BestFitnessValues;父輩和子輩〔ParentsandChildren。適應度函數(shù)所謂適應度函數(shù)就是想要優(yōu)化的函數(shù)。對于標準優(yōu)化算法而言,這個函數(shù)稱為目標函數(shù)。該工具箱總是試圖尋找適應度函數(shù)的最小值。我們可以將適應度函數(shù)編寫為一個M文件,作為輸入?yún)?shù)傳遞給遺傳算法函數(shù)。個體一個個體是可以施加適應度函數(shù)的任意一點。一個個體的適應度函數(shù)值就是它的得分或評價。例如,如果適應度函數(shù)是則向量〔2,-3,1就是一個個體,向量的長度就是問題中變量的個數(shù)。個體〔2,-3,1的得分是f<2,-3,1>=51。個體有時又稱為基因組或染色體組〔genome,個體的向量項稱為基因〔genes。種群與代所謂種群是指由個體組成的一個數(shù)組或矩陣。例如,如果個體的長度是100,適應度函數(shù)中變量的個數(shù)為3,我們就可以將這個種群表示為一個100×3的矩陣。相同的個體在種群中可以出現(xiàn)不止一次。例如,個體<2,-3,1>就可以在數(shù)組的行中出現(xiàn)多次。每一次迭代,遺傳算法都對當前種群執(zhí)行一系列的計算,產生一個新的種群。每一個后繼的種群稱為新的一代。多樣性多樣性或差異〔Diversity涉及一個種群的各個個體之間的平均距離。若平均距離大,則種群具有高的多樣性;否則,其多樣性低。在圖8.12中,左面的種群具有高的多樣性,亦即差異大;而右面的種群多樣性低,亦即差異小。圖8.12種群多樣性比較多樣性是遺傳算法必不可少的本質屬性,這是因為它能使遺傳算法搜索一個比較大的解的空間區(qū)域。適應度值和最佳適應度值個體的適應度值就是該個體的適應度函數(shù)的值。由于該工具箱總是查找適應度函數(shù)的最小值,所以一個種群的最佳適應度值就是該種群中任何個體的最小適應度值。父輩和子輩為了生成下一代,遺傳算法在當前種群中選擇某些個體,稱為父輩,并且使用它們來生成下一代中的個體,稱為子輩。典型情況下,該算法更可能選擇那些具有較佳適應度值的父輩。遺傳算法如何工作本節(jié)簡要介紹遺傳算法的工作原理或工作過程,內容包括:算法要點;初始種群;生成下一代;后一代的繪圖;算法的停止條件。算法要點下面的要點總結了遺傳算法是如何工作的:<1>首先,算法創(chuàng)建一個隨機種群。<2>接著,算法生成一個新的種群序列,即新的一代。在每一步,該算法都使用當前一代中的個體來生成下一代。為了生成新一代,算法執(zhí)行下列步驟:<a>通過計算其適應度值,給當前種群的每一個成員打分。<b>確定原來的適應度值的比例尺度,將其轉換為更便于使用的范圍內的值。<c>根據(jù)它們的適應度選擇父輩。<d>由父輩產生子輩。子輩的產生可以通過隨機改變一個單個父輩,亦即變異〔mutation來進行,也可以通過組合一對父輩的向量項,亦即交叉〔crossover來進行。<e>用子輩替換當前種群,形成下一代。<3>最后,若停止準則之一得到滿足,則該算法停止。關于停止準則,可參見"算法的停止條件"一節(jié)。初始種群遺傳算法總是以產生一個隨機的初始種群開始,如圖8.13所示。圖8.13初始種群在本例中,初始種群包含20個個體,這恰好是"Population〔種群"選項中的"Populationsize〔種群尺度"的缺省值。注意:初始種群中的所有個體均處于圖上右上角的那個象限,也就是說,它們的坐標處于0和1之間,這是因為"Population"選項中的"Initialrange〔初始范圍"的缺省值是[0;1]。如果已知函數(shù)的最小點大約位于何處,就可以設置一個適當?shù)?Initialrange",以便使該點處于那個范圍的中間附近。例如,如果確信Rastrigin函數(shù)的最小值在點[0,0]附近,那么就可以直接設置"Initialrange"為[-1;1]。然而,正如本例所顯示的那樣,即使沒有給"Initialrange"設置一個理想的值,遺傳算法也還是能夠找到那個最小值。產生下一代在每一步,遺傳算法使用當前種群來產生子輩,即獲得下一代。算法在當前種群中選擇一組個體,稱為父輩,這些個父輩將其genes——亦即其向量中的項——貢獻給它們的子輩。遺傳算法通常選擇那些具有較好適應度值的個體作為父輩。我們可以在"Selection〔選擇"選項的"Selectionfunction〔選擇函數(shù)"文本框中指定遺傳算法用來選擇父輩的函數(shù)。遺傳算法對于下一代產生三類子輩:優(yōu)良子輩〔Elitechildren,是在當前代中具有最佳適應度值的那些個體。這些個體子輩存活到下一代。交叉子輩〔Crossoverchildren,是由一對父輩向量組合產生的。變異子輩〔Mutationchildren,是對一個單個父輩引入隨機改變即變異產生的。圖8.14表示了這三個類型的子輩。優(yōu)良子輩優(yōu)良子輩交叉子輩變異子輩圖8.14三類子輩在"變異與交叉"一節(jié)解釋如何指定遺傳算法產生的每一類子輩的數(shù)目,以及用來執(zhí)行完成交叉和變異的函數(shù)。交叉子輩算法通過組合當前種群中的父輩對〔Pair來產生交叉子輩。在子輩向量的每一個相同位置處,缺省的交叉函數(shù)在兩個父輩之一的相同位置處隨機選擇一項,即基因,并將它指派給其子輩。變異子輩算法通過隨機改變個體父輩中的基因而產生變異子輩。按照缺省,算法給父輩增加一個高斯分布的隨機向量。圖8.15表示出初始種群的子輩,也即第二代種群,并且指出它們是否為優(yōu)良子輩、交叉子輩或變異子輩。圖8.15初始種群的子輩后代圖形繪制圖8.16展示出在迭代60次,80次,95次,100次時的種群的圖形。圖8.16在迭代60,80,95,100次時的種群隨著代數(shù)的增加,種群中的個體靠近在一起,且逼近最小值點[0,0]。算法的停止條件遺傳算法使用下列5個條件來確定何時停止:Generations〔代數(shù)——當產生的代的數(shù)目達到規(guī)定的代數(shù)的值時,算法停止。Timelimit〔時限——在運行時間的秒數(shù)等于時限時,算法停止。Fitnesslimit〔適應度限——當適應度函數(shù)的值對于當前種群的最佳點小于或等于適應度限時,算法停止。Stallgenerations〔停滯代數(shù)——在連續(xù)繁殖的時間序列中,若長時間不繁殖新代,亦即目標函數(shù)無改進,到達停滯代數(shù)規(guī)定的代數(shù)時,則算法停止。Stalltimelimit〔停滯時限——在秒數(shù)等于停滯時限的時間間隔期間,若目標函數(shù)無改進,則算法停止。若這5個條件中任何一個條件一旦滿足,則該算法停止。我們可以在遺傳算法工具的"Stoppingcriteria〔停止標準"選項中指定這些標準的值。它們的缺省值如圖8.17所示。圖8.17停止標準的缺省值當運行遺傳算法時,"Status〔狀態(tài)"面板顯示這些導致算法停止的標準。"Timelimit〔時限"選項與"Stalltimelimit"選項可以用來防止算法運行過長的時間。如果算法由于這兩個條件之一而停止,則可以通過相應增加"Timelimit"或"Stalltimelimit"的值來改善運行的結果。8.3使用遺傳算法工具求解問題本節(jié)首先概括使用遺傳算法工具GUI的一般步驟,然后介紹如何從命令行使用遺傳算法工具,最后通過例子,詳細說明如何使用遺傳算法工具來求解優(yōu)化問題。使用遺傳算法GUI在前面一章,已經介紹了使用遺傳算法工具的初步知識。本節(jié)將簡要歸納使用遺傳算法工具GUI來求解優(yōu)化問題的一般步驟,內容包括:打開遺傳算法工具;在遺傳算法工具中定義問題;運行遺傳算法;暫停和停止運算;圖形顯示;創(chuàng)建用戶圖形函數(shù);復現(xiàn)運行結果;設置選項參數(shù);輸入輸出參數(shù)及問題;從最后種群繼續(xù)運行遺傳算法。打開遺傳算法工具在MATLAB窗口中輸入gatool,打開、進入遺傳算法工具,初啟時的界面顯示如圖8.18所示。圖8.18遺傳算法工具初啟時的界面在遺傳算法工具中定義問題在下列兩個文本框中定義所要解決的問題:<1>適應度函數(shù)——求解的問題是求目標函數(shù)的最小值。輸入一個計算適應度函數(shù)的M文件函數(shù)的句柄。<2>變量個數(shù)——適應度函數(shù)的獨立變量個數(shù)。注意:當運行遺傳算法工具時不要用"Editor/Debugger〔編輯/調試"功能來調試目標函數(shù)的M文件,而要從命令行直接調用目標函數(shù)或把M文件輸入到遺傳算法函數(shù)ga。為了方便調試,可以在遺傳算法工具中把問題輸出到MATLAB工作窗中。如圖8.19所示,輸入前面章節(jié)所介紹的Rastrigin函數(shù)或my_fun函數(shù)作為適配度函數(shù),它們的變量個數(shù)為2。圖8.19輸入適應度函數(shù)與變量個數(shù)運行遺傳算法要運行遺傳算法,在"Runsolver〔運行求解器"中單擊Start按紐,如圖8.20所示。圖8.20單擊Start按鈕這時,在"Currentgeneration〔當前代"文本框中顯示當前代的數(shù)目,在Statusandresults"窗格顯示"GArunning"等信息,如圖8.23所示。圖8.21當前代數(shù)和狀態(tài)與結果窗格當遺傳算法停止時,"Statusandresults"窗格顯示:"GAterminated〔GA終止"信息。最后一代最佳個體的適應度函數(shù)值。算法停止的原因。最終點的坐標。圖8.22顯示當運行例子"Rastrigin函數(shù)"遺傳算法停止時的信息。圖8.22Rastrigin函數(shù)的遺傳算法運行結果在遺傳算法工具中,當遺傳算法運行時可以更改多個參數(shù)設置。所做的改變將被應用到下一代,即在下一代將按照新設置的參數(shù)運行。在下一代開始但尚未應用改變的參數(shù)之前,在"Statusandresults"窗格顯示信息"Changespending"。而在下一代開始且應用了改變的參數(shù)時,在"Statusandresults"窗格顯示信息"Changesapplied"。這樣在遺傳算法運行時更改了參數(shù)設置產生的輸出信息如圖8.23所示。圖8.23遺傳算法運行時更改了參數(shù)設置暫停和停止運算遺傳算法的暫停和停止運行,可以通過下面操作繼續(xù)運行:單擊按鈕"Pause〔暫停",算法暫停運行。該按鈕上的文字變?yōu)?Resume〔恢復"。單擊這個"Resume"按鈕,即恢復遺傳算法繼續(xù)運行。單擊按鈕"Stop",算法停止運行。"Statusandresults"窗口顯示停止運行時當前代最佳點的適應度函數(shù)值。注意:如果單擊按鈕"Stop",然后通過單擊按鈕"Start"再次運行時,遺傳算法將以新的隨機初始種群或在"Initialpopulation〔初始種群"文本框中專門指定的種群運行。如果需要在算法停止后能再次恢復運行,則可以通過交替地單擊按鈕"Pause"和"Resume"來控制算法暫?;蚶^續(xù)運行。遺傳算法的停止運行常常是通過設置算法停止準則來進行控制的。使用停止準則,設置停止準則參數(shù),可以解決遺傳算法在何時停止運行的控制問題。這樣,也就不用通過單擊"Stop"按鈕來人為地控制算法運行的停止。遺傳算法有五個停止準則或條件,其中任何一個條件滿足,算法即停止運行。這些停止準則是:代數(shù)——算法運行到規(guī)定的代數(shù)。時限——算法運行到規(guī)定的時間。適應度限——當前代的最佳適應度值小于或等于規(guī)定的值。停滯代數(shù)——適應度函數(shù)值在運行規(guī)定的代數(shù)后沒有改進。停滯時限——適應度函數(shù)值在運行規(guī)定時間后沒有改進。如果想使算法一直運行到按下按鈕"Pause"或"Stop"時才停下來,可以改變這些停止準則的參數(shù)值:設置"Generations〔代數(shù)"為Inf。設置"Time"為Inf。設置"Fitnesslimit"為–Inf。設置"Stallgenerations"為Inf。設置"Stalltimelimit"為Inf。圖8.24顯示了這些更改后的設置。圖8.24改變停止準則參數(shù)注意:在命令行中調用遺傳算法函數(shù)ga時,并不使用這些參數(shù)設置,就好像是不按下"Ctrl+C"鍵,函數(shù)就會永遠運行而不會停止。其實相反,可以設置"Generations"或者"Time"做為限值來控制算法停止運行。圖形顯示圖8.25為"Plots〔繪圖"窗格,可以用來控制顯示遺傳算法運行結果變化的圖形。圖8.25在繪圖窗格選擇輸出項選擇所要顯示的圖形參數(shù)的復選框。例如,如果選擇"BestFitness〔最佳適應度"和"Bestindividual〔最佳個體",運行例子"Rastrigin函數(shù)",其顯示輸出如圖8.26所示。圖8.26Rastrigin函數(shù)最佳適應度與最佳個體圖8.28上部離散點為每一代的最佳適應度值和平均適應度值,下部柱型圖表示當前代最佳適應度值對應的點的坐標。注意:當要想顯示兩個以上參數(shù)項的圖形時,可選擇相應參數(shù)項的復選框,單獨打開一個較大的圖形窗口即可。舉例——創(chuàng)建用戶繪圖函數(shù)如果工具箱中沒有符合想要輸出圖形的繪圖函數(shù),用戶可以編寫自己的繪圖函數(shù)。遺傳算法在每次運行時調用這個函數(shù),畫出圖形。這里舉例說明怎樣創(chuàng)建一個用戶繪圖函數(shù)來顯示從前一代到當前代最佳適應度值的變化情形,內容包括:創(chuàng)建繪圖函數(shù),使用繪圖函數(shù),繪圖函數(shù)如何作用。〔1創(chuàng)建繪圖函數(shù)為了創(chuàng)建繪圖函數(shù),在MATLAB編輯器中復制、粘貼下列代碼到一個新的M文件。Functionstate=gaplotchange<options,state,flag>%GAPLOTCHANGEPlotsthechangeinthebestscorefromthe%previousgeneration.persistentlast_best%Bestscoreinthepreviousgenerationif<strcmp<flag,'init'>>%Setuptheplotset<gca,'xlim',[1,options.Generations],'Yscale','log'>;holdon;xlabelGenerationtitle<'ChangeinBestFitnessValue'>endbest=min<state.Score>;%Bestscoreinthecurrentgenerationifstate.Generation==0%Setlast_besttobest。last_best=best;elsechange=last_best-best;%Changeinbestscorelast_best=best;plot<state.Generation,change,'.r'>;title<['ChangeinBestFitnessValue']>end然后在MATLAB路徑下將其存為M文件gaplotchange.m?!?使用繪圖函數(shù)為了使用用戶繪圖函數(shù),在"繪圖〔Plots"窗格中選擇"Customfunction〔定制函數(shù)",并且在其右邊的文本框中輸入函數(shù)名@gaplotchange。為了對用戶繪圖函數(shù)輸出的最佳適應度值圖形進行比較,在這里也選擇"BestFitness"?,F(xiàn)在,如果運行例子函數(shù)Rastrigin,顯示出來的圖形如圖8.27所示。最佳適應度值的變化最佳值0.0021904平均值0.49832最佳適應度值的變化最佳值0.0021904平均值0.49832圖8.27用戶繪圖函數(shù)輸出的Rastrigin函數(shù)運行結果注意:因為圖中下半部的y-軸為對數(shù)刻度,所以圖形中的離散點僅僅顯示大于零的點。對數(shù)刻度能顯示適應度函數(shù)的微小變化,而上面的圖形則不能顯示出微小變化?!?繪圖函數(shù)如何作用繪圖函數(shù)使用包含在下面結構體中的信息,它們由遺傳算法傳遞給繪圖函數(shù)作為輸入?yún)?shù):options〔參數(shù)—當前參數(shù)設置。state〔狀態(tài)—關于當前代的信息。flag〔曲線標志—曲線表示為對數(shù)等的當前狀態(tài)。繪圖函數(shù)的主要作用可以描述如下:persistentlast_best生成永久變量last_best——即前一代的最佳值。永久變量保存著多種圖形函數(shù)調用類型。set<gca,'xlim',[1,options.Generations],'Yscale','log'>;在遺傳算法運行前建立圖形。options.Generation為代數(shù)的最大值。best=min<state.Score>state.Score包含當前代中所有個體的得分值,變量best是其中最小的得分值。結構體狀態(tài)文本框的完整描述可參見"圖形參數(shù)"一節(jié)。change=last_best-best變量change是前一代的最佳值減去當前代的最佳值。plot<state.Generation,change,'.r'>畫出當前代的變化曲線,變量維數(shù)包含在state.Generation中。函數(shù)gaplotchange的代碼包含了函數(shù)gaplotbestf代碼中許多相同成分,函數(shù)gaplotbestf生成最佳適應度圖形。復現(xiàn)運行結果為了復現(xiàn)遺傳算法前一次的運行結果,選擇"Userandomstatesfrompreviousrun〔使用前一次運行的隨機狀態(tài)"復選框。這樣就把遺傳算法所用的隨機數(shù)發(fā)生器的狀態(tài)重新設置為前一次的值。如果沒有改變遺傳算法工具中的所有設置,那么遺傳算法下一次運行時返回的結果與前一次運行的結果一致。正常情況下,不要選擇"Userandomstatesfrompreviousrun"這個復選框,可以充分利用遺傳算法隨機搜索的優(yōu)點。如果想要分析特定的運行結果或者顯示相對個體的精確結果,可以選擇"Userandomstatesfrompreviousrun"復選框。設置選項參數(shù)設置遺傳算法工具使用時的選項參數(shù)有兩種方法:一種是在遺傳算法工具GUI的"Options"窗格中直接進行設置,另一種是在MATLAB工作窗口中通過命令行方式進行設置。在參數(shù)"Options"窗格中設置遺傳算法的各種運行參數(shù),如圖8.28所示。每一類參數(shù)對應有一個窗格,單擊該類參數(shù)時,對應窗格展開。例如,點擊"Population"參數(shù)選項,種群窗格展開來,可以逐一設置其中的參數(shù)項,如Populationtype〔種群類型、Populationsize〔種群尺度、Creationfunction〔創(chuàng)建函數(shù)、Initialpopulation、Initialscore〔初始得分、Initialrange〔初始范圍等。此外,其他選項參數(shù)類還有:Fitnessscaling〔適應度測量、selection、Reproduction、Mutation、Crossover、Migration〔遷移、Hybridfunction〔混合函數(shù)、Stoppingcriteria、Outputfunction〔輸出函數(shù)、Displaytocommandwindow〔顯示到命令窗口、Vectorize〔向量化等。這些參數(shù)類各自對應一個參數(shù)窗格,點擊后相應窗格隨即展開,可以進行參數(shù)項的設置。所有變量參數(shù)的含義及詳細描述可參見"8.4.1遺傳算法參數(shù)"一節(jié)。圖8.28選項參數(shù)窗口在MATLAB工作窗口中,可以將遺傳算法的運行參數(shù)設置為變量。對于數(shù)值參數(shù)的設置,可以直接在相應編輯框中輸入該參數(shù)的值,或者在包含該參數(shù)值的MATLAB工作窗口中輸入相應變量的名字,就可以完成設置。例如,可以利用下面兩種方法之一設置"Initialpoint〔初始點"為[2.11.7]:在"Initialpoint"文本框輸入[2.11.7]。在MATLAB工作區(qū)輸入變量x0=[2.11.7],然后在"Initialpoint"文本框輸入變量的名字x0。因為選項參數(shù)是比較大的矩陣或向量,所以在MATLAB工作窗口中把參數(shù)的值定義為變量一般是比較方便的,也就是說,如果需要,很容易改變矩陣或向量的項。輸入輸出參數(shù)及問題參數(shù)和問題結構可以從遺傳算法工具被輸出到MATLAB的工作窗口,也可以在以后的某個時間再反過來把它們從MATLAB的工作窗口輸入給遺傳算法工具。這樣就可以保存對問題的當前設置,并可以在以后恢復這些設置。參數(shù)結構也可以被輸出到MATLAB工作窗口,并且可以再把它們用于命令行方式的遺傳算法函數(shù)ga。輸入和輸出信息通常包含下列各項:問題定義,包括"Fitnessfunction"和"Numberofvariables〔變量個數(shù)"。當前指定的選項參數(shù)。算法運行的結果。下面解釋如何輸入和輸出這些信息?!?輸出參數(shù)和問題參數(shù)和問題可以被輸出到MATLAB工作空間,以便以后在遺傳算法工具中應用它們。也可以以命令行方式,在函數(shù)ga中應用這些參數(shù)和問題。為了輸出參數(shù)和問題,單擊"ExporttoWorkspace〔輸出到工作空間"按鈕或從File菜單中選擇"ExporttoWorkspace"菜單項,這將打開如圖8.29所示的對話框。圖8.29輸出對話框對話框提供下列參數(shù):①為了保存問題的定義和當前參數(shù)的設置,選擇"ExportproblemandoptionstoaMATLABstructurenamed〔輸出問題與參數(shù)到已命名的MATLAB結構",并為這個結構體輸入一個名字。單擊OK按鈕,即把這個信息保存到MATLAB工作空間的一個結構體。如果以后要把這個結構體輸入到遺傳算法工具,那么當輸出這個結構時,所設置的"Fitnessfunction"和"Numberofvariables",以及所有的參數(shù)設置都被恢復到原來值。注意:輸出問題之前,如果在"Runsolver〔運行求解器"窗格選中"Userandomstatesfrompreviousrun〔使用前一次運行的隨機狀態(tài)"選項,則遺傳算法工具將保存上一次運行開始時隨機數(shù)產生函數(shù)rand和randn的狀態(tài)。然后,在選擇了"Userandomstatesfrompreviousrun"選項的情況下,輸入問題且運行遺傳算法,那么輸出問題之前的運行結果就被準確地復現(xiàn)了。②如果想要遺傳算法在輸出問題之前從上一次運行的最后種群恢復運行,可選擇"Includeinformationneededtoresumethisrun〔包括所需信息以恢復本次運行"。然后,當輸入問題結構體并單擊Start按鈕,算法就從前次運行的最后種群繼續(xù)運行。為了恢復遺傳算法產生隨機初始種群的缺省行為,可刪除在"Initialpopulation"字段所設置的種群,并用代之以空的中括號‘[]’。注意:當選擇了"Includeinformationneededtoresumethisrun"選項,則選擇"Userandomstatesfrompreviousrun"選項對于輸入問題和運行遺傳算法時創(chuàng)建的初始種群將不再有任何作用。后者的選項只是指定從新的一次運行開始時再一次復現(xiàn)結果,而不是為了恢復算法的繼續(xù)運行。③如果只是為了保存參數(shù)設置,可選擇"ExportoptionstoaMATLABstructurenamed〔輸出參數(shù)到已命名的MATLAB結構",并為這個參數(shù)結構體輸入一個名字。④為了保存遺傳算法最近一次運行的結果,可選擇"ExportresultstoaMATLABstructurenamed",并為這個結果結構體輸入一個名字?!?舉例——用輸出問題運行函數(shù)ga輸出一個問題可參見"8.2.3舉例:Rastrigin函數(shù)"一節(jié),在命令行運行遺傳算法函數(shù)ga,其步驟如下:①單擊"ExporttoWorkspace"按鈕,打開相應對話框。②在"ExportToWorkspace"對話框中的"ExportproblemandoptionstoaMATLABstructurenamed"右面的文本框,輸入問題結構體的名稱,假設為my_gaproblem。③在MATLAB窗口,以my_gaproblem為參數(shù)調用函數(shù)ga:[xfval]=ga<my_gaproblem>則返回結果:x=0.0027-0.0052fval=0.0068調用函數(shù)ga可參見"8.3.2從命令行使用遺傳算法"一節(jié)?!?輸入?yún)?shù)為了從MATLAB工作窗中輸入一個參數(shù)結構體,可從"File"菜單選擇"ImportOptions〔輸入?yún)?shù)"菜單項。在MATLAB工作窗中打開一個對話框,列出遺傳算法參數(shù)結構體的一系列選項。當選擇參數(shù)結構體并單擊"Import〔輸入"按鈕,在遺傳算法工具中的參數(shù)域就被更新,且顯示所輸入?yún)?shù)的值。創(chuàng)建參數(shù)結構體有兩種方法:調用函數(shù)gaoptimset,以參數(shù)結構options作為輸出。在遺傳算法工具中,從"ExporttoWorkspace〔輸出到工作空間"對話框保存當前參數(shù)?!?輸入問題為了從遺傳算法工具輸入一個以前輸出的問題,可從"File"菜單選擇"ImportProblem〔輸入問題"菜單項。在MATLAB工作窗中,打開一個對話框,顯示遺傳算法問題結構體的一個列表。當選擇了問題結構體并單擊OK按鈕,遺傳算法工具中的下列文本框被更新:適應度函數(shù)。變量個數(shù)。參數(shù)域。0舉例——從最后種群中繼續(xù)遺傳算法下面的例子顯示如何輸出一個問題,以便當輸入問題并按下Start按鈕時,遺傳算法能從該輸出問題所保存的最后種群繼續(xù)運行?,F(xiàn)在運行一個例子,在遺傳算法工具中輸入下面的信息:設置適應度函數(shù)為@ackleyfcn,它是計算函數(shù)Ackley,是工具箱提供的一個測試函數(shù)。設置"Numberofvariables"為10。在"Plots"窗格選擇"Bestfitness"。單擊按鈕"Start"。顯示的結果如圖8.30所示。圖8.30函數(shù)ackleyfcn的最佳適應度假定想要實驗利用其它的參數(shù)運行遺傳算法,接著利用當前參數(shù)設置,此后再從最后種群重新運行算法。為此,進行以下步驟:①單擊"ExporttoWorkspace"按鈕。②在出現(xiàn)的對話框中:選擇"ExportproblemandoptionstoaMATLABstructurenamed"。在文本框中輸入問題和參數(shù)的名稱,例如ackley_uniform。選擇"Includeinformationneededtoresumethisrun〔包括所需信息以恢復本次運行"。做了這些選擇后的對話框如圖8.31所示。圖8.31在輸出窗口對話框中做適當選擇③單擊OK按鈕。問題和參數(shù)被輸出到MATLAB工作空間的一個結構體中。在MATLAB命令窗口輸入下面的信息就可以觀察這個結構體:ackley_uniformackley_uniform=fitnessfcn:@ackleyfcngenomelength:10options:[1x1struct]利用不同的參數(shù)設置,甚至是不同的適應度函數(shù),在運行遺傳算法之后,都能夠按照如下步驟來恢復問題:①從"File"菜單,選擇"ImportProblem"菜單項。打開的對話框如圖8.32所示。圖8.32GA問題輸入窗口②選擇ackley_uniform。③單擊按鈕"Import"。這樣就把"Population"選項中的"Initialpopulation"字段設置成輸出問題之前運行的最后種群。在運行期間,所有其它參數(shù)恢復它們的設置。當單擊Start按鈕時,遺傳算法從被保存的最后種群重新運行。圖8.33所示為初始運行和重新運行的最佳適應度圖形。第一次運行從這里繼續(xù)運行第一次運行從這里繼續(xù)運行圖8.33初始運行和重新運行的最佳適應度注意:如果在利用所導入問題運行遺傳算法之后,想要恢復遺傳算法生成一個隨機初始種群的缺省行為,可刪除"Initialpopulation"字段中設置的種群,而代之以空的中括號‘[]’。1生成M文件在遺傳算法工具中,要利用特定的適應度函數(shù)和參數(shù)生成運行遺傳算法的M文件,可從"File"菜單選擇"GenerateM-File〔生成M文件"菜單項,并把生成的M文件保存到MATLAB路徑的一個目錄。在命令行調用這個M文件時,返回的結果與利用在遺傳算法工具中生成M文件時的適應度函數(shù)和參數(shù)所得到的結果一致。8.3.2從命令行使用遺傳算法使用遺傳算法,也可以從命令行運行遺傳算法函數(shù)ga。這方面的內容主要包括:利用缺省參數(shù)運行ga;在命令行設置ga的參數(shù);使用遺傳算法工具的參數(shù)和問題結構;復現(xiàn)運行結果;以前一次運行的最后種群重新調用函數(shù)ga;從M文件運行ga。利用缺省參數(shù)運行ga利用缺省參數(shù)運行遺傳算法,以下面語句調用ga[xfval]=ga<@fitnessfun,nvars>其中:@fitnessfun—計算適應度函數(shù)值的M文件的函數(shù)句柄。nvars—適應度函數(shù)中獨立變量的個數(shù)。x—返回的最終點。fval—返回的適應度函數(shù)在x點的值。例如,運行例子Rastrigin函數(shù),從命令行輸入[xfval]=ga<@rastriginsfcn,2>這將返回x=0.0027-0.0052fval=0.0068為了得到遺傳算法更多的輸出結果,可以用下面語句調用ga[xfvalreasonoutputpopulationscores]=ga<@fitnessfcn,nvars>除了輸出變量x和fval之外,增加了以下輸出變量"reason〔原因"—算法停止的原因。"output〔輸出"—包含關于算法在每一代性能的結構體。"population〔種群"—最后種群。"scores〔得分"—最終得分值。在命令行設置ga的參數(shù)遺傳算法工具中的參數(shù)可以指定為任何有效的參數(shù)值,設置參數(shù)使用下面語句:[xfval]=ga<@fitnessfun,nvars,options>使用函數(shù)gaoptimset生成一個參數(shù)結構體。options=gaoptimset返回帶有缺省值的參數(shù)結構體:options=PopulationType:'doubleVector'PopInitRange:[2x1double]PopulationSize:20EliteCount:2CrossoverFraction:0.8000MigrationDirection:'forward'MigrationInterval:20MigrationFraction:0.2000Generations:100TimeLimit:InffitnessLimit:-InfStallLimitG:50StallLimitS:20InitialPopulation:[]InitialScores:[]PlotInterval:1CreationFcn:@gacreationuniformfitnessScalingFcn:@fitscalingrankSelectionFcn:@selectionstochunifCrossoverFcn:@crossoverscatteredMutationFcn:@mutationgaussianHybridFcn:[]Display:'final'PlotFcns:[]OutputFcns:[]Vectorized:'off'如果沒有給某一參數(shù)項輸入新的值,則函數(shù)ga使用其缺省值。每一個參數(shù)的值都存放在參數(shù)結構體中,例如options.PopulationSize。可以通過輸入?yún)?shù)的名稱顯示參數(shù)的值。例如,顯示遺傳算法種群的大小,可輸入options.PopulationSizeans=20改變參數(shù)結構體中成員值,例如,設置PopulationSize值等于100,代替它的缺省值20,可輸入options=gaoptimset<'PopulationSize',100>參數(shù)結構體中,PopulationSize為100,其它值都為缺省值或當前值。這時,再輸入ga<@fitnessfun,nvars,options>函數(shù)ga將以種群中個體為100運行遺傳算法。如果想接著改變參數(shù)結構體其它成員的值,例如設置PlotFcns為@gaplotbestf,畫出每一代最佳適應度函數(shù)值圖形,則可用下面語句調用函數(shù)gaoptimsetoptions=gaoptimset<options,'PlotFcns',@plotbestf>這里保持了參數(shù)的所有當前值,除PlotFcns之外,它改變?yōu)锧plotbestf。注意,如果省略輸入自變量參數(shù)options,那么函數(shù)gaoptimset重新置PopulationSize為它的缺省值20。也可以利用一個語句來同時設置兩個參數(shù)PopulationSize和PlotFcns:options=gaoptimset<'PopulationSize',100,'PlotFcns',@plotbestf>使用遺傳算法工具的參數(shù)和問題結構利用函數(shù)gaoptimset創(chuàng)建一個參數(shù)結構體,在遺傳算法工具中設置參數(shù)的值,然后在MATLAB工作窗中輸出參數(shù)給結構體。如果想在遺傳算法工具中輸出缺省值,則導出的結構體的參數(shù)與由命令行得到的缺省結構體的參數(shù)一致。options=gaoptimset如果想從遺傳算法工具輸出一個問題結構體ga_problem,可用下面的語句調用函數(shù)ga[xfval]=ga<ga_problem>問題結構體包含:fitnessfcn—適應度函數(shù)。nvars—問題的變量數(shù)。options—參數(shù)結構體。復現(xiàn)運行結果因為遺傳算法是隨機性方法,也就是說,產生隨機機率,即每次運行遺傳算法得到的結果都會略有不同。算法利用MATLAB隨機數(shù)產生器函數(shù)rand和randn,在每一次迭代中,產生隨機機率。每一次函數(shù)ga調用rand和randn,它們的狀態(tài)都可能發(fā)生改變,以便下一次再被調用時,它們返回不同的隨機數(shù)。這就是為什么每次運行后ga輸出的結果會略有不同。如果需要準確復現(xiàn)運行結果,可以在調用函數(shù)ga時包含rand和randn的當前狀態(tài)。在又一次運行ga之前,重新設置這些值的狀態(tài)。例如,要復現(xiàn)Rastrigin函數(shù)的ga的輸出,可以利用下面的語句調用ga[xfvalreasonoutput]=ga<@rastriginsfcn,2>;假設某次運行的返回結果為x=0.0027-0.0052fval=0.0068則隨機函數(shù)rand和randn兩者的狀態(tài)被保存在output結構中。output=randstate:[35x1double]randnstate:[2x1double]generations:100funccount:2000message:[1x64char]然后,重新設置狀態(tài),輸入rand<'state',output.randstate>;randn<'state',output.randnstate>;如果現(xiàn)在再次運行ga,就會得到相同的結果。注意:如果沒有必要復現(xiàn)運行結果,最好不要設置rand和randn的狀態(tài),以便能夠得到遺傳算法隨機搜索的益處。以前一次運行的最后種群重新調用函數(shù)ga缺省情況下,每次運行ga時都生成一個初始種群。然而,可以將前一次運行得到的最后種群作為下一次運行的初始種群,這樣做能夠得到更好的結果。這可以利用下面語句實現(xiàn):[x,fval,reason,output,final_pop]=ga<@fitnessfcn,nvars>;最后一個輸出變量final_pop返回的就是本次運行得到的最后種群。將final_pop再作為初始種群運行ga,語句為:options=gaoptimset<'InitialPop',final_pop>;[x,fval,reason,output,final_pop2]=ga<@fitnessfcn,nvars>;還可以將第二次運行ga得到的最后種群final_pop2作為第三次運行ga的初始種群。從M文件運行ga利用命令行可以運行遺傳算法。使用M文件可以有不同的參數(shù)設置。例如,可以設置不同的交叉概率來運行遺傳算法,觀察、比較每次運行的結果。下面的代碼是運行ga函數(shù)21次,變量options.CrossoverFraction從0到1,間隔為0.05,所記錄的運行結果。options=gaoptimset<'Generations',300>;rand<'state',71>;%Thesetwocommandsareonlyincludedtorandn<'state',59>;%maketheresultsreproducible.record=[];forn=0:.05:1options=gaoptimset<options,'CrossoverFraction',n>;[xfval]=ga<@rastriginsfcn,10,options>;record=[record;fval];end可以利用下列語句,以不同概率畫出fval值的曲線圖形:plot<0:.05:1,record>;xlabel<'CrossoverFraction'>;ylabel<'fval'>顯示結果參見圖8.34所示。圖8.34從M文件運行遺傳算法時fval值的曲線圖形從圖形顯示可以看出,options.CrossoverFraction的值為0.6~0.95時,可得到最好結果。取每次運行得到的fval的平均值,就可以畫出fval的光滑曲線,如圖8.35所示。圖8.35從M文件運行遺傳算法時fval平均值的曲線圖形曲線最凹的部分對應options.CrossoverFraction的值為0.7~0.9。8.3.3遺傳算法舉例為了得到遺傳算法的最好結果,一般需要以不同的參數(shù)實驗。通過不斷實驗,選擇針對問題的最佳參數(shù)。有效參數(shù)的完整描述可參見"8.4.1遺傳算法參數(shù)"一節(jié)。本節(jié)介紹幾種能夠提高運算效果的參數(shù)改變方法,內容包括:種群多樣性;適應度測量;選擇;復制參數(shù);變異與交叉;設置變異大小;設置交叉概率;相對于全局的局部最小值;使用混合函數(shù);設置最大代數(shù);向量化適應度函數(shù)。種群的多樣性決定遺傳算法的一個重要性能是種群的多樣性。個體之間的距離越大,則多樣性越高;反之,個體之間的距離越小,則多樣性越低。由試驗得到種群的適當多樣性。如果多樣性過高或者過低,遺傳算法都可能運行不好。這里介紹如何設置種群的初始范圍來控制種群的多樣性,并介紹如何設置種群尺度。舉例——設置初始范圍遺傳算法工具在默認情況下利用生成函數(shù)隨機生成一個初始種群。使用者可以在"Population"的"Initialrange"文本框中指定初始種群的向量范圍。注意:初始范圍僅僅限制在初始種群中的點的范圍。后續(xù)各代包含的點可以不在初始種群的范圍之內。如果知道問題解的大概范圍,計算時就可以指定包含問題解的初始范圍。但是,假設種群具有足夠的多樣性,遺傳算法就可以找到不在初始范圍的解。下面的例子顯示初始范圍對遺傳算法性能的影響。這個例子利用Rastrigin函數(shù),函數(shù)在原點取得最小值為0。運行之前在遺傳算法工具中設置下列參數(shù):設置適應度函數(shù)為@Rastriginsfcn。設置"Numberofvariables"為2。在"Plots"窗格選擇"Bestfitness〔最佳適應度"。在"Plots"窗格選擇"Range"。設置"Initialrange"為[1;1.1]。然后,單擊Start按鈕。遺傳算法返回最佳適應度值為2,其顯示圖形如圖8.36所示。圖8.36初始范圍為[1;1.1]時最佳適應度值和平均距離圖8.38上面為每代最佳適應度值變化圖,下面為每代個體之間平均距離圖,它可以很好地用來衡量種群的多樣性。對于初始范圍的設置,由于多樣性太小,算法進展很小。第二次,嘗試設置"Initialrange"為[1;100],運行算法,得到最佳適應度值大約為3.9,如圖圖8.37所示。圖8.37初始范圍為[1;100]時最佳適應度值和平均距離這次,算法進展較快。但是,由于個體之間的平均距離太大,最佳個體遠離最優(yōu)解。第三次,設置"Initialrange"為[1;2],運行算法。得到最佳適應度值大約為0.012,如圖8.38所示。圖8.38初始范圍為[1;2]時最佳適應度值和平均距離這次由于多樣性比較適合這個問題,所以算法得到的結果比前兩次都好。〔2設置種群尺度在"種群〔Population"參數(shù)域中"Size"決定每代種群的大小。增加種群的大小,遺傳算法能夠搜索更多的點,因此,能夠得到較好結果。但是,種群越大,遺傳算法每代運行時間越長。注意:至少應該設置"尺度〔Size"的值為"Numberofvariables",以便在每一種群中使個體超出搜索范圍。進行實驗時,可以設置不同的種群尺度,不限制運行時間,以期得到最好結果。適應度測量適應度測量把適應度函數(shù)返回的原始適應度得分值轉換為適合選擇函數(shù)的范圍內的值。選擇函數(shù)根據(jù)適應度值的大小,選擇下一代的父體。選擇函數(shù)分配大選擇概率給適應度值大的個體。適應度測量值的范圍影響遺傳算法的性能。如果測量值變化范圍太大,則具有高測量值的個體復制的速度很快,取代種群基因池的速度很快,防礙了遺傳算法搜索解空間的其它區(qū)域。相反,如果測量值變化太小,所有個體復制機會基本相同,則搜索過程進展緩慢。缺省的適應度尺度變換函數(shù)為Rank〔排序,根據(jù)每個個體的順序而不是它的得分值來變換原始得分值。個體的順序是它在分類后的位置。最適應的個體的序號為1,次之為2,依次類推。排序尺度變換函數(shù)分配尺度值有下列目的:個體的尺度值與n成正比。整個種群的尺度值的和等于要求生成下一代父體的數(shù)目。排序適應度尺度變換函數(shù)避免了初始值的界限的影響。圖8.39所示為具有20個個體的一個典型種群的初始得分值,按升序排序。圖8.39具有20個個體的一個典型種群的初始得分值圖8.40所示為使用尺度變換函數(shù)的初始尺度值。圖8.40使用尺度變換函數(shù)的初始尺度值因為算法按適應度函數(shù)的最小化處理,所以低的初始值具有高的尺度值。又因為排序尺度變換只根據(jù)個體的順序分配值的大小,對于一個大小為20、父輩數(shù)等于32的群體,顯示的尺度值可以是相同的。可以把排序尺度變換〔Rankscaling與頂級尺度變換〔Topscaling進行比較。為了觀察尺度變換的效果,可以把遺傳算法利用排序尺度變換得到的結果與利用其它函數(shù)〔如頂級變換得到的結果相比較。默認情況下,頂級尺度變換分配4個最佳適應度個體相同的尺度值,等于父輩數(shù)除以4,而分配其它個體的尺度值為0。利用默認的選擇函數(shù),只有4個最佳適應度個體能被選為父輩。圖8.41為比較排序尺度變換與頂級尺度變換得到的尺度值,種群尺度為20,父輩數(shù)為32。圖8.41比較排序尺度變換與頂級尺度變換得到的尺度值因為Topscaling限制父輩為最佳適應度個體,它產生的種群類型比Rankscaling產生的種群類型少。圖8.42所示為每一代Rankscaling與Topscaling得到的個體之間的距離變化的比較。圖8.42排序與頂級尺度變換各代個體之間距離變化之比較選擇選擇函數(shù)根據(jù)個體由適應度尺度變換函數(shù)得到的尺度值,為下一代選擇父輩。當一個個體為多個子輩貢獻它的基因時,它就可能多次被選做父輩。默認的選擇函數(shù)為Stochasticuniform〔隨機均勻函數(shù)——在每一父輩畫出一條與選擇線對應的直線,長度與它的尺度值成比例。算法以等步長在線上移動。在每一步,算法從落入線上的部分分配父輩。一個比較確定的選擇函數(shù)是Remainder,由下列兩步運行:首先,函數(shù)按照尺度值的整數(shù)部分為每個個體選擇父輩。例如,假設一個個體的尺度值是2.3,函數(shù)選擇這個個體兩次作為父輩。其次,在隨機均勻選擇時,選擇函數(shù)利用尺度值的小數(shù)部分選擇剩余的父輩。函數(shù)落入選擇線內,即長度與個體尺度值的小數(shù)部分成比例,在線上按等步長移動來選擇父輩。注意,如果尺度值的小數(shù)部分都等于0,就象頂級尺度變換一樣,選擇是完全確定的。復制參數(shù)復制參數(shù)控制遺傳算法怎樣生成下一代。這些參數(shù)有:elitecount〔優(yōu)良計數(shù)—在當前種群中,具有最佳適應度值的個體遺傳到下一代的個體數(shù)。這些個體稱為優(yōu)良子輩〔elitechildren。elitecount的默認值為2。當優(yōu)良計數(shù)至少為1時,最佳適應度值可能從一代到下一代減少。這是人們希望的,因為遺傳算法使適應度函數(shù)最小化。設置elitecount為一個大數(shù),可以使得最適應個體控制種群,但可能減小搜索的有效性。Crossoverfraction〔交叉概率—下一代個體的一小部分,它不是elitechildren〔優(yōu)良子輩,而是由交叉產生的部分。參見"設置交叉概率"一節(jié)。變異與交叉遺傳算法運用當前代的個體生成子代個體,構成下一代。除了elitechildren外,算法還生成下列子代個體:從當前代中選擇兩個個體,交換兩個個體的某個或某些位〔基因,結合后形成交叉子個體。隨機改變當前代的單個個體形成變異子個體。這兩個過程是遺傳算法的主要過程。交叉能夠使遺傳算法從不同的個體中提取更好的基因,結合到具有優(yōu)勢的子個體中。變異增加了種群的多樣性,因而增大了算法生成更高適應度值的個體的可能性。沒有變異,算法只能產生由初始種群結合基因的子集構成的個體。算法生成的子個體類型如下:Elitecount,在"Reproduction"文本框,指定elitechildren的數(shù)目。Crossoverfraction,在Reproduction文本框,指定種群中交叉子個體的概率,它不同于elitechildren。例如,假設Populationsize〔種群尺度為20,Elitecount為2,Crossoverfraction為0.8,則下一代子個體類型如下:有2個優(yōu)良子輩。除優(yōu)良子輩以外,還有18個個體。所以計算0.8*18=14.4取整得14,得到14個交叉子個體。還有4個個體,它們不是elitechildren,而是變異子個體。設置變異大小遺傳算法應用變異函數(shù)〔Mutationfunction字段中指定的函數(shù)進行變異操作。默認的變異函數(shù)為高斯函數(shù)Gaussian,它把一個從高斯分布選擇的隨機數(shù),即mutation,加到父輩向量的每一個項上。典型情況下,與分布的標準差成比例的變異大小,在每一后代中都是減小的。通過參數(shù)尺度〔Scale和壓縮〔Shrink,可以控制每一代變異的平均數(shù)量。Scale控制第一代變異的標準差。標準差是Scale乘以初始種群的范圍——該范圍是使用者由Initialrange參數(shù)指定的。壓縮〔Shrink控制變異的平均數(shù)量的減少率。標準差線性減小,以便標準差等于1–Shrink乘以它在第一代的值。例如,假設Shrink缺省值為1,則變異數(shù)在最后一步減小到0。通過選擇繪圖函數(shù)Distance〔距離和Range能夠觀察到變異的效果。Rastrigin函數(shù)的遺傳算法的運行結果如圖8.43所示。圖8.43壓縮值為1時Rastrigin函數(shù)的距離和范圍圖8.45的上部圖形顯示每一代各點之間的平均距離。當變異數(shù)減小時,個體之間的平均距離也減小,在最后一代大約減小到0。圖8.4

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論