最近在搞遺傳演算法(ga)方面的東西,matlab 7.0.4中對原來的ga toolbox做了較大改進,第一印象就是速度比原來快了不少。但是對於如何改變其中的ga編碼方法我仍然找不到太好的方法。在薛定宇老師的matlab大觀園中找到了the ge***ic algorithm optimization toolbox (gaot) for matlab 5
,這是乙個相當好的遺傳演算法工具箱,有興趣的話可以到該**上去看看。
附:matlab遺傳演算法工具箱函式及例項講解
gaotv5
核心函式:
(1)function [pop]=initializega(num,bounds,eevalfn,eevalops,options)--初始種群的生成函式
【輸出引數】
pop--生成的初始種群
【輸入引數】
num--種群中的個體數目
bounds--代表變數的上下界的矩陣
eevalfn--適應度函式
eevalops--傳遞給適應度函式的引數
options--選擇編碼形式(浮點編碼或是二進位制編碼)[precision f_or_b],如
precision--變數進行二進位制編碼時指定的精度
f_or_b--為1時選擇浮點編碼,否則為二進位制編碼,由precision指定精度)
(2)function [x,endpop,bpop,traceinfo] = ga(bounds,evalfn,evalops,startpop,opts,...
termfn,termops,selectfn,selectops,xoverfns,xoverops,mutfns,mutops)--遺傳演算法函式
【輸出引數】
x--求得的最優解
endpop--最終得到的種群
bpop--最優種群的乙個搜尋軌跡
【輸入引數】
bounds--代表變數上下界的矩陣
evalfn--適應度函式
evalops--傳遞給適應度函式的引數
startpop-初始種群
opts[epsilon prob_ops display]--opts(1:2)等同於initializega的options引數,第三個引數控制是否輸出,一般為0。如[1e-6 1 0]
termfn--終止函式的名稱,如['maxgenterm']
termops--傳遞個終止函式的引數,如[100]
selectfn--選擇函式的名稱,如['normgeomselect']
selectops--傳遞個選擇函式的引數,如[0.08]
xoverfns--交叉函式名稱表,以空格分開,如['arithxover heuristicxover ******xover']
xoverops--傳遞給交叉函式的參數列,如[2 0;2 3;2 0]
mutfns--變異函式表,如['boundarymutation multinonunifmutation nonunifmutation unifmutation']
mutops--傳遞給交叉函式的參數列,如[4 0 0;6 100 3;4 100 3;4 0 0]
注意】matlab工具箱函式必須放在工作目錄下
【問題】求f(x)=x+10*sin(5x)+7*cos(4x)的最大值,其中0<=x<=9
【分析】選擇二進位制編碼,種群中的個體數目為10,二進位制編碼長度為20,交叉概率為0.95,變異概率為0.08
【程式清單】
%編寫目標函式
function[sol,eval]=fitness(sol,options)
x=sol(1);
eval=x+10*sin(5*x)+7*cos(4*x);
%把上述函式儲存為fitness.m檔案並放在工作目錄下
initpop=initializega(10,[0 9],'fitness');%生成初始種群,大小為10
[x endpop,bpop,trace]=ga([0 9],'fitness',,initpop,[1e-6 1 1],'maxgenterm',25,'normgeomselect',...
[0.08],['arithxover'],[2],'nonunifmutation',[2 25 3]) %25次遺傳迭代
運算借過為:x =
7.8562 24.8553(當x為7.8562時,f(x)取最大值24.8553)
注:遺傳演算法一般用來取得近似最優解,而不是最優解。
遺傳演算法例項2
【問題】在-5<=xi<=5,i=1,2區間內,求解
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,最大代數1000,變異率0.1,交叉率0.3
【程式清單】
%源函式的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;
%適應度函式的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')
注:前兩個檔案儲存為m檔案並放在工作目錄下,執行結果為
p =
0.0000 -0.0000 0.0055
大家可以直接繪出f(x)的圖形來大概看看f(x)的最值是多少,也可是使用優化函式來驗證。matlab命令列執行命令:
fplot('x+10*sin(5*x)+7*cos(4*x)',[0,9])
evalops是傳遞給適應度函式的引數,opts是二進位制編碼的精度,termops是選擇maxgenterm結束函式時傳遞個maxgenterm的引數,即遺傳代數。xoverops是傳遞給交叉函式的引數。mutops是傳遞給變異函式的引數。
遺傳演算法工具箱求函式極值
這是乙個用ga演算法來求函式極值的例子 clcclear all t 100 optionsorigin gaoptimset generation t 2 x,fval,reason,output,finnal pop ga ch14 2f,2,optionsorigin options1 gao...
MATLAB遺傳演算法之 工具箱實現
標準演算法 遺傳演算法 每次選代產生乙個單點,點的序列逼近乙個優化解 每次迭代產生乙個種群,種群通近乙個優化解 通過確定性的計算在該序列中選擇下乙個點 通過隨機進化選擇計算來選擇下一代種群 遺傳演算法工具有兩種使用方式 以命令列方式呼叫遺傳演算法函式ga。通過使用者圖形介面使用遺傳演算法工具。在命令...
初遇Sheffield遺傳演算法工具箱
安裝參考 安裝 1 解壓gatbx origin.zip,得到doc和src資料夾 2 拷貝src到matlab安裝目錄下的toolbox資料夾中,並將src更名為gatbx 3 開啟toolbox local 目錄下的pathdef.m檔案,在適當位置新增以下兩行 也可addpath code i...