变异概率自适应调整的遗传算法算例一:优化函数:()()*sin 10*2,[1,2]f x x x x =+∈-+A.变异概率自适应调整公式:B.遗传算法参数 (1)种群规模设为80,遗传算子分别为轮盘法选择,多点点交叉和多点自适应变异;(2)交叉概率0.7,变异概率0.01;(3)最大进化代数为100代,保优操作。
C.程序框图图 1 程序流程框图()()12max 1max 1,,m m m avg avg m m avg P P f f P f f f f P P f f --⎧-≥⎪-=⎨⎪<⎩ 开始 确定实际问题参数对参数集进行编码 初始化群体P(t) 群体P(t+1)(更新) 位串解码得参数 计算目标函数值 函数值向适应值映射 适应值调整 选择、交叉、自适应变异群体评价 遗传操作 满足停止准则 结束二:程序及运行结果(1)%变异概率自适应调整的GA程序%优化函数为f=x*sin(10*x)+2,其中,-1=<x<=2%编码长度为12位%种群规模设为80,遗传算子分别为轮盘法选择,多点点交叉和多点自适应变异。
%交叉概率0.7,变异概率0.01%最大进化代数为100代,保优操作。
%**********************%主函数*****************************************function main()global chrom lchrom oldpop newpop varible fitness popsize sumfitness %定义全局变量global pcross pmutation temp bestfit maxfit gen bestgenglobal maxgen po pp mp nplchrom=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; % 初始化种群for gen=1:maxgenobjfun; %计算适应度值pp_po; %执行保优操作select; %选择操作selfmutation; %自变异操作crossover; %交叉操作endbestbestfit % 最佳个体适应度值输出bestgen % 最佳个体所在代数输出figuregen=1:maxgen;plot(gen,maxfit(1,gen)); % 进化曲线hold on;plot(bestgen,bestfit);xlabel('Generation');ylabel('Fitness');%********************** 产生初始种群 ************************************ function initpop()global lchrom oldpop popsize chromfor i=1:popsizechrom=rand(1,lchrom); % lchrom=12 染色体长度for j=1:lchromif chrom(1,j)<0.5chrom(1,j)=0;elsechrom(1,j)=1;endendoldpop(i,1:lchrom)=chrom;end%************************%计算适应度值************************************ function objfun()global lchrom oldpop fitness popsize chrom maxfit gen varible avgfiness savgfitness % a=0;b=3;a=0;b=10;for i=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;avgfitness=sum(fitness)/popsize;lsort; % 个体排序maxfit(1,gen)=max(fitness); %求本代中的最大适应度值maxfit%************************二进制转十进制********************************** function c=decimal(chrom)global lchrom popsizec=0;for j=1:lchromc=c+chrom(1,j)*2.^(lchrom-j);end%************************* 个体从小到大排序 ************************ function lsort()global popsize fitness oldpopfor i=1:popsizej=i+1;while j<=popsizeif fitness(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%*************************保优操作*****************************function pp_po()global popsize oldpop npi=np+1; % np=floor(po*popsize); %淘汰的个数npwhile i<=popsize %将(np+1)~popsize的个体放在toldpop中,共(popsize-np)个 toldpop(j,:)=oldpop(i,:);j=j+1;i=i+1;endfor i=1:(popsize-np) %从小到大顺序排列,将前面np个淘汰oldpop(i,:)=toldpop(i,:); % 适应度是否也要互换?end%*************************转轮法选择操作********************************** function select()global fitness popsize sumfitness oldpop temp mp npsumfitness=0; %个体适应度之和for i=1:(popsize-np-mp) % 仅计算(popsize-np-mp)个个体的选择概率sumfitness=sumfitness+fitness(1,i);endfor i=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;while j<=(popsize-mp) % 从(popsize-mp-np)中选出(popsize-mp)个个体,并放入temp(j,:)中;if b(1,j)<q(1,k)temp(j,:)=oldpop(k,:);j=j+1;elsek=k+1;endendj=popsize-np-mp+1; % 从统一挪过来的(popsize-np-mp)以后个体——优秀个体中选择for i=(popsize-mp+1):popsize % 将mp个保留个体放入交配池temp(i,:),以保证群体数popsizetemp(i,:)=oldpop(j,:);j=j+1;end%*********************%自适应变异操作************************************* function selfmutation()global i popsize lchrom pmutation temp newpop oldpop mp fitness avgfitness maxfitnessm=lchrom*(popsize-mp); % 总的基因数pm1=pmutation;pm2=0.005;a=0;b=10;for i=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); % 变异发生的次数for i=1:n % 执行变异操作循环k=round(rand*(m-1))+1; %确定变异位置(四舍五入取整)j=ceil(k/lchrom); % 确定个体编号(取整)l=rem(k,lchrom); %确定个体中变位基因的位置(求余)if l==0temp(j,lchrom)=~temp(j,lchrom); % 取非操作elsetemp(j,l)=~temp(j,l); % 取非操作endendfor i=1:popsizenewpop(i,:)=temp(i,:); %产生新的个体oldpop(i,:)=newpop(i,:);end%**************************%交叉操作*************************************** function crossover()global temp popsize pcross lchrom mpn=floor(pcross*(popsize-mp)); %交叉发生的次数(向下取整)if rem(n,2)~=0 % 求余n=n+1; % 保证为偶数个个体,便于交叉操作endj=1;m=0;% 对(popsize-mp)个个体将进行随机配对,满足条件者将进行交叉操作(按顺序选择要交叉的对象)for i=1:(popsize-mp)p=rand; % 产生随机数if p<pcross % 满足交叉条件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; % 确定随机位数(四舍五入取整)for i=1:poschild1(1,i)=parent(1,i);child2(1,i)=parent(2,i);endfor i=(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%*********************%最佳个体******************************************** function best()global maxfit bestfit gen maxgen bestgenbestfit=maxfit(1,1);gen=2;while gen<=maxgenif bestfit<maxfit(1,gen)bestfit=maxfit(1,gen);bestgen=gen;endgen=gen+1;end0102030405060708090100024681012Generation F i t n e s s (2)运行结果A.程序运行结果:最优适应值解为bestfit= 11.4862 最优个体所在代数bestgen= 33B.程序运行结果图图2 程序运行结果图。