下面介紹的函數都是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 .直接把文件夾添加在運行目錄里面。