遗传算法求解函数最大值的Matlab实现

        最近在学习智能控制部分的优化算法,遗传算法算是优化算法中最常见的算法,感觉挺有意思,于是利用书上的例子写到这供大家查阅。当然后面还有很多更为先进的优化算法,如粒子群算法等,其在专门的领域可能有更好的效果,后面会进一步地学习。      

        遗传算法是一种受自然进化启发的优化算法,常用于解决复杂问题。它模拟了生物进化的过程,通过不断演化适应度更高的解决方案来寻找最优解。

        遗传算法的基本原理如下:
        初始化种群:随机生成一组个体,每个个体都代表问题的一个可能解。
        评估适应度:对每个个体计算其适应度,即衡量个体解决问题的能力。
        选择操作:根据适应度选择一些个体作为父代,用于产生下一代。
        交叉操作:通过交叉操作,将选定的父代个体的基因进行混合,产生新的个体。
        变异操作:对新个体进行变异操作,引入一些随机性,增加搜索空间。
        重复步骤2-5,直到满足停止条件(如达到最大迭代次数或找到满意的解)。
        返回最优解:找到适应度最高的个体作为最优解。

       遗传算法的核心思想是通过模拟自然选择、交叉和变异的过程,逐步进化出更优秀的解决方案。它常应用于求解NP困难问题,例如旅行商问题、机器学习中的参数优化以及工程设计等。由于其并行化和有效性,遗传算法已经成为一种常用的优化方法之一。

例:用遗传算法求解y=200*exp(-0.05*x).*sin(x)在[-2 2]区间上的最大值

clc;
clear ;
close all;
tic;
global BitLength
global boundsbegin
global boundsend
bounds=[-2 2];%一维自变量的取值范围
precision=0.0001; %运算精度
boundsbegin=bounds(:,1);
boundsend=bounds(:,2);
%计算如果满足求解精度至少需要多长的染色体
BitLength=ceil(log2((boundsend-boundsbegin)' ./ precision));
popsize=50; %初始种群大小
Generationnmax=12;  %最大代数
pcrossover=0.90; %交配概率
pmutation=0.09; %变异概率
%产生初始种群
population=round(rand(popsize,BitLength));
%计算适应度,返回适应度Fitvalue和累积概率cumsump
[Fitvalue,cumsump]=fitnessfun(population);  
Generation=1;
while Generation<Generationnmax+1
   for j=1:2:popsize 
      %选择操作
      seln=selection(population,cumsump);
      %交叉操作
      scro=crossover(population,seln,pcrossover);
      scnew(j,:)=scro(1,:);
      scnew(j+1,:)=scro(2,:);
      %变异操作
      smnew(j,:)=mutation(scnew(j,:),pmutation);
      smnew(j+1,:)=mutation(scnew(j+1,:),pmutation);
   end
   population=smnew;  %产生了新的种群
   %计算新种群的适应度   
   [Fitvalue,cumsump]=fitnessfun(population);
   %记录当前代最好的适应度和平均适应度
   [fmax,nmax]=max(Fitvalue);
   fmean=mean(Fitvalue);
   ymax(Generation)=fmax;
   ymean(Generation)=fmean;
   %记录当前代的最佳染色体个体
   x=transform2to10(population(nmax,:));
   %自变量取值范围是[-2 2],需要把经过遗传运算的最佳染色体整合到[-2 2]区间
  xx=boundsbegin+x*(boundsend-boundsbegin)/(power((boundsend),BitLength)-1);
   xmax(Generation)=xx;
   Generation=Generation+1
end
Generation=Generation-1;
Bestpopulation=xx
Besttargetfunvalue=targetfun(xx)
%绘制经过遗传运算后的适应度曲线。一般地,如果进化过程中种群的平均适应度与最大适
%应度在曲线上有相互趋同的形态,表示算法收敛进行得很顺利,没有出现震荡;在这种前
%提下,最大适应度个体连续若干代都没有发生进化表明种群已经成熟。
figure(1);
hand1=plot(1:Generation,ymax);
set(hand1,'linestyle','-','linewidth',1.8,'marker','*','markersize',6)
hold on;
hand2=plot(1:Generation,ymean);
set(hand2,'color','r','linestyle','-','linewidth',1.8,...
'marker','h','markersize',6)
xlabel('进化代数');ylabel('最大/平均适应度');xlim([1 Generationnmax]);
legend('最大适应度','平均适应度');
box off;hold off;
toc;
% display(['运行时间:',num2str(toc)]);

运行结果如图所示:

Generation =

    12


Generation =

    13


Bestpopulation =

    1.5697


Besttargetfunvalue =

  184.9031

根据运行结果可以得出,当迭代到第12代时,效果理想。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值