1. 程式人生 > >matlab遺傳算法工具箱

matlab遺傳算法工具箱

size 主程序 best nes title cal 希望 min 均值

轉自http://blog.sina.com.cn/s/blog_5ebcc0240101pnrj.html

matlab遺傳算法工具箱函數及實例講解

(2014-01-10 13:03:57)
分類: matlab

最近研究了一下遺傳算法,因為要用遺傳算法來求解多元非線性模型。還好用遺傳算法的工具

箱予以實現了,期間也遇到了許多問題。借此與大家分享一下。

首先,我們要熟悉遺傳算法的基本原理與運算流程。

基本原理:遺傳算法是一種典型的啟發式算法,屬於非數值算法範疇。它是模擬達爾文的自然

選擇學說和自然界的生物進化過程的一種計算模型。它是采用簡單的編碼技術來表示各種復雜

的結構,並通過對一組編碼表示進行簡單的遺傳操作和優勝劣汰的自然選擇來指導學習和確定

搜索的方向。遺傳算法的操作對象是一群二進制串(稱為染色體、個體),即種群,每一個染

色體都對應問題的一個解。從初始種群出發,采用基於適應度函數的選擇策略在當前種群中選

擇個體,使用雜交和變異來產生下一代種群。如此模仿生命的進化進行不斷演化,直到滿足期

望的終止條件。

運算流程:

Step 1:對遺傳算法的運行參數進行賦值。參數包括種群規模、變量個數、交叉概率、變異概

率以及遺傳運算的終止進化代數。

Step 2:建立區域描述器。根據軌道交通與常規公交運營協調模型的求解變量的約束條件,設

置變量的取值範圍。

Step 3:在Step 2的變量取值範圍內,隨機產生初始群體,代入適應度函數計算其適應度值。

Step 4:執行比例選擇算子進行選擇操作。

Step 5:按交叉概率對交叉算子執行交叉操作。

Step 6:按變異概率執行離散變異操作。

Step 7:計算Step 6得到局部最優解中每個個體的適應值,並執行最優個體保存策略。

Step 8:判斷是否滿足遺傳運算的終止進化代數,不滿足則返回Step 4,滿足則輸出運算結果

其次,運用遺傳算法工具箱。

運用基於Matlab的遺傳算法工具箱非常方便,遺傳算法工具箱裏包括了我們需要的各種函數庫

。目前,基於Matlab的遺傳算法工具箱也很多,比較流行的有英國設菲爾德大學開發的遺傳算

法工具箱GATBX、GAOT以及Math Works公司推出的GADS。實際上,GADS就是大家所看到的

Matlab中自帶的工具箱。我在網上看到有問為什麽遺傳算法函數不能調用的問題,其實,主要

就是因為用的工具箱不同。因為,有些人用的是GATBX帶有的函數,但MATLAB自帶的遺傳算法

工具箱是GADS,GADS當然沒有GATBX裏的函數,因此運行程序時會報錯,當你用MATLAB來編寫

遺傳算法代碼時,要根據你所安裝的工具箱來編寫代碼。

以GATBX為例,運用GATBX時,要將GATBX解壓到Matlab下的toolbox文件夾裏,同時,set path

將GATBX文件夾加入到路徑當中。

最後,編寫Matlab運行遺傳算法的代碼。

這塊內容主要包括兩方面工作:1、將模型用程序寫出來(.M文件),即目標函數,若目標函

數非負,即可直接將目標函數作為適應度函數。2、設置遺傳算法的運行參數。包括:種群規

模、變量個數、區域描述器、交叉概率、變異概率以及遺傳運算的終止進化代數等等。

為方便大家理解,以下為例:

求解模型:TC=x1+2*x2+3*x3+4*x4,-1<=x<=0

根據上面的求解模型,可以寫出模型的.M文件如下,即適應度函數

function TC=TotalCost(x)
TC=0;
for i=1:4
TC=TC+i*x(i);
end

然後,可以利用遺傳算法工具箱來寫出遺傳算法運行的主要程序,如下:

%定義遺傳算法參數
NIND=20; %個體數目
MAXGEN=200; %最大遺傳代數
NVAR=4; %變量維數
PRECI=20; %變量的二進制位數
GGAP=0.9; %代溝
trace=zeros(MAXGEN,2); %算法性能跟蹤
%建立區域描述器
FieldD=[rep(PRECI,[1,NVAR]);rep([-1;0],[1,NVAR]);rep([1;0;1;1],[1,NVAR])];
Chrom=crtbp(NIND,NVAR*PRECI); %創建初始種群
gen=0; %代計數器
ObjV=TotalCost(bs2rv(Chrom,FieldD)); %計算初始種群個體的目

標函數值
while gen
FitnV=ranking(ObjV); %分配適應度值
SelCh=select(‘sus‘,Chrom,FitnV,GGAP); %選擇
SelCh=recombin(‘xovsp‘,SelCh,0.7); %重組
SelCh=mut(SelCh,0.07); %變異
ObjVSel=TotalCost(bs2rv(SelCh,FieldD)); %計算子代目標函數值
[Chrom ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入
gen=gen+1;
%輸出最優解及其對應的10個變量的十進制值
[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(‘種群均值的變換‘,‘最優解的變化‘);


顯然,根據模型的特征,最優解應該是-10,自變量分別取-1,-1,-1,-1。大家可以安裝

GATBX,在Matlab中建立目標函數的.M文件以及遺傳算法主程序的文件來進行試驗。

希望以上內容對學習和運用遺傳算法的同仁有所幫助,因為本人也是初學,因此有不詳之處請

見諒。


////////////////////////////////////////////////////
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

simpleXover‘]
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]) %次遺傳叠代

運算借過為: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‘)

matlab遺傳算法工具箱