遗传算法求解香蕉函数的极大值

利用遗传算法求Rosenbrock(香蕉函数)函数的极大值。其中香蕉函数表达式如下:


遗传算法是利用孟德尔的生物遗传学和达尔文的进化论思想的一种智能计算方法。我觉着与其称之为一种算法,倒不如称之为是一种思想。

达尔文的进化论主要有以下三个基本方面:

(1)、遗传。亲代把生物信息交给子代,子代总是和亲代具有相同或相似的属性。生物有了这个特征,物种才能稳定存在。

(2)、变异。亲代和子代之间以及子代的不同个体之间的差异。变异的选择和积累是生命多样性的根源。

(3)、生存斗争和适者生存。适应性强的个体会被保存下来,并会获得更多的繁殖机会,适应性差的会被逐渐淘汰。而拥有有利变异者的适应性会更强。

遗传算法就是将这些基本原理引入到优化参数形成的编码串群体中,按照所选的适应度函数并通过遗传中的复制、交叉、变异以及对变异个体进行筛选,适应度高的个体会被保留下来,适应度低的个体会被淘汰,由此组成新的种群。不断迭代,群体中的个体适应度就会不断提高,直到满足我们预先设定的一定条件。遗传算法的基本思想还是比较简单的,可以进行并行处理,并能够达到全局最优。但是这毕竟只是一种经验思想,还是缺乏严格的数学推导。

遗传算法的基本操作为:

(1)复制

从一个旧种群中选择生命力强的个体位串产生新种群。具有高适应度的位串更有可能在下一代中产生一个或多个子孙。复制操作可以通过随机方法来实现。首先产生0~1之间的均匀分布的随机数,若某串的复制概率为40%,则当产生的随机数在0.40~1.0之间时,该串被复制,否则被淘汰。

(2)交叉

复制操作能够从旧种群中选择出优秀者,但不能创造新的染色体。而交叉模拟了生物进化过程中的繁殖现象,通过两个染色体的交换组合,来产生新的优良品种。

交叉的过程为:在匹配池任选两个染色体,随机选择一点或多点交换点位置;交换双亲染色体交换点右边的部分,即可得到两个新的染色体数字串。

交叉体现了自然界中信息交换的思想。交叉有单点交叉、两点交叉、还有一致交叉、顺序交叉和周期交叉。单点交叉是最基本的方法,应用较广,它是指染色体切断点只有一处。如下例所示


(3)变异

用来模拟生物在自然的遗传环境中由于各种偶然因素引起的基因突变,它以很小的概率随机地改变遗传基因(表示染色体符号串的某一位)的值。在染色体以二进制编码的系统中,它随机地将染色体在某一基因由1变0,或由0变1 。

用遗传算法求解上面香蕉函数的MATLAB代码实现如下所示

clc,clear
 Size=500;
 CodeL=2;
 
 MinX(1)=-2.048;
 MaxX(1)=2.048;
 MinX(2)=-2.048;
 MaxX(2)=2.048;
 
 E(:,1)=MinX(1)+(MaxX(1)-MinX(1))*rand(Size,1);
 E(:,2)=MinX(2)+(MaxX(2)-MinX(2))*rand(Size,1);
 
 G=200;
 BsJ=0;
 
 %---------------Start Running--------------------------------------------%
 for kg=1:G
     time(kg)=kg;
     
     %----------------------step 1: Evaluate BestJ-----------------------%
     for i=1:Size;
         xi=E(i,:);
         x1=xi(1);
         x2=xi(2);
         
         F(i)=100*(x1^2-x2)^2+(1-x1)^2;
         Ji=1./F;
         BsJi(i)=min(Ji);
     end
     [OderJi,IndexJi]=sort(BsJi);
     BestJ(kg)=OderJi(1);
     BJ=BestJ(kg);
     Ji=BsJi+eps;
     
     fi=F;
     [Oderfi,Indexfi]=sort(fi); 
     Bestfi=Oderfi(Size);       
     BestS=E(Indexfi(Size),:);  
     bfi(kg)=Bestfi;
     
     kg
     BestS
     %---------------------------Step 2:Select and Reproduct
     %Operation---------%
     fi_sum=sum(fi);
     fi_Size=(Oderfi/fi_sum)*Size;
     
     fi_S=floor(fi_Size);                   
     r=Size-sum(fi_S);
     
     Rest=fi_Size-fi_S;
     [RestValue,Index]=sort(Rest);
     
     for i=Size:-1:Size-r+1;
         fi_S(Index(i))=fi_S(Index(i))+1;
     end
     
     k=1;
     for i=Size:-1:1;
         for j=1:fi_S(i);
             TempE(k,:)=E(Indexfi(i),:);     
             k=k+1;                           
         end
     end
     %---------------------Step 3: Crossover Operation-------------------%
     Pc=0.90;
     for i=1:2:Size-1;
         temp=rand;
         if Pc>temp
             alfa=rand;
             TempE(i,:)=alfa*E(i+1,:)+(1-alfa)*E(i,:);
             TempE(i+1,:)=alfa*E(i,:)+(1-alfa)*E(i+1,:);
         end
     end
     TempE(Size,:)=BestS;
     E=TempE;
     
     %---------------------Step 4: Mutation Operation--------------------%
     Pm=0.10-[1:Size]*(0.01)/Size;         
     Pm_rand=rand(Size,CodeL);
     Mean=(MaxX+MinX)/2;
     Dif=MaxX-MinX;
     
     for i=1:Size;
         for j=1:CodeL;
             if Pm(i)>Pm_rand(i,j);
                 TempE(i,j)=Mean(j)+Dif(j)*(rand-0.5);
             end
         end
     end
     
     TempE(Size,:)=BestS;
     E=TempE;
 end
 BestS
 Bestfi
 figure(1);
 plot(time,BestJ,'k');
 xlabel('Times');ylabel('Best J');
 
 figure(2);
 plot(time,bfi,'k');
 xlabel('Times');ylabel('Best F');


运行结果如下



由此可得






  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值