遺傳算法MATLAB實現(2):一元函數優化舉例


遺傳算法提供了一種求解非線性、多模型、多目標等復雜系統優化問題的通用框架。

先從例子開始,慢慢再總結理論。。。

【例】利用遺傳算法計算函數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.


免責聲明!

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



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