????????以下內(nèi)容大部分來源于《MATLAB智能算法30個(gè)案例分析》,僅為學(xué)習(xí)交流所用。
1理論基礎(chǔ)
1.1遺傳算法概述
????????遺傳算法(genetic algorithm,GA)是一種進(jìn)化算法,其基本原理是仿效生物界中的“物競(jìng)天擇、適者生存”的演化法則。遺傳算法是把問題參數(shù)編碼為染色體,再利用迭代的方式進(jìn)行選擇、交叉以及變異等運(yùn)算來交換種群中染色體的信息,最終生成符合優(yōu)化目標(biāo)的染色體。
????????在遺傳算法中,染色體對(duì)應(yīng)的是數(shù)據(jù)或數(shù)組,通常是由一維的串結(jié)構(gòu)數(shù)據(jù)來表示,串上各個(gè)位置對(duì)應(yīng)基因的取值。基因組成的串就是染色體,或者稱為基因型個(gè)體(individuals)。一定數(shù)量的個(gè)體組成了群體(population)。群體中個(gè)體的數(shù)目稱為群體大小(population size),也稱為群體規(guī)模。而各個(gè)個(gè)體對(duì)環(huán)境的適應(yīng)程度叫做適應(yīng)度(fitness)。
遺傳算法的基本步驟如下:
????????1.編碼
????????GA在進(jìn)行搜索之前先將解空間的解數(shù)據(jù)表示成遺傳空間的基因型串結(jié)構(gòu)數(shù)據(jù),這些串結(jié)構(gòu)數(shù)據(jù)的不同組合便構(gòu)成了不同的點(diǎn)。
????????2.初始群體的生成
????????隨機(jī)產(chǎn)生N個(gè)初始串結(jié)構(gòu)數(shù)據(jù),每個(gè)串結(jié)構(gòu)數(shù)據(jù)稱為一個(gè)個(gè)體,N個(gè)個(gè)體構(gòu)成了一個(gè)群體。GA以這N個(gè)串結(jié)構(gòu)數(shù)據(jù)作為初始點(diǎn)開始進(jìn)化。
????????3.適應(yīng)度評(píng)估
????????適應(yīng)度表明個(gè)體或解的優(yōu)劣性。不同的問題,適應(yīng)性函數(shù)的定義方式也不同。4、選擇
選擇的目的是為了從當(dāng)前群體中選出優(yōu)良的個(gè)體,使它們有機(jī)會(huì)作為父代為下一代繁殖子孫。遺傳算法通過選擇過程體現(xiàn)這一思想,進(jìn)行選擇的原則是適應(yīng)性強(qiáng)的個(gè)體為下一代貢獻(xiàn)一個(gè)或多個(gè)后代的概率大。選擇體現(xiàn)了達(dá)爾文的適者生存原則。
????????5.交叉
????????交叉操作是遺傳算法中最主要的遺傳操作。通過交叉操作可以得到新一代個(gè)體,新個(gè)體組合了其父輩個(gè)體的特性。交叉體現(xiàn)了信息交換的思想。
????????6.變異
????????變異首先在群體中隨機(jī)選擇一個(gè)個(gè)體,對(duì)于選中的個(gè)體以一定的概率隨機(jī)地改變串結(jié)構(gòu)數(shù)據(jù)中某個(gè)串的值。同生物界一樣,GA中變異發(fā)生的概率很低,通常取值很小。
1.2謝菲爾德遺傳算法工具箱
????????1.工具箱簡(jiǎn)介
????????謝菲爾德(Sheffield)遺傳算法工具箱是英國(guó)謝菲爾德大學(xué)開發(fā)的遺傳算法工具箱。該工具箱是用MATLAB高級(jí)語(yǔ)言編寫的,對(duì)問題使用M文件編寫,可以看見算法的源代碼,與此匹配的是先進(jìn)的MATLAB數(shù)據(jù)分析、可視化工具、特殊目的應(yīng)用領(lǐng)域工具箱和展現(xiàn)給使用者具有研究遺傳算法可能性的一致環(huán)境。該工具箱為遺傳算法研究者和初次實(shí)驗(yàn)遺傳算法的用戶提供了廣泛多樣的實(shí)用函數(shù)。
????????2.工具箱添加
????????用戶可以通過網(wǎng)絡(luò)下載gatbx工具箱(官方github下載地址:gatbx)。然后把工具箱添加到本機(jī)的MATLAB環(huán)境中,該工具箱的安裝步驟如下:
????????(1)將工具箱文件夾復(fù)制到本地計(jì)算機(jī)中的工具箱目錄下,路徑為matlabroot\ toolbox。其中matlabroot為 MATLAB的安裝根目錄。
????????(2)將工具箱所在的文件夾添加到MATLAB的搜索路徑中,有兩種方式可以實(shí)現(xiàn),即命令行方式和圖形用戶界面方式。
????????①命令行方式:用戶可以調(diào)用addpath命令來添加,例如:
str = [matlabroot, '\toolbox\gatbx'];
addpath(str)
? ? ? ? ②圖形用戶界面方式:在 MATLAB主窗口上選擇主頁(yè)→設(shè)置路徑菜單項(xiàng),單擊“添加文件夾”按鈕。找到工具箱所在的文件夾( gatbx),單擊“OK”按鈕,則工具箱所在的文件夾出現(xiàn)在“設(shè)置路徑”的最上端。單擊“保存”按鈕保存搜索路徑的設(shè)置,然后單擊“關(guān)閉”按鈕關(guān)閉對(duì)話框。
????????(3)批量修改后綴
????????該工具箱文件后綴為M,即*.M,matlab是區(qū)分大小寫的,如果這一步?jīng)]有操作,將會(huì)報(bào)錯(cuò),在該文件路徑下,新建txt,輸入以下命令,并保存修改文件后綴為bat,點(diǎn)擊運(yùn)行:
ren *.M *.m
????????如果文件夾中.M后綴的文件并未修改為.m的后綴,可以通過一個(gè)中間后綴名進(jìn)行修改,先將其后綴名轉(zhuǎn)為.txt,再轉(zhuǎn)為.m,也就是先輸入下面的命令,并保存修改文件后綴為bat,點(diǎn)擊運(yùn)行:
ren *.M *.txt
? ? ? ? 所有.M后綴的文件都修改為了.txt后綴,然后再輸入下面的命令并保存修改文件后綴為bat,點(diǎn)擊運(yùn)行:
ren *.txt *.m
????????這樣就把所有文件的后綴名都改成了.m文件。如果還是不行的話。。。。。就一個(gè)一個(gè)手動(dòng)改吧。
2案例背景
2.1問題描述
????????1.簡(jiǎn)單一元函數(shù)優(yōu)化
????????利用遺傳算法尋找以下函數(shù)的最小值:
?????????2.多元函數(shù)優(yōu)化
????????利用遺傳算法尋找以下函數(shù)的最大值:
2.2解題思路及步驟
????????將自變量在給定范圍內(nèi)進(jìn)行編碼,得到種群編碼,按照所選擇的適應(yīng)度函數(shù)并通過遺傳算法中的選擇,交叉和變異對(duì)個(gè)體進(jìn)行篩選和進(jìn)化,使適應(yīng)度值大的個(gè)體被保留,小的個(gè)體被淘汰,新的群體繼承了上一代的信息,又優(yōu)于上一代,這樣反復(fù)循環(huán),直至滿足條件,最后留下來的個(gè)體集中分布在最優(yōu)解周圍,篩選出其中最優(yōu)的個(gè)體作為問題的解。
3 MATLAB程序?qū)崿F(xiàn)
????????下面詳細(xì)介紹各部分常用的函數(shù),其他的函數(shù)用戶可以直接參考工具箱中的GATBXA2.PDF文檔,其中有詳細(xì)的用法介紹。
3.1 工具箱結(jié)構(gòu)
????????遺傳算法工具箱中的主要函數(shù)如表1所列。
表1 遺傳算法工具箱的主要函數(shù)列表
?
?3.2遺傳算法常用函數(shù)
????????1.創(chuàng)建種群函數(shù)——crtbp功能:創(chuàng)建任意離散隨機(jī)種群。調(diào)用格式:
% 調(diào)用格式1
[Chrom,Lind,Basev]= crtbp(Nind,Lind)
% 調(diào)用格式2
[Chrom,Lind,Basev]= crtbp(Nind,Base)
% 調(diào)用格式3
[Chrom,Lind,Base]= crtbp(Nind,Lind,Base)
????????格式①創(chuàng)建一個(gè)大小為Nind×Lind 的隨機(jī)二進(jìn)制矩陣,其中,Nind 為種群個(gè)體數(shù),Lind為個(gè)體長(zhǎng)度。返回種群編碼Chrom和染色體基因位的基本字符向量 BaseV。
????????格式②創(chuàng)建一個(gè)種群個(gè)體為Nind,個(gè)體的每位編碼的進(jìn)制數(shù)由Base 決定(Base 的列數(shù)即為個(gè)體長(zhǎng)度)。
????????格式③創(chuàng)建一個(gè)大小為Nind×Lind 的隨機(jī)矩陣,個(gè)體的各位的進(jìn)制數(shù)由Base決定﹐這時(shí)輸入?yún)?shù)Lind可省略(Base 的列數(shù)即為L(zhǎng)ind),即為格式②。
????????【用法舉例】使用函數(shù)crtbp創(chuàng)建任意離散隨機(jī)種群的應(yīng)用舉例。
????????(1)創(chuàng)建一個(gè)種群大小為5,個(gè)體長(zhǎng)度為10的二進(jìn)制隨機(jī)種群:
[Chrom,Lind,BaseV] = crtbp(5,10)
或者
[Chrom,Lind,BaseV] = crtbp(5,10,[2 2 2 2 2 2 2 2 2 2])
或者
[Chrom,Lind,BaseV] = crtbp(5,[2 2 2 2 2 2 2 2 2 2])
輸出結(jié)果為:
????????2.適應(yīng)度計(jì)算函數(shù)一—ranking功能:基于排序的適應(yīng)度分配。調(diào)用格式:
% 調(diào)用格式1
Fitnv = ranking(Objv)
% 調(diào)用格式2
Eitnv = ranking(Objv,RFun)
% 調(diào)用格式3
Fitnv = ranking(Objv,RFun,SUBPOP)
????????格式①是按照個(gè)體的目標(biāo)值ObjV(列向量)由小到大的順序?qū)€(gè)體進(jìn)行排序的,并返回個(gè)體適應(yīng)度值FitnV的列向量。
????????格式②中RFun有三種情況: .
????????(1)若RFun是一個(gè)在[1,2]區(qū)間內(nèi)的標(biāo)量,則采用線性排序,這個(gè)標(biāo)量指定選擇的壓差。
????????(2)若RFun是一個(gè)具有兩個(gè)參數(shù)的向量,則RFun(2):指定排序方法,0為線性排序,1為非線性排序。RFun(1);對(duì)線性排序﹐標(biāo)量指定的選擇壓差RFun(1)必須在[1,2]區(qū)間;對(duì)非線性排序,RFun(1)必須在[1, length(ObjV)一2]區(qū)間;如果為NAN,則 RFun(1)假設(shè)為2。
????????(3)若RFun是長(zhǎng)度為length(ObjV)的向量,則它包含對(duì)每一行的適應(yīng)度值計(jì)算。格式③中的參數(shù)ObjV和RFun與格式①和格式②一致,參數(shù)SUBPOP是一個(gè)任選參數(shù),指明在-ObjV中子種群的數(shù)量。省略SUBPOP或SUBPOP為NAN,則 SUBPOP=1。在ObjV中的所有子種群大小必須相同。如果ranking被調(diào)用于多子種群,則ranking 獨(dú)立地對(duì)每個(gè)子種群執(zhí)行。
????????【用法舉例】考慮具有10個(gè)個(gè)體的種群,其當(dāng)前目標(biāo)值如下:
ObjV = [1;2;3;4;5;10;9;8;7;6]
????????(1)使用線性排序和壓差為⒉估算適應(yīng)度:
Fitnv= ranking(ObjV)
% 或者
Fitnv= ranking(ObjV,[2,0])
% 或者
Fitnv= ranking(ObjV,[2,0],1)
????????運(yùn)行結(jié)果如下:
????????(2〉使用RFun中的值估算適應(yīng)度:
RFun = [3;5;7;10;14;18;25;30;40;50];
Fitnv = ranking(Objv, RFun)
運(yùn)行結(jié)果:
????????(3〉使用非線性排序,選擇壓差為2,在ObjV中有兩個(gè)子種群估算適應(yīng)度:
?
FitnV =ranking(ObjV,[2,1],2)
?運(yùn)行結(jié)果:
????????3.選擇函數(shù)——select 功能:從種群中選個(gè)體(高級(jí)函數(shù))。 調(diào)用格式:
selCh = select(SEL_F,Chrom,Fitnv)
selCh = select(SEL_r,Chrom,Eitnv,GGAP)
selCh = select(SRL_F,Chrom,Fitnv,GGAP,SUBPOP)
????????SEL_F是一個(gè)字符串,包含一個(gè)低級(jí)選擇函數(shù)名,如 rws 或 sus;
????????FitnV是列向量,包舍種群 Chrom中個(gè)體的適應(yīng)度值。這個(gè)適應(yīng)度值表明了每個(gè)個(gè)體被 選擇的預(yù)期概率。
????????GGAP是可選參數(shù),指出了代溝部分種群被復(fù)制。如果GGAP省略或?yàn)镹AN,則GAP 假設(shè)為1.0。
????????SUBPOP是一個(gè)可選參數(shù),決定 Chrom 中子種群的數(shù)量。如果 SUBPOP 省略或?yàn)?NAN,則 sUBPOP=1。Chrom 中所有子種群必須有相同的大小。
????????【用法舉例】考慮以下具有8個(gè)個(gè)體的種群Chrom,適應(yīng)度值為FitnV:?
Chrom = [1 11 21;2 12 22;3 13 23;4 14 24;5 15 25;6 16 26;7 17 27;8 18 28]
FitnV = [1.50;1.35;1.21;1.07;0.92;0.78;0.64;0.5]
使用隨機(jī)遍歷抽樣 sus 選擇8個(gè)個(gè)體
selch = select('sus',Chrom,FitnV)
運(yùn)行結(jié)果為:
?????????4.交叉算子函數(shù)——recombin功能:重組個(gè)體(高級(jí)函數(shù))。調(diào)用格式:
NewChrom = recombin(REC_r,Chrom)
NewChrom = recombin(REC_F,Chrom,Recopt)
NewChrom = recombin(REC_F,Chrom,RecOpt,SUBPOP)
????????recombin完成種群Chrom中個(gè)體的重組,在新種群NewChrom中返回重組后的個(gè)體。Chrom和NewChrom中的一行對(duì)應(yīng)一個(gè)個(gè)體。
????????REC_F是一個(gè)包含低級(jí)重組函數(shù)名的字符串,例如recdis或xovsp.
????????RecOpt是一個(gè)指明交叉概率的任選參數(shù),如省略或?yàn)镹AN,將設(shè)為缺省值。
????????SUBPOP是一個(gè)決定Chrom中子群個(gè)數(shù)的可選參數(shù),如果省略或?yàn)镹AN,則 SUBPOP為1。Chrom中的所有子種群必須有相同的大小。
????????【用法舉例】使用函數(shù)recombin對(duì)5個(gè)個(gè)體的種群進(jìn)行重組。
Chrom = crtbp(5,10)
NewChrom = recombin('xovsp',Chrom)
?????????5.變異算子函數(shù)——mut功能:離散變異算子。
????????調(diào)用格式:
NewChrom = mut(O1dChrom,Pm,Basev)
OldChrom為當(dāng)前種群,Pm為變異概率(省略時(shí)為0.7/Lind),BaseV指明染色體個(gè)體元素的變異的基本字符(省略時(shí)種群為二進(jìn)制編碼)。
????????【用法舉例】使用函數(shù)mut將當(dāng)前種群變異為新種群。
????????(1)種群為二進(jìn)制編碼:
oldChrom = crtbp(5,10)
NewChrom = mut(oldChrom)
?????????(2)種群為非二進(jìn)制編碼,創(chuàng)建一個(gè)長(zhǎng)度為8、有6個(gè)個(gè)體的隨機(jī)種群;
BaseV = [8 8 8 4 4 4 4 4];
[Chrom, Lind,BaseV] = crtbp(6,BaseV);
Chrom
NewChrom = mut(Chrom,0.7,BaseV)
?????????6.重插入函數(shù)———reins功能:重插入子代到種群。調(diào)用格式:
Chrom = reins(Chrom,SelCh)
Chrom = reins(Chrom,Se1Ch,SUBPOP)
Chrom = reins(Chrom,SelCh,SUBPOP, InsOpt,0bjvCh)
[Chrom,0bjVCh]= reins(Chrom,SelCh,SUBPOP,Ins0pt,0bjvCh,0bjvSel)
????????reins完成插人子代到當(dāng)前種群,用子代代替父代并返回結(jié)果種群。Chrom為父代種群,SelCh為子代,每一行對(duì)應(yīng)一個(gè)個(gè)體。
????????SUBPOP是一個(gè)可選參數(shù),指明Chrom和 SelCh中子種群的個(gè)數(shù)。如果省略或者為NAN,則假設(shè)為1。在Chrom和SelCh中每個(gè)子種群必須具有相同大小。
????????InsOpt是一個(gè)最多有兩個(gè)參數(shù)的任選向量。
????????InsOpt(1)是一個(gè)標(biāo)量,指明用子代代替父代的方法。0為均勻選擇,子代代替父代使用均勻隨機(jī)選擇。1為基于適應(yīng)度的選擇,子代代替父代中適應(yīng)度最小的個(gè)體。如果省略InsOpt(1)或InsOpt(1)為NAN,則假設(shè)為0。
????????InsOpt(2)是一個(gè)在[o,1]區(qū)間的標(biāo)量,表示每個(gè)子種群中重插入的子代個(gè)體在整個(gè)子種群中個(gè)體的比率。如果InsOpt(2)省略或?yàn)镹AN,則假設(shè)InsOpt(2)=1.0。
????????ObjVCh是一個(gè)可選列向量,包括Chrom中個(gè)體的目標(biāo)值。對(duì)基于適應(yīng)度的重插入,ObjVCh是必需的。
????????ObjVSel是一個(gè)可選參數(shù),包含SelCh中個(gè)體的目標(biāo)值。如果子代的數(shù)量大于重插入種群中的子代數(shù)量﹐則ObjVSel是必需的。這種情況子代將按它們的適應(yīng)度大小選擇插人。
????????【用法舉例】在5個(gè)個(gè)體的父代種群中插入子代種群。
Chrom = crtbp(5,10) % 父代
selch = crtbp(2,10) % 子代
Chrom = reins(Chrom,selch) % 重插入
????????7.實(shí)用函數(shù)——bs2rv
????????功能:二進(jìn)制到十進(jìn)制的轉(zhuǎn)換。調(diào)用格式:
Phen = bs2rv(Chrom,FieldD)
????????bs2rv根據(jù)譯碼矩陣FieldD將二進(jìn)制串矩陣Chrom 轉(zhuǎn)換為實(shí)值向量,返回十進(jìn)制的矩陣。
????????矩陣FieldD有如下結(jié)構(gòu):
????????這個(gè)矩陣的組成如下:
????????len是包含在Chrom中的每個(gè)子串的長(zhǎng)度,注意sum(len)=size(Chrom,2)。lb和ub分別是每個(gè)變量的下界和上界。
????????code指明子串是怎樣編碼的,1為標(biāo)準(zhǔn)的二進(jìn)制編碼,0為格雷編碼。scale指明每個(gè)子串所使用的刻度,0表示算術(shù)刻度,1表示對(duì)數(shù)刻度。
????????lbin和 ubin指明表示范圍中是否包含邊界。0表示不包含邊界,1表示包含邊界。
????????【用法舉例】先使用crtbp創(chuàng)建二進(jìn)制種群Chrom,表示在[一1,10]區(qū)間的一組簡(jiǎn)單變量,然后使用bs2rv將二進(jìn)制串轉(zhuǎn)換為實(shí)值表現(xiàn)型。
Chrom = crtbp(4,8) % 創(chuàng)建二進(jìn)制串
FieldD = [size(Chrom,2);-1;10;1;0;1;1] % 包含邊界
Phen = bs2rv(Chrom,FieldD) % 轉(zhuǎn)換二進(jìn)制到10進(jìn)制
????????8.實(shí)用函數(shù)—-rep功能:矩陣復(fù)制。
????????調(diào)用格式: Matout = rep(MatIn,REPN)
????????函數(shù)rep完成矩陣MatIn的復(fù)制,REPN指明復(fù)制次數(shù),返回復(fù)制后的矩陣 MatOut。REPN包含每個(gè)方向復(fù)制的次數(shù),REPN(1)表示縱向復(fù)制次數(shù),REPN(2)表示水平方向復(fù)制次數(shù)。
????????【用法舉例】使用函數(shù)rep 復(fù)制矩陣MatIn。
MatIn = [1 2 3 4;5 6 7 8]
MatOut = rep(MatIn,[1,2])
?
3.3遺傳算法工具箱應(yīng)用舉例
????????本節(jié)通過一些具體的例子來介紹遺傳算法工具箱函數(shù)的使用。
1.簡(jiǎn)單一元函數(shù)優(yōu)化
????????利用遺傳算法計(jì)算以下函數(shù)的最小值:
?????????選擇二進(jìn)制編碼,遺傳算法參數(shù)設(shè)置如表2所列。
表2 遺傳算法參數(shù)
?????????遺傳算法優(yōu)化程序代碼:
clc
clear all
close all
%% 畫出函數(shù)圖
figure(1);
hold on;
lb=1;ub=2; %函數(shù)自變量范圍【1,2】
ezplot('sin(10*pi*X)/X',[lb,ub]); %畫出函數(shù)曲線
xlabel('自變量/X')
ylabel('函數(shù)值/Y')
%% 定義遺傳算法參數(shù)
NIND=40; %個(gè)體數(shù)目
MAXGEN=20; %最大遺傳代數(shù)
PRECI=20; %變量的二進(jìn)制位數(shù)
GGAP=0.95; %代溝
px=0.7; %交叉概率
pm=0.01; %變異概率
trace=zeros(2,MAXGEN); %尋優(yōu)結(jié)果的初始值
FieldD=[PRECI;lb;ub;1;0;1;1]; %區(qū)域描述器
Chrom=crtbp(NIND,PRECI); %初始種群
%% 優(yōu)化
gen=0; %代計(jì)數(shù)器
X=bs2rv(Chrom,FieldD); %計(jì)算初始種群的十進(jìn)制轉(zhuǎn)換
ObjV=sin(10*pi*X)./X; %計(jì)算目標(biāo)函數(shù)值
while gen<MAXGEN
FitnV=ranking(ObjV); %分配適應(yīng)度值
SelCh=select('sus',Chrom,FitnV,GGAP); %選擇
SelCh=recombin('xovsp',SelCh,px); %重組
SelCh=mut(SelCh,pm); %變異
X=bs2rv(SelCh,FieldD); %子代個(gè)體的十進(jìn)制轉(zhuǎn)換
ObjVSel=sin(10*pi*X)./X; %計(jì)算子代的目標(biāo)函數(shù)值
[Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入子代到父代,得到新種群
X=bs2rv(Chrom,FieldD);
gen=gen+1; %代計(jì)數(shù)器增加
%獲取每代的最優(yōu)解及其序號(hào),Y為最優(yōu)解,I為個(gè)體的序號(hào)
[Y,I]=min(ObjV);
trace(1,gen)=X(I); %記下每代的最優(yōu)值
trace(2,gen)=Y; %記下每代的最優(yōu)值
end
plot(trace(1,:),trace(2,:),'bo'); %畫出每代的最優(yōu)點(diǎn)
grid on;
plot(X,ObjV,'b*'); %畫出最后一代的種群
hold off
%% 畫進(jìn)化圖
figure(2);
plot(1:MAXGEN,trace(2,:));
grid on
xlabel('遺傳代數(shù)')
ylabel('解的變化')
title('進(jìn)化過程')
bestY=trace(2,end);
bestX=trace(1,end);
fprintf(['最優(yōu)解:\nX=',num2str(bestX),'\nY=',num2str(bestY),'\n'])
運(yùn)行結(jié)果:
?
????????2.多元函數(shù)優(yōu)化
????????利用遺傳算法計(jì)算以下函數(shù)的最大值:
????????選擇二進(jìn)制編碼,遺傳算法參數(shù)設(shè)置如表3所列。
表3 遺傳算法參數(shù)
????????遺傳算法優(yōu)化程序代碼:
clc
clear all
close all
%% 畫出函數(shù)圖
figure(1);
lbx=-2;ubx=2; %函數(shù)自變量x范圍【-2,2】
lby=-2;uby=2; %函數(shù)自變量y范圍【-2,2】
ezmesh('y*sin(2*pi*x)+x*cos(2*pi*y)',[lbx,ubx,lby,uby],50); %畫出函數(shù)曲線
hold on;
%% 定義遺傳算法參數(shù)
NIND=40; %個(gè)體數(shù)目
MAXGEN=50; %最大遺傳代數(shù)
PRECI=20; %變量的二進(jìn)制位數(shù)
GGAP=0.95; %代溝
px=0.7; %交叉概率
pm=0.01; %變異概率
trace=zeros(3,MAXGEN); %尋優(yōu)結(jié)果的初始值
FieldD=[PRECI PRECI;lbx lby;ubx uby;1 1;0 0;1 1;1 1]; %區(qū)域描述器
Chrom=crtbp(NIND,PRECI*2); %初始種群
%% 優(yōu)化
gen=0; %代計(jì)數(shù)器
XY=bs2rv(Chrom,FieldD); %計(jì)算初始種群的十進(jìn)制轉(zhuǎn)換
X=XY(:,1);Y=XY(:,2);
ObjV=Y.*sin(2*pi*X)+X.*cos(2*pi*Y); %計(jì)算目標(biāo)函數(shù)值
while gen<MAXGEN
FitnV=ranking(-ObjV); %分配適應(yīng)度值
SelCh=select('sus',Chrom,FitnV,GGAP); %選擇
SelCh=recombin('xovsp',SelCh,px); %重組
SelCh=mut(SelCh,pm); %變異
XY=bs2rv(SelCh,FieldD); %子代個(gè)體的十進(jìn)制轉(zhuǎn)換
X=XY(:,1);Y=XY(:,2);
ObjVSel=Y.*sin(2*pi*X)+X.*cos(2*pi*Y); %計(jì)算子代的目標(biāo)函數(shù)值
[Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入子代到父代,得到新種群
XY=bs2rv(Chrom,FieldD);
gen=gen+1; %代計(jì)數(shù)器增加
%獲取每代的最優(yōu)解及其序號(hào),Y為最優(yōu)解,I為個(gè)體的序號(hào)
[Y,I]=max(ObjV);
trace(1:2,gen)=XY(I,:); %記下每代的最優(yōu)值
trace(3,gen)=Y; %記下每代的最優(yōu)值
end
plot3(trace(1,:),trace(2,:),trace(3,:),'bo'); %畫出每代的最優(yōu)點(diǎn)
grid on;
plot3(XY(:,1),XY(:,2),ObjV,'bo'); %畫出最后一代的種群
hold off
%% 畫進(jìn)化圖
figure(2);
plot(1:MAXGEN,trace(3,:));
grid on
xlabel('遺傳代數(shù)')
ylabel('解的變化')
title('進(jìn)化過程')
bestZ=trace(3,end);
bestX=trace(1,end);
bestY=trace(2,end);
fprintf(['最優(yōu)解:\nX=',num2str(bestX),'\nY=',num2str(bestY),'\nZ=',num2str(bestZ),'\n'])
運(yùn)行結(jié)果:
?文章來源:http://www.zghlxwxcb.cn/news/detail-465786.html
?4.總結(jié)
????????遺傳算法工具箱提供了一種求解非線性、多模型、多目標(biāo)等復(fù)雜系統(tǒng)優(yōu)化問題的通用框架,它不依賴問題的具體領(lǐng)域,對(duì)問題的種類具有很強(qiáng)的魯棒性,所以它廣泛應(yīng)用于各個(gè)科學(xué)領(lǐng)域。遺傳算法在函數(shù)優(yōu)化、組合優(yōu)化、生產(chǎn)調(diào)度、自動(dòng)控制﹑機(jī)器人學(xué)﹑圖像處理、人工生命、遺傳編碼和機(jī)器學(xué)習(xí)等方面得到了廣泛運(yùn)用。文章來源地址http://www.zghlxwxcb.cn/news/detail-465786.html
到了這里,關(guān)于(轉(zhuǎn)載)matlab遺傳算法工具箱的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!