最近研究了一下遺傳算法,因?yàn)橐眠z傳算法來(lái)求解多元非線性模型。還好用遺傳算法的工具
箱予以實(shí)現(xiàn)了,期間也遇到了許多問(wèn)題。借此與大家分享一下。
首先,我們要熟悉遺傳算法的基本原理與運(yùn)算流程。
基本原理:遺傳算法是一種典型的啟發(fā)式算法,屬于非數(shù)值算法范疇。它是模擬達(dá)爾文的自然
選擇學(xué)說(shuō)和自然界的生物進(jìn)化過(guò)程的一種計(jì)算模型。它是采用簡(jiǎn)單的編碼技術(shù)來(lái)表示各種復(fù)雜
的結(jié)構(gòu),并通過(guò)對(duì)一組編碼表示進(jìn)行簡(jiǎn)單的遺傳操作和優(yōu)勝劣汰的自然選擇來(lái)指導(dǎo)學(xué)習(xí)和確定
搜索的方向。遺傳算法的操作對(duì)象是一群二進(jìn)制串(稱(chēng)為染色體、個(gè)體),即種群,每一個(gè)染
色體都對(duì)應(yīng)問(wèn)題的一個(gè)解。從初始種群出發(fā),采用基于適應(yīng)度函數(shù)的選擇策略在當(dāng)前種群中選
擇個(gè)體,使用雜交和變異來(lái)產(chǎn)生下一代種群。如此模仿生命的進(jìn)化進(jìn)行不斷演化,直到滿(mǎn)足期
望的終止條件。
運(yùn)算流程:
Step 1:對(duì)遺傳算法的運(yùn)行參數(shù)進(jìn)行賦值。參數(shù)包括種群規(guī)模、變量個(gè)數(shù)、交叉概率、變異概
率以及遺傳運(yùn)算的終止進(jìn)化代數(shù)。
Step 2:建立區(qū)域描述器。根據(jù)軌道交通與常規(guī)公交運(yùn)營(yíng)協(xié)調(diào)模型的求解變量的約束條件,設(shè)
置變量的取值范圍。
Step 3:在Step 2的變量取值范圍內(nèi),隨機(jī)產(chǎn)生初始群體,代入適應(yīng)度函數(shù)計(jì)算其適應(yīng)度值。
Step 4:執(zhí)行比例選擇算子進(jìn)行選擇操作。
Step 5:按交叉概率對(duì)交叉算子執(zhí)行交叉操作。
Step 6:按變異概率執(zhí)行離散變異操作。
Step 7:計(jì)算Step 6得到局部最優(yōu)解中每個(gè)個(gè)體的適應(yīng)值,并執(zhí)行最優(yōu)個(gè)體保存策略。
Step 8:判斷是否滿(mǎn)足遺傳運(yùn)算的終止進(jìn)化代數(shù),不滿(mǎn)足則返回Step 4,滿(mǎn)足則輸出運(yùn)算結(jié)果
。
其次,運(yùn)用遺傳算法工具箱。
運(yùn)用基于Matlab的遺傳算法工具箱非常方便,遺傳算法工具箱里包括了我們需要的各種函數(shù)庫(kù)
。目前,基于Matlab的遺傳算法工具箱也很多,比較流行的有英國(guó)設(shè)菲爾德大學(xué)開(kāi)發(fā)的遺傳算
法工具箱GATBX、GAOT以及Math Works公司推出的GADS。實(shí)際上,GADS就是大家所看到的
Matlab中自帶的工具箱。我在網(wǎng)上看到有問(wèn)為什么遺傳算法函數(shù)不能調(diào)用的問(wèn)題,其實(shí),主要
就是因?yàn)橛玫墓ぞ呦洳煌?。因?yàn)?,有些人用的是GATBX帶有的函數(shù),但MATLAB自帶的遺傳算法
工具箱是GADS,GADS當(dāng)然沒(méi)有GATBX里的函數(shù),因此運(yùn)行程序時(shí)會(huì)報(bào)錯(cuò),當(dāng)你用MATLAB來(lái)編寫(xiě)
遺傳算法代碼時(shí),要根據(jù)你所安裝的工具箱來(lái)編寫(xiě)代碼。
以GATBX為例,運(yùn)用GATBX時(shí),要將GATBX解壓到Matlab下的toolbox文件夾里,同時(shí),set path
將GATBX文件夾加入到路徑當(dāng)中。
最后,編寫(xiě)Matlab運(yùn)行遺傳算法的代碼。
這塊內(nèi)容主要包括兩方面工作:1、將模型用程序?qū)懗鰜?lái)(.M文件),即目標(biāo)函數(shù),若目標(biāo)函
數(shù)非負(fù),即可直接將目標(biāo)函數(shù)作為適應(yīng)度函數(shù)。2、設(shè)置遺傳算法的運(yùn)行參數(shù)。包括:種群規(guī)
模、變量個(gè)數(shù)、區(qū)域描述器、交叉概率、變異概率以及遺傳運(yùn)算的終止進(jìn)化代數(shù)等等。
為方便大家理解,以下為例:
求解模型:TC=x1+2*x2+3*x3+4*x4,-1<=x<=0
根據(jù)上面的求解模型,可以寫(xiě)出模型的.M文件如下,即適應(yīng)度函數(shù)
function TC=TotalCost(x)
TC=0;
for i=1:4
TC=TC+i*x(i);
end
然后,可以利用遺傳算法工具箱來(lái)寫(xiě)出遺傳算法運(yùn)行的主要程序,如下:
%定義遺傳算法參數(shù)
NIND=20;%個(gè)體數(shù)目
MAXGEN=200;%最大遺傳代數(shù)
NVAR=4;%變量維數(shù)
PRECI=20;%變量的二進(jìn)制位數(shù)
GGAP=0.9;%代溝
trace=zeros(MAXGEN,2);%算法性能跟蹤
%建立區(qū)域描述器
FieldD=[rep(PRECI,[1,NVAR]);rep([-1;0],[1,NVAR]);rep([1;0;1;1],[1,NVAR])];
Chrom=crtbp(NIND,NVAR*PRECI);%創(chuàng)建初始種群
gen=0;%代計(jì)數(shù)器
ObjV=TotalCost(bs2rv(Chrom,FieldD));%計(jì)算初始種群個(gè)體的目
標(biāo)函數(shù)值
while gen
FitnV=ranking(ObjV);%分配適應(yīng)度值
SelCh=select('sus',Chrom,FitnV,GGAP);%選擇
SelCh=recombin('xovsp',SelCh,0.7);%重組
SelCh=mut(SelCh,0.07);%變異
ObjVSel=TotalCost(bs2rv(SelCh,FieldD));%計(jì)算子代目標(biāo)函數(shù)值
[ChromObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel);%重插入
gen=gen+1;
%輸出最優(yōu)解及其對(duì)應(yīng)的10個(gè)變量的十進(jìn)制值
[Y,I]=min(ObjVSel);
Y,X=bs2rv(Chrom(I,:),FieldD);
trace(gen,1)=min(ObjV);
trace(gen,2)=sum(ObjV)/length(ObjV);
end
plot(trace(:,1));hold on;
plot(trace(:,2),'-.');grid;
legend('種群均值的變換','最優(yōu)解的變化');
顯然,根據(jù)模型的特征,最優(yōu)解應(yīng)該是-10,自變量分別取-1,-1,-1,-1。大家可以安裝
GATBX,在Matlab中建立目標(biāo)函數(shù)的.M文件以及遺傳算法主程序的文件來(lái)進(jìn)行試驗(yàn)。
希望以上內(nèi)容對(duì)學(xué)習(xí)和運(yùn)用遺傳算法的同仁有所幫助,因?yàn)楸救艘彩浅鯇W(xué),因此有不詳之處請(qǐng)
見(jiàn)諒。
////////////////////////////////////////////////////
matlab遺傳算法工具箱函數(shù)及實(shí)例講解(轉(zhuǎn)引)
gaotv5
核心函數(shù):
(1)function[pop]=initializega(num,bounds,eevalFN,eevalOps,options)--初始種群的生
成函數(shù)
【輸出參數(shù)】
pop--生成的初始種群
【輸入?yún)?shù)】
num--種群中的個(gè)體數(shù)目
bounds--代表變量的上下界的矩陣
eevalFN--適應(yīng)度函數(shù)
eevalOps--傳遞給適應(yīng)度函數(shù)的參數(shù)
options--選擇編碼形式(浮點(diǎn)編碼或是二進(jìn)制編碼)[precisionF_or_B],如
precision--變量進(jìn)行二進(jìn)制編碼時(shí)指定的精度
F_or_B--為1時(shí)選擇浮點(diǎn)編碼,否則為二進(jìn)制編碼,由precision指定精度)
(2)function [x,endPop,bPop,traceInfo] =ga(bounds,evalFN,evalOps,startPop,opts,...
termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps)--遺傳
算法函數(shù)
【輸出參數(shù)】
x--求得的最優(yōu)解
endPop--最終得到的種群
bPop--最優(yōu)種群的一個(gè)搜索軌跡
【輸入?yún)?shù)】
bounds--代表變量上下界的矩陣
evalFN--適應(yīng)度函數(shù)
evalOps--傳遞給適應(yīng)度函數(shù)的參數(shù)
startPop-初始種群
opts[epsilonprob_ops display]--opts(1:2)等同于initializega的options參數(shù),第三
個(gè)參數(shù)控制是否輸出,一般為0。如[1e-6 1 0]
termFN--終止函數(shù)的名稱(chēng),如['maxGenTerm']
termOps--傳遞個(gè)終止函數(shù)的參數(shù),如[100]
selectFN--選擇函數(shù)的名稱(chēng),如['normGeomSelect']
selectOps--傳遞個(gè)選擇函數(shù)的參數(shù),如[0.08]
xOverFNs--交叉函數(shù)名稱(chēng)表,以空格分開(kāi),如['arithXover heuristicXover
simpleXover']
xOverOps--傳遞給交叉函數(shù)的參數(shù)表,如[2 0;2 3;2 0]
mutFNs--變異函數(shù)表,如['boundaryMutation multiNonUnifMutationnonUnifMutation
unifMutation']
mutOps--傳遞給交叉函數(shù)的參數(shù)表,如[4 0 0;6 100 3;4 100 3;4 0 0]
注意】matlab工具箱函數(shù)必須放在工作目錄下
【問(wèn)題】求f(x)=x+10*sin(5x)+7*cos(4x)的最大值,其中0<=x<=9
【分析】選擇二進(jìn)制編碼,種群中的個(gè)體數(shù)目為10,二進(jìn)制編碼長(zhǎng)度為20,交叉概率為0.95,
變異概率為0.08
【程序清單】
%編寫(xiě)目標(biāo)函數(shù)
function[sol,eval]=fitness(sol,options)
x=sol(1);
eval=x+10*sin(5*x)+7*cos(4*x);
%把上述函數(shù)存儲(chǔ)為fitness.m文件并放在工作目錄下
initPop=initializega(10,[09],'fitness');%生成初始種群,大小為10
[x endPop,bPop,trace]=ga([09],'fitness',[],initPop,[1e-6 1
1],'maxGenTerm',25,'normGeomSelect',...
[0.08],['arithXover'],[2],'nonUnifMutation',[2 25 3]) %次遺傳迭代
運(yùn)算借過(guò)為:x =
7.856224.8553(當(dāng)x為7.8562時(shí),f(x)取最大值24.8553)
注:遺傳算法一般用來(lái)取得近似最優(yōu)解,而不是最優(yōu)解。
遺傳算法實(shí)例2
【問(wèn)題】在-5<=Xi<=5,i=1,2區(qū)間內(nèi),求解
f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(x1.^2+x2.^2)))-exp(0.5*(cos(2*pi*x1)+cos
(2*pi*x2)))+22.71282的最小值。
【分析】種群大小10,最大代數(shù)1000,變異率0.1,交叉率0.3
【程序清單】
%源函數(shù)的matlab代碼
function [eval]=f(sol)
numv=size(sol,2);
x=sol(1:numv);
eval=-20*exp(-0.2*sqrt(sum(x.^2)/numv)))-exp(sum(cos(2*pi*x))/numv)
+22.71282;
%適應(yīng)度函數(shù)的matlab代碼
function[sol,eval]=fitness(sol,options)
numv=size(sol,2)-1;
x=sol(1:numv);
eval=f(x);
eval=-eval;
%遺傳算法的matlab代碼
bounds=ones(2,1)*[-5 5];
[p,endPop,bestSols,trace]=ga(bounds,'fitness')
注:前兩個(gè)文件存儲(chǔ)為m文件并放在工作目錄下,運(yùn)行結(jié)果為
p=
0.0000 -0.0000 0.0055
大家可以直接繪出f(x)的圖形來(lái)大概看看f(x)的最值是多少,也可是使用優(yōu)化函數(shù)來(lái)驗(yàn)證。
matlab命令行執(zhí)行命令:
fplot('x+10*sin(5*x)+7*cos(4*x)',[0,9])
evalops是傳遞給適應(yīng)度函數(shù)的參數(shù),opts是二進(jìn)制編碼的精度,termops是選擇maxGenTerm結(jié)
束函數(shù)時(shí)傳遞個(gè)maxGenTerm的參數(shù),即遺傳代數(shù)。xoverops是傳遞給交叉函數(shù)的參數(shù)。mutops
是傳遞給變異函數(shù)的參數(shù)。
愛(ài)華網(wǎng)本文地址 » http://www.klfzs.com/a/25101011/67455.html
愛(ài)華網(wǎng)



