您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 交通运输 > 一种新的遗传算法完整代码,无需调试
一种新的遗传算法matlab完整代码带说明function[B,len,v]=B2F(sol,bounds)%[B,len]=B2F(x,bounds)二进制编码函数%x编码向量如x=[689];%bounds边界约束ru如bounds=[48;311;612;];%B二进制编码串%编码长度L由bounds(2)-bounds(1)决定%以上为例:%编码长度向量L=[486]编成二进制L=[111000110],则len=[243]%计算B=x-bound(1)=[253]编成二进制B=[100101011]n=length(sol);len=[];B=[];v=[];L=bounds(:,2)-bounds(:,1);L=de2bi(L);fori=1:nlen(i)=length(L(i,:));endv=sol-bounds(:,1)';fori=1:nB=[Bde2bi(v(i),len(i))];endfunction[pops]=changes(cpop,bounds,len,p)%基因突变函数%function[pops]=changes(pop,bounds,len,p)%pop种群数目%bounds边界约束%len每个变量的编码长度%如len为[433];表示有三个变量,第一个变量的二进制编码长度为4,依次类推%p突变概率%pops返回突变后的基因%p1基因突变数目ifisempty(p)p=0.01;end[n,m]=size(cpop);pop=cpop;p1=round(sum(len)*n*p);k=0;q=[];v=[];while(kp1)k=k+1;q(k)=round(rand*(sum(len)*n-1))+1;fori=1:k-1ifq(k)==q(i)q(k)=[];k=k-1;endendendfori=1:n[B(i,:),len]=B2F(pop(i,:),bounds);endv=reshape(B,1,n*sum(len));fori=1:p1ifv(q(i))==0v(q(i))=1;elsev(q(i))=0;endendv=reshape(v,n,sum(len));fori=1:npop(i,:)=F2B(v(i,:),bounds,len);endpops=popcpopfunction[cpop,len,v]=cross(child,bounds,CP)%交叉函数,采取点交叉%[newpop,len]=cross(child,bounds,CP)%child复制后的种群%bounds边界约束%CP交叉概率%newpop交叉后的新种群%len每个变量的编码长度%如len返回为[433];表示有三个变量,第一个变量的二进制编码长度为4,依次类推ifisempty(CP)CP=0.25;end[n,m]=size(child);B=[];len=[];t=[];mychild=child(:,1:end-1);v=[];p=rand(1,n);k=1;fori=1:nifp(i)CPv(k)=i;k=k+1;endendif(rem(k,2)==0)temp=v(k-1);while(temp==v(k-1))temp=round(rand*(n-1))+1;endv(k)=temp;k=k+1;endifisempty(v)[B(i,:),len]=B2F(mychild(1,:),bounds);B=[];elsefori=1:k-1[B(i,:),len]=B2F(mychild(v(i),:),bounds);endfori=1:2:k-2p2=round(rand*sum(len)-1)+1;t=zeros(1,p2);t(i,:)=B(i,1:p2);B(i,1:p2)=B(i+1,1:p2);B(i+1,1:p2)=t(i,:);endfori=1:k-1mychild(v(i),:)=F2B(B(i,:),bounds,len);endendcpop=mychild;functionb=de2bi(d,n,p)%functionb=de2bi(d,n,p)%DE2BI转换10进制数为二进制数。%B=DE2BI(D)转换正整数向量D成二进制矩阵B。%二进制矩阵B的每一行表示十进制向量D中相应的数。%B=DE2BI(D,N)转换正整数向量D成二进制矩阵B,%但指定B的列数为N。%B=DE2BI(D,N,P)转换正整数向量D成p进制矩阵B。%p进制矩阵B的每一行表示十进制向量D中相应的数。d=d(:);len_d=length(d);ifmin(d)0,error('Cannotconvertanegativenumber');elseif~isempty(find(d==inf)),error('InputmustnotbeInf.');elseiffind(d~=floor(d)),error('Inputmustbeaninteger.');end;ifnargin2,tmp=max(d);b1=[];whiletmp0b1=[b1rem(tmp,2)];tmp=floor(tmp/2);end;n=length(b1);end;ifnargin3,p=2;end;b=zeros(len_d,n);fori=1:len_dj=1;tmp=d(i);while(j=n)&(tmp0)b(i,j)=rem(tmp,p);tmp=floor(tmp/p);j=j+1;end;end;function[pops,len]=F2B(x,bounds,len)%二进制编码转化为十进制%[pops]=F2B(x,bounds,len)%x二进制串如x=[011001010101]%len二进制串的分段len=[345]%bounds边界约束%pops十进制n=length(x);m=length(len);q=[];fori=1:mq(i)=sum(len(1:i));endq=[0q];forj=1:mpops(j)=bounds(j,1);p=[];p=x(q(j)+1:q(j+1));L1=q(j+1)-q(j);fork=1:L1pops(j)=pops(j)+p(k)*2^(k-1);endendfunction[sol,eval]=f553(sol,options)m(1)=sol(1);m(2)=sol(2);m(3)=sol(3);%失效概率矩阵q=[0.010.050.100.18;0.080.020.150.12;0.040.050.200.10];%约束条件g1=51-(m(1)+3).^2+m(2).^2+m(3).^2;g2=20*sum(m+exp(-m))-120;g3=20*sum(m.*exp(-m/4))-65;%计算加惩罚项的适值if((g1=0)&(g2=0)&(g3=0))multi=1;fori=1:3summ=0;forj=2:4summ=summ+q(i,j).^(m(i)+1);endmulti=multi*(1-(1-(1-q(i,1)).^(m(i)+1))-summ);endeval=multi;else%取M=500eval=-500;endfunction[f,x]=myga(num,bounds,Myfun,N,CP,P)%[f,x]=ga(num,bounds,fun,N,CP,P)%该遗传算法适用于:%目标函数为求最大值,且解非负整数解%bounds边界约束%Myfun为目标函数%num初始种群数%N最大迭代次数%CP交叉概率%P突变概率%f目标最优解%x最优解向量m=nargin;ifm6disp('-_-错误!')disp('输入变量太少')disp('按回车键查看帮助')pausehelpgaf='-_-';x='没有规矩不成方圆';break;endpop=INTinti(num,bounds);fmax=pop(:,end);endpop=pop;n=size(endpop,2);k=0;x=[];f=zeros(1,num);while(kN)pop=mutation(endpop);[cpop,len,v]=cross(pop,bounds,CP);[pops]=changes(cpop,bounds,len,P);break;fori=1:numsol=pops(i,:);[f(i)]=Myfun(sol);iffmax(i)f(i)fmax(i)=f(i);endpop(i,1:end-1)=pops(i,:);endendendpop(:,end)=fmax(:);k=k+1;end[f,ii]=max(fmax);x=endpop(ii,1:end-1);function[sol,eval]=gaDemo1Eeval(sol,options)x=sol(1);eval=x+10*sin(5*x)+7*cos(4*x);%参数说明%eval:个体的适应度;%sol:当前个体,n+1个元素的行向量。function[pop]=INTinti(num,bounds)%[pop]=INTinti(num,bounds)%inti编码函数%num种群数%bounds边界约束n=size(bounds,1);L=bounds(:,2)-bounds(:,1);p=rand(num,n);fori=1:nump(i,:)=round(p(i,:).*L');pop(i,:)=p(i,:)+bounds(:,1)';f(i)=myfun(pop(i,:));endpop=[popf'];function[child]=mutation(pop)%复制函数,采取小盘轮转法%[child]=mutation(pop)%mutation编码%pop初始种群%child返回复制后的种群%pop(:,end)适值度[n,m]=size(pop);f=pop(:,end);value=sum(f);fori=1:np(i)=f(i)/value;q(i)=sum(p(1:i));endt=rand(1,n);forj=1:nfork=1:nift(j)q(k)v(j)=k;breakendendendi=1:n;child(i,:)=pop(v(i),:);function[f]=myfun(sol,bnd)x=sol;n=length(x);f=0;fori=1:nf=f+x(i)*i;endfunction[f,x]=myga(num,bounds,N,CP,P)%[f,x]=ga(num,bounds,fun,N,CP,P)%[f,x]=myga([],bounds,[],[],[])%该遗传算法适用于:%目标函数为求最大值,且解非负整数解%bounds边界约束%Myfun为目标函数%num初始种群数%N最大迭代次数%CP交叉概率%P突变概率%f目标最优解%x最优解向量m=nargin;ifm5disp('-_-错误!')disp('输入变量太少')disp('按回车键查看帮助')pausehelpgaf='-_-';x='没有规矩不成方圆';break;endifisempty(CP)CP=0.25;endifisempty(P)P=0.01;endifisempty(N)N=1000;endifany(bounds(:,1))0disp('-_-错误!')disp('按回车键查看帮助')pausehelpgaf='-_-';x='没有规矩不成方圆';break;endifisempty(num)num=100;endpop=INTinti(num,bounds);fmax=pop(:,end);endpop=pop;n=size(endpop,2);count=0;x=[];f=zeros(1,num);while(countN
本文标题:一种新的遗传算法完整代码,无需调试
链接地址:https://www.777doc.com/doc-2814628 .html