当前位置:文档之家› 进化算法程序

进化算法程序

进化算法作业1全局优化问题(1) minf1x 4x:2.1x: 1 x f x1x24x f 4x;st . 5 x i5,i 1,2一.程序(1)主函数:mai n.mclear all;clc;popsize=60; %种群规模chromlength=34; %二进制编码,编码精度为0.0001,所以串长I为17pc=0.7; %杂交概率pm=0.1; %变异概率t=0; %进化代数初始为0pop=in itpop(popsize,chromle ngth); % 随机产生初始种群while t<500 %迭代次数t=t+1;[objvalue]=calobjvalue(pop); % 计算目标函数值fitvalue=calfitvalue(objvalue); %计算群体中每个个体的适应度[best in dividual,bestfit]=best(pop,fitvalue); %求出群体中适应度最大的个体及其适应度值x1仁decodechrom(besti ndividual,1,14); % 将二进制数转换为十进制数x22=decodechrom(besti ndividual,15,14);x1(t)=-5+10*x11/(pow2(14)-1); %将二值域中的数转换为变量域的数x2(t)=-5+10*x22/(pow2(14)-1);y(t)=4*x1(t)A2-2.1*x1(t)A4+1/3*x1(t)A6+x1(t)*x2(t)-4*x2(t)A2+4*x2(t)A4; % 计算最佳个体的目标函数值[n ewpop1]=select ion( pop,fitvalue); % 选择算子[n ewpop2]=crossover( newpop1,pc); % 交叉算子[n ewpop3]=mutati on(n ewpop2,pm); % 变异算子objvalue1=calobjvalue (n ewpop3(1,:));if objvalue1>y(t)newpop3(1,:)=best in dividual; % 保留最佳个体endpop=newpop3; %产生新种群endy; %每代的最佳目标函数值x1; %每代的最佳目标函数值对应的自变量x2;[gy,k]=min(y) %gy 为全局最优值,k 为最优值对应的进化代数此问题的全局最优值f min 1.0316。

gx1=x1(k) %全局最优值对应的自变量gx2=x2(k)plot(y) %最优值收敛曲线title(' 收敛性曲线');xlabel(' 进化代数');ylabel(' 函数值'); axis([0,500,-1.5,1.5]);(2)初始种群:initpop.mfunction pop=initpop(popsize,chromlength)pop=round(rand(popsize,chromlength)); %rand 随机产生[0,1] 区间的一个小数,rand 四舍五入取整end(3)计算目标函数值::calobjvalue.m function [objvalue] =calobjvalue( pop )temp1=decodechrom(pop,1,14);temp2=decodechrom(pop,15,14); x1=-5+(10*temp1)/(pow2(14)-1); %将二值域中的数转化为变量域中的数x2=-5+(10*temp2)/(pow2(14)-1);0bjvalue=4*x1.A2-2.1*x1.A4+1/3*x1.A6+x1.*x2-4*x2.A2+4*x2.A4; % 计算目标函数enda.二进制转换为十进制:decodechrom.mfuncti0n temp=dec0dechr0m(p0p,sp0int,length )pop1=pop(:,spoint:spoint+length-1); %按变量个数分组转换,spoint 为起始点,length 为一个变量的长度temp=decodebinary(pop1);endb.求二进制串对应的十进制数:decodeb in ary.mfunction temp =decodebinary( pop)[px,py]=size(pop); %求pop 行数和列数for i=1:pypop1(:,i)=24(py-i).*pop(:,i);endtemp=sum(pop1,2); %每一行求和end(4)计算个体适应度:calfitvalue.m function fitvalue= calfitvalue( objvalue )fitvalue=1./(1+exp(objvalue));end(5)种群中最大适应度个体及其值:best.m function [bestindividual,bestfit] = best(pop,fitvalue ) [px,py]=size(pop);bestindividual=pop(1,:); bestfit=fitvalue(1);for i=2:px;if fitvalue>bestfitbestindividual=pop(i,:); best=fitvalue(i);endendend(6)选择算子:selection.mfunction [newpop1]=selection(pop,fitvalue) totalfit=sum(fitvalue); % 适应度和ps=fitvalue./totalfit; %单个个体被选择的概率pss=cumsum(ps); % 前几项累积和[px,py]=size(pop); ms=sort(rand(px,1)); %随机产生px 个0,1 之间的数,并按升序排列fitin=1; newin=1;while newin<=px if(ms(newin)<pss(fitin))newpop1(newin,:)=pop(fitin,:); newin=newin+1;elsefitin=fitin+1;endendend(7)交叉算子:crossover.mfunction [newpop2] = crossover( pop,pc ) [px,py]=size(pop);newpop2=ones(size(pop));for i=1:2:px-1if rand<pc cpoint=round(rand*py); %随机产生一个交叉位newpop2(i,:)=[pop(i,1:cpoint),pop(i+1,cpoint+1:py)]; %交换相邻两个个体交叉位之后的基因newpop2(i+1,:)=[pop(i+1,1:cpoint),pop(i,cpoint+1:py)];elsen wepop2(i,:)=pop(i,:); n ewpop2(i+1,:)=pop(i+1,:); end end end(8) 变异算子:mutatio n.mfunction [n ewpop3] = mutati on( pop,pm ) [px,py]=size(pop); n ewpop3=pop; for i=1:pxif(ra nd<pm)mpoi nt=rou nd(ra nd*py); %随机产生一个变异位 if mpoin t<=0mpoin t=1; endif (n ewpop3(i,mpoi nt)==O) % 变为等为基因n ewpop3(i,mpo in t)=1; elsen ewpop3(i,mpo in t)=0; end end end end.独立运行程序 30次的结果最好目标函数值:-1.0316 平均目标函数值:-0.9914最差目标函数值:-0.9751标准方差:0.0286最好解:x1=0.0919 x2=-0.7126最好值:-1.0316运行结果及收敛性曲线如下图:5 1 2 5 2 1(x2 2x" x1 6)2 10 1 cos x14 28st. 5 X i 5 , i 1,2(1)主函数:mai n.mclear all;clcpopsize=40; %种群规模chromlength=28; %二进制编码,编码精度为0.001,所以串长I为14pc=0.8; %杂交概率pm=0.2; %变异概率t=0;pop=in itpop(popsize,chromle ngth); % 随机产生初始种群while t<500 %迭代次数t=t+1;[objvalue]=calobjvalue(pop); % 计算目标函数值fitvalue=calfitvalue(objvalue); %计算群体中每个个体的适应度[best in dividual,bestfit]=best(pop,fitvalue); %求出群体中适应度最大的个体及其适应度值x1仁decodechrom(besti ndividual,1,14); % 将二进制数转换为十进制数SOT—cs. cm m□ . 71 EU运行结果收敛性曲线此问题的全局最优值min 0.398。

(2) min f2 x 10x22=decodechrom(besti ndividual,15,14);x1(t)=-5+10*x11/(pow2(14)-1); % 将二值域中的数转换为变量域的数x2(t)=-5+10*x22/(pow2(14)-1);y(t)=(x2(t)-5.1/(4*pi*pi).*x1(t)A2+5/pi.*x1(t)-6)A2+10.*(1-1/(8*pi)).*cos(x1(t))+10; 算最佳个体的目标函数值[newpop1]=selection(pop,fitvalue); %选择算子[newpop2]=crossover(newpop1,pc); %杂交算子[newpop3]=mutation(newpop2,pm); %变异算子objvalue1=calobjvalue(newpop3(1,:));if objvalue1>y(t) newpop3(1,:)=bestindividual; %保留最佳个体endpop=newpop3; %产生新种群endy; % 每代的最佳目标函数值x1; %每代的最佳目标函数值对应的自变量x2;[gy,k]=min(y); %全局最优值gy=vpa(gy,3) %设置输出精度gx1=x1(k); %全局最优值对应的自变量x1=vpa(gx1,4)gx2=x2(k);x2=vpa(gx2,4)plot(y) %最优值收敛曲线title(' 收敛性曲线');xlabel(' 进化代数');ylabel(' 函数值');axis([0,500,0.2,1.5]);(2 )初始种群:initpop.mfunction pop=initpop(popsize,chromlength)pop=round(rand(popsize,chromlength)); %rand 随机产生[0,1] 区间的一个小数,取整end(3)计算目标函数值::calobjvalue.m function [objvalue] =calobjvalue( pop ) temp1=decodechrom(pop,1,14); temp2=decodechrom(pop,15,14);x1=-5+(10*temp1)/(pow2(14)-1); %将二值域中的数转化为变量域中的数x2=-5+(10*temp2)/(pow2(14)-1);objvalue=(x2-5.1/(4*pi*pi).*x1.A2+5/pi.*x1-6).A2+10.*(1-1/(8*pi)).*cos(x1)+10; enda.二进制转换为十进制:decodechrom.m%计rand 四舍五入function temp=decodechrom(pop,spoint,length ) pop1=pop(:,spoint:spoint+length-1); %按变量个数分组转换,spoint 为起始点,length 为一个变量的长度temp=decodebinary(pop1);endb.求二进制串对应的十进制数:decodeb in ary.mfunction temp =decodebinary( pop)[px,py]=size(pop); %求pop 行数和列数for i=1:pypop1(:,i)=24(py-i).*pop(:,i);endtemp=sum(pop1,2); %每一行求和end(4)计算个体适应度:calfitvalue.mfunction fitvalue= calfitvalue( objvalue ) fitvalue=1./(1+exp(objvalue));end(5)种群中最大适应度个体及其值:best.mfunction [bestindividual,bestfit] = best(pop,fitvalue ) [px,py]=size(pop);bestindividual=pop(1,:); bestfit=fitvalue(1);for i=2:px;if fitvalue>bestfitbestindividual=pop(i,:); best=fitvalue(i);endendend(6)选择算子:selection.mfunction [newpop1]=selection(pop,fitvalue)totalfit=sum(fitvalue); %适应度和ps=fitvalue./totalfit; %单个个体被选择的概率pss=cumsum(ps); %前几项累积和[px,py]=size(pop);ms=sort(rand(px,1)); %随机产生px个0,1之间的数,并按升序排列fitin=1;newin=1;while newin<=pxif(ms(newin)<pss(fitin))newpop1(newin,:)=pop(fitin,:); newin=newin+1;else fitin=fitin+1;endendend(7)交叉算子:crossover.m function [newpop2] = crossover( pop,pc ) [px,py]=size(pop); newpop2=ones(size(pop));for i=1:2:px-1if rand<pc cpoint=round(rand*py); %随机产生一个交叉位newpop2(i,:)=[pop(i,1:cpoint),pop(i+1,cpoint+1:py)]; 后的基因%交换相邻两个个体交叉位之newpop2(i+1,:)=[pop(i+1,1:cpoint),pop(i,cpoint+1:py)]; elsenwepop2(i,:)=pop(i,:); newpop2(i+1,:)=pop(i+1,:);endendend(8)变异算子:mutation.m function [newpop3] = mutation( pop,pm ) [px,py]=size(pop); newpop3=pop;for i=1:pxif(rand<pm) mpoint=round(rand*py); %随机产生一个变异位if mpoint<=0mpoint=1;endif (newpop3(i,mpoint)==0) %变为等为基因newpop3(i,mpoint)=1;else newpop3(i,mpoint)=0;endendendend.独立运行程序 30次的结果最差目标函数值:0.445标准方差:1.886e-004三•最好的一次结果最好解: x1=3.145 x2=2.265 最好值: 0.398 运行结果及收敛性曲线如下图:10(3) min f 3 x X :i 1st. 100 X i 100,i 1,2,,10此问题的全局最优值 f min 0。

相关主题