资源描述:
《一种新的遗传算法完整代码,无需调试》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
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
2、=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
3、边界约束%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(k4、ndendendfori=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)%交叉函数,
5、采取点交叉%[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
6、)7、(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的每一行表示
8、十进制向量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