遺傳算法MATLAB工具包簡介


下面介紹的函數都是Sheriffed大學遺傳算法工具包內的常用函數

  • 復制矩陣
B=rep(A,RepN)
  • 1

A表示要被復制的矩陣,RepN包含每個方向的復制次數,RepN(1)代表縱向復制次數,RepN(2)代表橫向復制次數 
比如

A=[1,2;3,4]; B=rep(A,[1,2]) B=[1,2,1,2 3,4,3,4] 
  • 1
  • 2
  • 3
  • 4

如果是

B=rep(A,[2,1]) B=[1,2 3,4 1,2 3,4]
  • 1
  • 2
  • 3
  • 4
  • 5

=-= 教材里介紹了這個,但之后沒有用到哎……

  • 創造種群
Chrom=crtbp(n,b)
  • 1

n代表染色體個數,b代表二進制數的位數(可以理解為基因數)

  • 二進制轉十進制數
bs2rv(Chrom,Field)
  • 1

Field是個矩陣,有如下參數

Field=[b;lowerbound;upperbound;code;scale;lbin;ubin]
  • 1

各個參數的意義如下: 
 b代表二進制數串的長度,后面那倆表示原來十進制數的上下界 
 code代表編碼方式,1表示二進制編碼 
 scale表示每個串的刻度,0代表算數刻度,1代表對數刻度 
 lbin和ubin表示參數的取值是否包括邊界,0表示不包括,1表示包括

 bs2rv(Chrom,Field)返回的是個列向量,其中每行就是原來Chrom里每行對應的十進制數

  • 計算適應度值
FitnV=ranking(ObjV)
  • 1

 ObjV是定義好的目標函數 
 老實講,我沒搞懂它這個ranking的返回值是什么意思。但就把它當做可以計算出各個染色體的適應值,並表明他們被傳遞到下一代的概率為多少的函數吧 
 就是執行算出我筆記中那張表的函數? 
 這里需要強調一點。ranking默認的是求最小,如果你要求的問題是最大,那就寫成ranking(-ObjV) 
+ 根據適應度值通過選擇來得到新種群

SelCh=select(SEL_F,Chrom,FitnV,GGAP)
  • 1

 SEL_FeL_是個字符串,表明調用的選擇函數,可以用rws(輪盤選擇)或者sus(隨機遍歷采樣) 
 GGAP代表這一代傳到下一代的概率,就是新種群中的個體數為現在的幾分之幾 
 =-= 既然咱看的教程是拿rws講的,那就用rws來搞

  • 令新種群進行交配
SelCh = recombin(REC_F,SelCh,px)
  • 1

 REC_F是個字符串,是指定交配的方式,可以用recdis或xovsp函數 
 px代表交配概率,可能就是教程里指的那個概率吧 
 recdis代表離散重組,xovsp是單點交叉 
 感覺xovsp跟之前原理中的交配方式有點像?

  • 令新種群進行變異
SelCh = mut(SelCh,pm)
  • 1

 pm代表變異概率,如果直接用Selch = mut(SelCh),它會被設為缺省值0.7

  • 子代插入父代 
     呃…………這個,可以理解為是父代便當了一部分,子代出生了一部分,這個操作代表的就是在子代出生父代便當后的新子群,它是把子代中的一部分和父代中的一部分混合了。混合完后得到的種群染色體總數是不變的
[Chrom,ObjVCh] = reins(Chrom, SelCh,SUBPOP,InsOpt,ObjVCh,ObjVSel)
  • 1

 里面各個參數意義如下: 
 Chrom是父代,SelCh是子代 
 SUBPOP一般作為1,指明Chrom和SelCh中子種群的個數 
 InsOpt是一個最多有倆參數的向量,Insopt(1)如果是0,代表子代代替父代使用均勻隨機選擇,Insopts(1)如果是1,代表子代代替父代是基於適應度選擇,子代代替父代中適應度最小的個體 
 Insopt(2)表示每個子種群中重插入的子代個體在整個子種群中個體的比率,如果沒寫,默認為1 
 ObjVCh代表Chrom里個體的目標值,ObjVSel代表SelCh中的目標值,如果子代的數量大於重插入種群中的子代數量,則ObjVSel是必需的,這種情況子代將按它們的適應度大小選擇插入

值得注意的是,如果是多變量的最優化問題,那在初始化種群時雖然是把倆變量對應的基因拼在一起初始化的,但在轉化為二進制,計算適應度函數時,都是分開來算的。看下面兩段代碼

%求sin(10*pi*X)/X的最小值 lb=1;ub=2; %函數自變量范圍【1,2】 ezplot('sin(10*pi*X)/X',[lb,ub]); %畫出函數曲線 xlabel('自變量/X') ylabel('函數值/Y') %% 定義遺傳算法參數 NIND=40; %個體數目 MAXGEN=20; %最大遺傳代數 PRECI=20; %變量的二進制位數 GGAP=0.95; %代溝 px=0.7; %交叉概率 pm=0.01; %變異概率 trace=zeros(2,MAXGEN); %尋優結果的初始值 FieldD=[PRECI;lb;ub;1;0;1;1]; %區域描述器 Chrom=crtbp(NIND,PRECI); %初始種群 %% 優化 gen=0; %代計數器 X=bs2rv(Chrom,FieldD); %計算初始種群的十進制轉換 ObjV=sin(10*pi*X)./X; %計算目標函數值 while gen<MAXGEN FitnV=ranking(ObjV); %分配適應度值 SelCh=select('sus',Chrom,FitnV,GGAP); %選擇 SelCh=recombin('xovsp',SelCh,px); %重組 SelCh=mut(SelCh,pm); %變異 X=bs2rv(SelCh,FieldD); %子代個體的十進制轉換 ObjVSel=sin(10*pi*X)./X; %計算子代的目標函數值 [Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入子代到父代,得到新種群 X=bs2rv(Chrom,FieldD); gen=gen+1; %代計數器增加 [Y,I]=min(ObjV); %Y是ObjV里最小的值,I是表示它是第幾個,這樣就可以找出使Y最小的X trace(1,gen)=X(I); %記下每代最優值對應的X trace(2,gen)=Y; %記下每代目標函數的最優值 end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

 對於下面這段代碼,需要強調這么一點: 
 它這個工具包是默認求ObjV的最小值的,如果你要求最大值,那么在ranking時就應該按照-ObjV來分配適應度值,篩選染色體 
 這樣篩選出來的染色體是能讓ObjV取最大值的染色體,所以在獲取最優解參數時,是用 [Y,I]=max(ObjV); 而不是 [Y,I]=min(ObjV);

%求y*sin(2*pi*x)+x*cos(2*pi*y)的最大值 lbx=-2;ubx=2; %函數自變量x范圍【-2,2】 lby=-2;uby=2; %函數自變量y范圍【-2,2】 ezmesh('y*sin(2*pi*x)+x*cos(2*pi*y)',[lbx,ubx,lby,uby],50); %畫出函數曲線 hold on; %% 定義遺傳算法參數 NIND=40; %個體數目 MAXGEN=50; %最大遺傳代數 PRECI=20; %變量的二進制位數 GGAP=0.95; %代溝 px=0.7; %交叉概率 pm=0.01; %變異概率 trace=zeros(3,MAXGEN); %尋優結果的初始值 FieldD=[PRECI PRECI;lbx lby;ubx uby;1 1;0 0;1 1;1 1]; %區域描述器 Chrom=crtbp(NIND,PRECI*2); %初始種群 %% 優化 gen=0; %代計數器 XY=bs2rv(Chrom,FieldD); %計算初始種群的十進制轉換 X=XY(:,1);Y=XY(:,2); ObjV=Y.*sin(2*pi*X)+X.*cos(2*pi*Y); %計算目標函數值 while gen<MAXGEN FitnV=ranking(-ObjV); %分配適應度值 SelCh=select('sus',Chrom,FitnV,GGAP); %選擇 SelCh=recombin('xovsp',SelCh,px); %重組 SelCh=mut(SelCh,pm); %變異 XY=bs2rv(SelCh,FieldD); %子代個體的十進制轉換 X=XY(:,1);Y=XY(:,2); ObjVSel=Y.*sin(2*pi*X)+X.*cos(2*pi*Y); %計算子代的目標函數值 [Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入子代到父代,得到新種群 XY=bs2rv(Chrom,FieldD); gen=gen+1; %代計數器增加 %獲取每代的最優解及其序號,Y為最優解,I為個體的序號 [Y,I]=max(ObjV); trace(1:2,gen)=XY(I,:); %記下每代的最優值 trace(3,gen)=Y; %記下每代的最優值 end

代碼運行過程中,可能會出現未定義函數“rep”“crtbp”問題,其原因是沒有安裝MATLAB遺傳工具箱,具體下載:

詳見http://www.ilovematlab.cn/thread-28448-1-1.html

添加路徑方法

   1. 以gatbx工具箱為例,先將gatbx文件夾復制到MATLAB安裝目錄下的toolbox下,然后打開MATLAB,點擊菜單中file ->set path,選ADD FOLDER,選擇你剛才復制的那個文件夾就OK

   2 .直接把文件夾添加在運行目錄里面。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM