您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 交通运输 > 变异概率自适应调整的遗传算法GA程序
1变异概率自适应调整的遗传算法算例一:优化函数:*sin10*2,[1,2]fxxxxA.变异概率自适应调整公式:B.遗传算法参数(1)种群规模设为80,遗传算子分别为轮盘法选择,多点点交叉和多点自适应变异;(2)交叉概率0.7,变异概率0.01;(3)最大进化代数为100代,保优操作。C.程序框图图1程序流程框图12max1max1,,mmmavgavgmmavgPPffPffffPPff开始确定实际问题参数集群、对参数集进行编码初始化群体P(t)群体P(t+1)(更新)位串解码得参数计算目标函数值函数值向适应值映射适应值调整选择、交叉、自适应变异群体评价遗传操作满足停止准则结束2二:程序及运行结果(1)%变异概率自适应调整的GA程序%优化函数为f=x*sin(10*x)+2,其中,-1=x=2%编码长度为12位%种群规模设为80,遗传算子分别为轮盘法选择,多点点交叉和多点自适应变异。%交叉概率0.7,变异概率0.01%最大进化代数为100代,保优操作。%**********************%主函数*****************************************functionmain()globalchromlchromoldpopnewpopvariblefitnesspopsizesumfitness%定义全局变量globalpcrosspmutationtempbestfitmaxfitgenbestgenglobalmaxgenpoppmpnplchrom=12;%染色体长度popsize=80;%种群大小pcross=0.7;%交叉概率pmutation=0.01;%变异概率maxgen=100;%最大代数po=0.1;%淘汰概率pp=0.1;%保护概率mp=floor(pp*popsize);%保护的个数np=floor(po*popsize);%淘汰的个数initpop;%初始化种群forgen=1:maxgenobjfun;%计算适应度值pp_po;%执行保优操作select;%选择操作selfmutation;%自变异操作crossover;%交叉操作endbestbestfit%最佳个体适应度值输出3bestgen%最佳个体所在代数输出figuregen=1:maxgen;plot(gen,maxfit(1,gen));%进化曲线holdon;plot(bestgen,bestfit);xlabel('Generation');ylabel('Fitness');%**********************产生初始种群************************************functioninitpop()globallchromoldpoppopsizechromfori=1:popsizechrom=rand(1,lchrom);%lchrom=12染色体长度forj=1:lchromifchrom(1,j)0.5chrom(1,j)=0;elsechrom(1,j)=1;endendoldpop(i,1:lchrom)=chrom;end%************************%计算适应度值************************************functionobjfun()globallchromoldpopfitnesspopsizechrommaxfitgenvaribleavgfinesssavgfitness%a=0;b=3;a=0;b=10;fori=1:popsizechrom=oldpop(i,:);c=decimal(chrom);varible(1,i)=a+c*(b-a)/(2.^lchrom-1);%对应变量值fitness(1,i)=varible(1,i)*sin(10*varible(1,i))+2;4endavgfitness=sum(fitness)/popsize;lsort;%个体排序maxfit(1,gen)=max(fitness);%求本代中的最大适应度值maxfit%************************二进制转十进制**********************************functionc=decimal(chrom)globallchrompopsizec=0;forj=1:lchromc=c+chrom(1,j)*2.^(lchrom-j);end%*************************个体从小到大排序************************functionlsort()globalpopsizefitnessoldpopfori=1:popsizej=i+1;whilej=popsizeiffitness(1,i)fitness(1,j)tf=fitness(1,i);%适应度值tc=oldpop(i,:);%基因代码fitness(1,i)=fitness(1,j);%适应度值互换oldpop(i,:)=oldpop(j,:);%基因代码互换fitnescs(1,j)=tf;oldpop(j,:)=tc;endj=j+1;endend%*************************保优操作*****************************functionpp_po()globalpopsizeoldpopnpi=np+1;%np=floor(po*popsize);%淘汰的个数np5j=1;whilei=popsize%将(np+1)~popsize的个体放在toldpop中,共(popsize-np)个toldpop(j,:)=oldpop(i,:);j=j+1;i=i+1;endfori=1:(popsize-np)%从小到大顺序排列,将前面np个淘汰oldpop(i,:)=toldpop(i,:);%适应度是否也要互换?end%*************************转轮法选择操作**********************************functionselect()globalfitnesspopsizesumfitnessoldpoptempmpnpsumfitness=0;%个体适应度之和fori=1:(popsize-np-mp)%仅计算(popsize-np-mp)个个体的选择概率sumfitness=sumfitness+fitness(1,i);endfori=1:(popsize-mp-np)%仅计算(popsize-np-mp)个个体的选择概率p(1,i)=fitness(1,i)/sumfitness;%个体染色体的选择概率endq=cumsum(p);%个体染色体的累积概率(内部函数),共(popsize-np-mp)个b=sort(rand(1,(popsize-mp)));%产生(popsize-mp)个随机数,并按升序排列。mp为保护个体数j=1;k=1;whilej=(popsize-mp)%从(popsize-mp-np)中选出(popsize-mp)个个体,并放入temp(j,:)中;ifb(1,j)q(1,k)temp(j,:)=oldpop(k,:);j=j+1;elsek=k+1;6endendj=popsize-np-mp+1;%从统一挪过来的(popsize-np-mp)以后个体——优秀个体中选择fori=(popsize-mp+1):popsize%将mp个保留个体放入交配池temp(i,:),以保证群体数popsizetemp(i,:)=oldpop(j,:);j=j+1;end%*********************%自适应变异操作*************************************functionselfmutation()globalipopsizelchrompmutationtempnewpopoldpopmpfitnessavgfitnessmaxfitnessm=lchrom*(popsize-mp);%总的基因数pm1=pmutation;pm2=0.005;a=0;b=10;fori=1:popsizechrom=oldpop(i,:);c=decimal(chrom);varible(1,i)=a+c*(b-a)/(2.^lchrom-1);%对应变量值fitness(1,i)=varible(1,i)*sin(10*varible(1,i))+2;%目标函数if(fitness(1,i)=avgfitness)pmutatio=pm1-(pm1-pm2)*(fitness(1,i)-avgfitness)/(maxfitness-avgfitness);elsepmutation=pm1;endendn=round(pmutation*m);%变异发生的次数fori=1:n%执行变异操作循环k=round(rand*(m-1))+1;%确定变异位置(四舍五入取整)j=ceil(k/lchrom);%确定个体编号(取整)7l=rem(k,lchrom);%确定个体中变位基因的位置(求余)ifl==0temp(j,lchrom)=~temp(j,lchrom);%取非操作elsetemp(j,l)=~temp(j,l);%取非操作endendfori=1:popsizenewpop(i,:)=temp(i,:);%产生新的个体oldpop(i,:)=newpop(i,:);end%**************************%交叉操作***************************************functioncrossover()globaltemppopsizepcrosslchrommpn=floor(pcross*(popsize-mp));%交叉发生的次数(向下取整)ifrem(n,2)~=0%求余n=n+1;%保证为偶数个个体,便于交叉操作endj=1;m=0;%对(popsize-mp)个个体将进行随机配对,满足条件者将进行交叉操作(按顺序选择要交叉的对象)fori=1:(popsize-mp)p=rand;%产生随机数ifppcross%满足交叉条件parent(j,:)=temp(i,:);%选出1个父本k(1,j)=i;j=j+1;%记录父本个数m=m+1;%记录杂交次数if(j==3)&(m=n)%满足两个父本(j==3),未超过交叉次数(m=n)pos=round(rand*(lchrom-1))+1;%确定随机位数(四舍五入取整)fori=1:pos8child1(1,i)=parent(1,i);child2(1,i)=parent(2,i);endfori=(pos+1):lchromchild1(1,i)=parent(2,i);child2(1,i)=parent(1,i);endi=k(1,1);j=k(1,2);temp(i,:)=child1(1,:);temp(j,:)=child2(1,:);j=1;endendend%*********************%最佳个体********************************************functionbest()globalmaxfitbestfitgenmaxgenbestgenbestfit=maxfit(1,1);gen=2;whilegen=maxgenifbestfitmaxfit(1,gen)bestfit=maxfit(1,gen);bestgen=gen;endgen=gen+1;end90102030405060708090100024681012G
本文标题:变异概率自适应调整的遗传算法GA程序
链接地址:https://www.777doc.com/doc-2569242 .html