资源描述:
《一种新的遗传算法完整代码,无需调试.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、一种新的遗传算法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=len
2、gth(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
3、每个变量的编码长度%如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(k4、=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,le
5、n]=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)6、endif(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)
7、;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)转换正
8、整数向量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