• gyy*
    了解作者
  • matlab
    开发工具
  • 6KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 10 积分
    下载积分
  • 0
    下载次数
  • 2020-04-21 15:15
    上传日期
遗传算法(Genetic Algorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法
遗传算法.zip
  • 遗传算法
  • mutation.m
    333B
  • optimization3.m
    276B
  • selection.m
    273B
  • fitnessfcn3.m
    56B
  • nonlcon3.m
    78B
  • crossover.m
    521B
  • main.m
    4.7KB
  • targetfun.m
    182B
  • fitnessfun.m
    786B
  • gashili2.m
    381B
  • transform2to10.m
    228B
  • IfCroIfMut.m
    195B
内容介绍
% 主程序:二次函数最优解 clc; clear global BitLength global boundsbegin global boundsend global a global b global c % 方程系数 a = -0.02116; b = -0.0043958; c = 0.95443; % 方程定义域 bounds=[-1,1]; precision=0.0001; boundsbegin=bounds(:,1); boundsend=bounds(:,2); %计算如果满足求求解精度至少需要多少长的染色体 BitLength=ceil(log2((boundsend-boundsbegin)'./precision)); popsize=50; %初始种群大小 Generationmax=300; %最大代数 pcrossover=0.90; %交配概率 pmutation=0.09; %变异概率 %产生初始种群 population=round(rand(popsize,BitLength)); %技术适应度,返回适应度Fitvalue和累计概率cumsump [Fitvalue,cumsump]=fitnessfun(population); Generation=1; while Generation<Generationmax+1 for j=1:2:popsize %选择操作 seln=selection(population,cumsump); %交叉操作 scro=crossover(population,seln,pcrossover); scnew(j,:)=scro(2,:); 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(2, 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.0,'marker','*','markersize',6); hold on; hand2=plot(1:Generation,ymean); set(hand2,'color','r','linestyle','-','linewidth',1.0,'marker',... 'h','markersize',6); xlabel('进化代数'); ylabel('最大/平均适应度'); xlim([1 Generationmax]); box off; hold off; fprintf('最优解:%f 最优解结果:%f\n', xmax(end), targetfun(xmax(end))); %{ %子程序:计算适应度函数,函数名称为存储fitnessfun function[Fitvalue,cumsump]=fitnessfun(population) global BitLength global boundsbegin global boundsend popsize=size(population,1); %有popsize个个体 for i=1:popsize x=transform2to10(population(i,:)); %将二进制转换为十进制 %转换为【-2,2】区间的实数 xx=boundsbegin+x*(boundsend-boundsbegin)/(power((boundsend),BitLength)-1); Fitvalue(i)=targetfun(xx); end %给适应度函数加上一个大小合适的数以便保证种群适应值为正数 Fitvalue=Fitvalue'+230; %计算选择概率 fsum=sum(Fitvalue); Pperpopulation=Fitvalue/fsum; %计算累计概率 cumsump(1)=Pperpopulation(1); for i=2:popsize cumsump(i)=cumsump(i-1)+Pperpopulation(i); end cumsump=cumsump'; %子程序:新种群变异操作,函数名储存为mutation.m function snnew=mutation(snew,pmutation) BitLength=size(snew,2); snnew=snew; pmm=IfCroIfMut(pmutation);%根据变异概率决定是否进行变异操作,1则是,0则否 if pmm==1 chb=round(rand*(BitLength-1))+1;%在[1,BitLength]范围内随机产生一个变异位 snnew(chb)=abs(snew(chb)-1); end %子程序:新种群交叉操作,函数名存储为 crossover.m function scro=crossover(population,seln,pc) BitLength=size(population,2); pcc=IfCroIfMut(pc);%更具交叉概率决定是否进行交叉操作,1是,0则否 if pcc==1 chb=round(rand*(BitLength-2))+1;%在[1,BitLength-1]范围内随机产生一个交叉位 scro(1,:)=[population(seln(1),1:chb) population(seln(2),chb+1:BitLength)]; scro(2,:)=[population(seln(2),1:chb) population(seln(1),chb+1:BitLength)]; else scro(1,:)=population(seln(1),:); scro(2,:)=population(seln(2),:); end %子程序:判断遗传运算是否需要进行交叉或者变异,函数名储存为IfCroIfMut.m function pcc=IfCroIfMut(mutORcro) test(1:100)=0; l=round(100*mutORcro); test(1:1)=1; n=round(rand*99)+1; pcc=test(n); %子程序:新物种选择操作,函数名存储为selsction.m function seln=selection(poopulation,cumsump) %从种群中选择两个个体 for i=1:2 r=rand; prand=cumsump-r;%产生一个随机数 j=1; while prand(j)<0 j=j+1; end seln(i)=j; %选中个体的序号 end %子程序:将二进制数转换为十进制数,函数名称存储为transform2to10.m function x=transform2to10(Populaton) BitLength=size(Populaton,2); x=Populaton(BitLength); for i=1:BitLength-1 x=x+Populaton(BitLength-i)*power(2,i); end %子程序:对于优化最大值或极大值函数问题,目标函数可以作为适应度函数 %函数名称存储为targetfun.m function y=targetfun(x) %目标函数 y=200*exp(-0.05*x).*sin(x); %}
评论
    相关推荐
    • 遗传算法matlab程序
      这个是我一同学做遗传算法matlab程序,已经调试成功,欢迎下载
    • 遗传算法Matlab代码
      遗传算法Matlab代码,含详细注释,适合初学者
    • 遗传算法matlab代码
      matlab实现的遗传算法代码。二进制编码。
    • 遗传算法Matlab程序
      应用数字群算法设计数字滤波器的matlab程序,遗传算法是最近几年流行的优化算法
    • 遗传算法matlab代码
      文章给出遗传算法matlab算法,用其可以直接求解函数优化问题
    • 遗传算法matlab
      matlab程序下的遗传算法
    • 遗传算法matlab实现
      使用简单遗传算法求解寻优问题,以一个复杂函数为例,在MATLAB中按初始化种群、编码、遗传、变异、选择等分块编制程序,亲测可用,效果很好。
    • 遗传算法matlab
      遗传算法是自然选择和群体学基础上的非数值优化方法。提供了些matlab实例计算
    • 遗传算法matlab
      matlab是科学计算常用的工具,遗传算法也是一种目前比较流行的一种算法,利用matlab写的遗传算法代码,供大家参考。
    • 遗传算法matlab代码
      遗传算法matlab代码,能够正常运行,对于刚开始接触遗传算法的人员有很好的帮助