您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 市场营销 > matlab遗传算法求函数最小值
functionobj=yichuan(lb,ub,px,pm)%lb,ub为自变量的下界与上界,px为杂交概率,pm为变异概率popsize=40;%设定种群大小为40maxgen=500;%设定最大遗传代数为500代dim=20;%定义变量的维数为20bits=20;%设定变量的二进制位数为20duan=20;trace=zeros(maxgen,2);%遗传算法性能跟踪chrom=crt(popsize,dim*bits);%创建初始种群gen=0;%代计数器x=bs(chrom,lb,ub,dim,bits);obj=fun(x);figure(1)plot(obj,'-xr');grid;title('初始种群中个体的分布图')xlabel('个体');ylabel('目标函数值');Nesl=popsize;%轮盘选择个数,设定为与种群大小相等gen=0;%遗传代数计数器,设定初始值为0obj=fun(x);fitv=fel(x);%基于适应度的轮盘选择chrom=exrws(chrom,fitv,Nesl);whilegenmaxgen%单点交叉后得到大小为popsize子代新种群,与原来的父代种群合并为大小为2*popsize的新种群newchrom=[chrom;exxov(chrom,px)];%最优个体保护策略(先提出种群中的最优个体,然后用轮盘选择出Nesl-1个个体%构建成新的种群,再将最优个体插入新种群的第一行)x=bs(newchrom,lb,ub,dim,bits);fitv=fel(x);[Y,I]=max(fitv);newchrom=[newchrom(I,:);exrws(newchrom,fitv,Nesl-1)];%变异概率为pm的基本位变异,假设有N个染色体发生了变异,将这N个染色体插入原来的种群中,得到大小为popsize+N的新种群chrom=[newchrom;exmut(newchrom,pm)];%最优个体保护策略(先提出种群中的最优个体,然后用轮盘选择出Nesl-1个个体%构建成新的种群,再将最优个体插入新种群的第一行)x=bs(chrom,lb,ub,dim,bits);fitv=fel(x);[Y,I]=max(fitv);chrom=[chrom(I,:);exrws(chrom,fitv,Nesl-1)];%计算新种群的目标函数值x=bs(chrom,lb,ub,dim,bits);obj=fun(x);fitv=fel(x);ifgen==20figure(2)plot(obj,'-xr');grid;title('经过20次遗传迭代后种群中个体的分布图')xlabel('个体');ylabel('目标函数值');endifgen==100figure(3)plot(obj,'-xr');grid;title('经过100次遗传迭代后种群中个体的分布图')xlabel('个体');ylabel('目标函数值');endifgen==250figure(4)plot(obj,'-xr');grid;title('经过250次遗传迭代后种群中个体的分布图')xlabel('个体');ylabel('目标函数值');endgen=gen+1;trace(gen,1)=min(obj);trace(gen,2)=sum(obj)/length(obj);aver=zeros(length(fitv),1);aver(:,1)=sum(fitv)/length(fitv);aver=(fitv-aver).^2;trace(gen,3)=sum(aver)/length(fitv);%trace(gen,4)=shang(fitv);%trace(gen,5)=cshang(chrom,duan);endfigure(5)plot(obj,'-xr');grid;title('经过500次遗传迭代后种群中个体的分布图')xlabel('个体');ylabel('目标函数值');obj=min(obj);figure(5)plot(trace(:,1));title('经过500次遗传迭代后种群最优解的变化')xlabel('迭代次数');ylabel('目标函数值');figure(7)plot(trace(:,2));title('经过500次遗传迭代后种群平均值的变化')xlabel('迭代次数');ylabel('目标函数值');figure(8)plot(trace(:,3));xlabel('迭代次数');ylabel('种群的方差');title('500次迭代过程中种群方差的变化');%十进制转换functionphen=bs(chrom,lb,ub,dim,bits)[m,n]=size(chrom);li=[1:bits:n-bits+1];lf=[bits:bits:n];phen=zeros(m,dim);fori=1:dimexchrom=chrom(:,li(i):lf(i));forj=1:bitsphen(:,i)=exchrom(:,j).*2^(bits-j)+phen(:,i);endendphen=lb+phen.*(ub-lb)/(2^bits-1);%创建种群function[chrom]=crt(popsize,bits)chrom=zeros(popsize,bits);fori=1:popsizepop=round(rand(1,bits));chrom(i,:)=pop;endfunctionmutchrom=exmut(chrom,pm)[m,n]=size(chrom);s=rand(m,n)=pm;domut=find(sum(s')0);mutchrom=zeros(length(domut),n);j=1:n;mutchrom=(~chrom(domut,j)).*s(domut,j)+chrom(domut,j).*(~s(domut,j));%基于适应度的轮盘选择functionnewchrom=exrws(chrom,fitv,Nsel);[Nind,ans]=size(fitv);cumfit=cumsum(fitv);decumfit=[0;cumfit(1:Nind-1)];fori=1:Nselch=rand(1)*cumfit(Nind);forj=1:Nindif(ch=cumfit(j))&(chdecumfit(j)),newcode(i)=j;endendendnewchrom=chrom(newcode,:);%单点交叉操作functionnewchrom=exxov(chrom,px)[nind,lind]=size(chrom);docross=rand(nind,1)px;temp=chrom(find(docross),:);[m,n]=size(temp);xops=floor(m/2);odd=1:2:m-1;even=2:2:m;fori=1:xopsdot=ceil(rand(1).*lind);mask=[zeros(1,dot)ones(1,lind-dot)];newtemp(odd(i),:)=(temp(odd(i),:).*mask)+(temp(even(i),:).*(~mask));newtemp(even(i),:)=(temp(even(i),:).*mask)+(temp(odd(i),:).*(~mask));endifrem(m,2),newtemp(m,:)=temp(m,:);endnewchrom(find(docross),:)=newtemp;newchrom(find(~docross),:)=chrom(find(~docross),:);%适应度计算functionfitv=fel(x)ob=512^2*20-fun(x);fitv=ob/sum(ob);%目标函数functiony=fun(x)[nind,lind]=size(x);y=zeros(nind,1);fori=1:lindy=x(:,i).^2+y;end%基本位变异操作functionnewchrom=mut(chrom,pm)[m,n]=size(chrom);s=rand(m,n)=pm;i=1:m;j=1:n;newchrom(i,j)=(~chrom(i,j)).*s(i,j)+chrom(i,j).*(~s(i,j));
本文标题:matlab遗传算法求函数最小值
链接地址:https://www.777doc.com/doc-5803328 .html