前言
為了省略艱深難懂的遺傳算法數學理論和降低程式開發的難度,MATLAB軟體已經将遺傳算法指令進行了封裝,做成專門的遺傳算法工具箱(GA Toolbox),方 便使用者調用
1.ga函數
ga函數是對目标函數進行遺傳計算,其格式如下:
其中,fitnessfun為适應度句柄函數; nvars 為目标函數自變量的個數; options 為算法的屬性設定,該屬性是通過函數gaoptimset賦予的;x為經過遺傳進化以後自變量最佳染色體傳回值;fval為最佳染色體的适應度;exitflag為算法停止的原因;output為輸出的算法結構;population為最終得到種群适應度的列向量;scores為最終得到的種群。
例1 已知不等式

使用ga函數求x1,x2的值。
clear all;
clc;
A=[1 1;-1 2;2 1];
b =[2;2; 3];
lb = zeros(2,1);
[x,fval,exitflag] = ga(@lincontest6,2,A, b,[],[],lb)
2.gaoptimset函數
gaoptimset函數是設定遺傳算法的參數和句柄函數,如表介紹常用的11種屬性。
屬性名 預設值 | 實作功能 |
---|---|
PopInitRange [0;1] | 初始種群生成空間 |
PopulationSize 20 | 種群規模 |
CrossoverFraction 0.8 | 交配機率 |
MigrationFraction 0.2 | 變異機率 |
Generations 100 | 超過進化代數時算法停止 |
TimeLimit Inf | 超過運算時間限制時算法停止 |
FitnessLimit Inf | 最佳個體等于或小于适應度門檻值時算法停止 |
StallGenLimit 50 | 超過連續代數不進化則算法停止 |
StallTimeLimit 20 | 超過連續時間不進化則算法停止 |
InitialPopulation [ ] | 初始化種群 |
PlotFens [ ] | 繪圖函數 |
其使用格式如下:
由于遺傳算法本質上是一種啟發式的随機運算,算法程式經常重複運作多次才能得到理想結果。鑒于此,可以将前一次運作得到的最後種群作為下一次運作的初始種群,如此操作會得到更好的結果:
最後一個輸出變量final_pop傳回的就是本次運作得到的最後種群。再将final_pop作為ga函數的初始種群,文法格式如下:
options = gaoptimset( 'InitialPopulation', finnal_ pop) ;
[x, fval, reason, output, finnal_pop2] = ga(@fitnessfcn, nvars, options) ;
遺傳算法和直接搜尋工具箱中的ga函數是求解目标函數的最小值,是以求目标函數最小值的問題,可直接令目标函數為适應度函數。編寫适應度函數,文法格式如下:
function f = fitnessfen(x) %x為自變量向量
f=f(x);
如果有限制條件(包括自變量的取值範圍),對于求解函數的最小值問題,可以使用如下文法格式:
function f= fitnessfcn(x)
if( x<= -1|x>3)
%表示有限制x>-1和x<-3,其他限制條件類推
f= inf;
else
f= f(x);
end
如果有限制條件(包括自變量的取值範圍),對于求解函數的最大值問題,可以使用如下文法格式:
function f= fitnessfcn(x)
if(x<=-1|x>3)
f= inf;
else
f= -f(x);
%這裡 f=-f(x),而不是f=f(x)
end
若目标函數作為适應度函數,則最終得到的目标函數值為 -fval 而不是fval。
3.gaoptimget函數
該函數用于得到遺傳算法參數結構中的參數具體值。其調用格式如下:
其中,options為結構體變量;name為需要得到的參數名稱,傳回值為val。
例2 利用遺傳算法求解函數
f(x,y) = (cos(x2 +y2)-0.1)/(1+0.3(x2+y2)2)+3的最大值。
解:首先建立遺傳算法 的适應度函數。
function y= ga43(x)
y= (cos(x(1)^2 + x(2)^3)-0.1)/(1+0.3* (x(1)^2+ x(2)^2)^2) + 3;
end
然後利用遺傳算法尋找函數最大值,在MATLAB指令行視窗輸人代碼如下:
結果: