遺傳算法提供了一種求解非線性、多模型、多目標等復雜系統優化問題的通用框架。
先從例子開始,慢慢再總結理論。。。
【例】利用遺傳算法計算函數f(x)=x*cos(5*pi*x)+3.5在區間[-1,2.5]上的最大值
先在工作區建立上面函數的一個m文件並保存,命名為fun_sigv.m:
function y=fun_sigv(x) y=x.*cos(5*pi*x)+3.5;
代溝是父代中需要經過選擇、交叉、變異得到下一代的比例,例如父代共100個個體,代溝為0.9,表明有90個個體被選中進行上述一系列操作進化到下一代,剩下10%不變、直接進入下一代,也即下一代還是100個個體。
tarce是代數*2的二維矩陣,存儲各子代種群最優解和各子代種群平均值
fieldd是區域描述器,有的書中[1]叫譯碼矩陣。其結構為
FieldD=[len,lb,ub,code,scale,lbin,ubin]';('代表轉置,也就是FieldD是列向量)
len是每個chrom的長度,lb和ub是行向量,分別指明每個變量使用的下界和上界。
code是二進制行向量,code(i)=1為標准二進制編碼,code(i)=0為格雷碼。
scale是二進制行向量,指明每個子串是否使用對數或算數刻度。0為算數刻度,1為對數刻度。
lbin和ubin是二進制行向量,指明表示范圍中是否包含每個邊界。選擇lbin=0或ubin=0,從表示范圍中去掉邊界;lbin=0或ubin=1則表示包含邊界。
fieldd在二進制串到實值轉換函數bs2rv中用到:Phen=bs2rv(Chrom,FieldD),即根據譯碼矩陣FieldD將二進制串矩陣Chrom轉換為實值向量。返回矩陣Phen包含對應的種群表現型。對於bs2rv函數,如果使用對數刻度,其范圍不能包含零。
下面是MATLAB代碼:
opt_minmax=1; %目標優化類型:1最大化、0最小化 num_ppu=50; %種群規模即個體個數 num_gen=60; %最大遺傳代數 len_ch=20; %基因長度 gap=0.9; %代溝(Generation gap) sub=-1; %變量取值下限 up=2.5; %變量取值上限 cd_gray=1; %是否選擇格雷碼編碼方式:1是、0否 sc_log=0; %是否選擇對數標度:1是、0否 trace=zeros(num_gen,2); %遺傳迭代性能跟蹤器 fieldd=[len_ch;sub;up;1-cd_gray;sc_log;1;1]; %區域描述器 chrom=crtbp(num_ppu,len_ch); %初始化生成種群 k_gen=0; x=bs2rv(chrom,fieldd); %翻譯初始化種群為10進制 fun_v=fun_sigv(x); %計算目標函數值 tx=sub:.01:up; plot(tx,fun_sigv(tx)); xlabel('x');ylabel('y'); title('一元函數優化結果'); hold on; while k_gen<num_gen fit_v=ranking(-opt_minmax*fun_v); %計算目標函數的適應度 selchrom=select('rws',chrom,fit_v,gap); %使用輪盤賭方式選擇 selchrom=recombin('xovsp',selchrom); %交叉 selchrom=mut(selchrom); %變異 x=bs2rv(selchrom,fieldd); %子代個體翻譯 fun_v_sel=fun_sigv(x); %計算子代個體對應目標函數值 [chrom,fun_v]=reins(chrom,selchrom,1,1,opt_minmax*fun_v,opt_minmax*fun_v_sel);%根據目標函數值將子代個體插入新種群 [f,id]=max(fun_v); %尋找當前種群最優解 x=bs2rv(chrom,fieldd); f=f*opt_minmax; fun_v=fun_v*opt_minmax; k_gen=k_gen+1; trace(k_gen,1)=f; trace(k_gen,2)=mean(fun_v); end plot(x(id),f,'r*'); figure; plot(trace(:,1),'r-*'); hold on; plot(trace(:,2),'b-o'); legend('各子代種群最優解','各子代種群平均值'); xlabel('迭代次數');ylabel('目標函數優化過程'); title('一元函數優化過程');
求函數f(x)=x*sin(10*pi*x)+2.0,x屬於[-1,2]的最大值:
opt_minmax=1; %目標優化類型:1最大化、0最小化 num_ppu=50; %種群規模即個體個數 num_gen=25; %最大遺傳代數 len_ch=20; %基因長度 gap=0.9; %代溝(Generation gap) sub=-1; %變量取值下限 up=2; %變量取值上限 cd_gray=1; %是否選擇格雷碼編碼方式:1是、0否 sc_log=0; %是否選擇對數標度:1是、0否 trace=zeros(num_gen,2); %遺傳迭代性能跟蹤器 fieldd=[len_ch;sub;up;cd_gray;sc_log;1;1]; %區域描述器 chrom=crtbp(num_ppu,len_ch); %初始化生成種群 k_gen=0; x=bs2rv(chrom,fieldd); %翻譯初始化種群為10進制 fun_v=fun_sigv(x); %計算目標函數值 tx=sub:.01:up; plot(tx,fun_sigv(tx)); xlabel('x');ylabel('y'); title('一元函數優化結果'); hold on; while k_gen<num_gen fit_v=ranking(-opt_minmax*fun_v); %計算目標函數的適應度,基於秩/排序的適應度計算。 selchrom=select('rws',chrom,fit_v,gap); %使用輪盤賭方式選擇 selchrom=recombin('xovsp',selchrom); %交叉 selchrom=mut(selchrom); %變異 x=bs2rv(selchrom,fieldd); %子代個體翻譯 fun_v_sel=fun_sigv(x); %計算子代個體對應目標函數值 [chrom,fun_v]=reins(chrom,selchrom,1,1,opt_minmax*fun_v,opt_minmax*fun_v_sel);%根據目標函數值將子代個體插入新種群 [f,id]=max(fun_v); %尋找當前種群最優解 % hold on; % if id<size(x,1) % plot(x(id),f,'r*'); % end x=bs2rv(chrom,fieldd); f=f*opt_minmax; fun_v=fun_v*opt_minmax; k_gen=k_gen+1; trace(k_gen,1)=f; trace(k_gen,2)=mean(fun_v); end plot(x',fun_v','b*'); plot(x(id),f,'rd'); % hold on; % figure; % plot(trace(:,1),'r-*'); % hold on; % plot(trace(:,2),'b-o'); % legend('各子代種群最優解','各子代種群平均值'); % xlabel('迭代次數');ylabel('目標函數優化過程'); % title('一元函數優化過程');
[1]:雷英傑,張善文,李續武,等. MATLAB遺傳算法工具箱及應用. 西安:西安電子科技大學出版社,2005.