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


多峰的Shubert為:

  

求f(x,y)在[-10,10]x[-10,10]上的最大值。

 

MATLAB代碼:

    fun_mutv函數為:

function my=fun_mutv(x,y)
t1=zeros(size(x));
t2=t1;
for i=1:5
    t1=t1+i*cos((i+1)*x+i);
    t2=t2+i*cos((i+1)*y+i);
end
my=t1.*t2;

  

opt_minmax=1;   %優化目標類型:1最大化 0最小化
num_ppu=60;     %種群規模,個體個數。
num_gen=100;    %最大遺傳代數
num_v=2;        %變量個數
len_ch=20;      %基因長度
gap=0.9;        %代溝
sub=-10;        %變量取值下限
up=10;          %變量取值上限
cd_gray=1;      %是否選擇格雷碼編碼方式 1是,0否
sc_log=0;           %是否選擇對數標度:1是,0否
trace=zeros(num_gen,2);     %遺傳迭代性能跟蹤器
%區域描述器,rep為矩陣復制函數
fieldd=[rep([len_ch],[1,num_v]);rep([sub;up],[1,num_v]);rep([1-cd_gray;sc_log;1;1],[1,num_v])];
chrom=crtbp(num_ppu,len_ch*num_v);  %初始化生產種群
k_gen=0;
x=bs2rv(chrom,fieldd);      %翻譯初始化種群為10進制
fun_v=fun_mutv(x(:,1),x(:,2));  %計算目標函數值
[tx,ty]=meshgrid(-10:1:10); 
mesh(tx,ty,fun_mutv(tx,ty));
xlabel('x');ylabel('y');zlabel('z');
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);    %交叉
    selchtom=mut(selchrom);                         %變異
    x=bs2rv(selchrom,fieldd);                       %子代個體翻譯
    fun_v_sel=fun_mutv(x(:,1),x(:,2));              %計算子代個體對應目標函數值
    fit_v_sel=ranking(-opt_minmax*fun_v_sel);       
    [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(id,:),fieldd);
    f=f*opt_minmax;
    fun_v=fun_v*opt_minmax;
    plot3(x(1,1),x(1,2),f,'k*');
    hold on;
    k_gen=k_gen+1;
    trace(k_gen,1)=f;
    trace(k_gen,2)=mean(fun_v);
end
figure;
plot(trace(:,1),'r-*');
hold on;
plot(trace(:,2),'b-o');
legend('各子代種群最優解','各子代種群平均值');
xlabel('迭代次數');ylabel('目標函數優化情況');
title('多元函數優化過程');

  


免責聲明!

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



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