fori=1:sizepop % 随机选择两个染色体进行交叉 pick=rand(1,2); while prod(pick)==0 pick=rand(1,2); end index=ceil(pick.*sizepop); % 交叉概率决定是否进行交叉 pick=rand; while pick==0 pick=rand; end if pick>pcross continue; end flag=0; while flag==0 % 随机选择交叉位置 pick=rand; while pick==0 pick=rand; end pos=ceil(pick.*sum(lenchrom)); %随机选择进行交叉的位置,即选择第几个变量进行交叉,注意:两个染色体交叉的位置相同 pick=rand; %交叉开始 v1=chrom(index(1),pos); v2=chrom(index(2),pos); chrom(index(1),pos)=pick*v2+(1-pick)*v1; chrom(index(2),pos)=pick*v1+(1-pick)*v2; %交叉结束 flag1=test(lenchrom,bound,chrom(index(1),:)); %检验染色体1的可行性 flag2=test(lenchrom,bound,chrom(index(2),:)); %检验染色体2的可行性 if flag1*flag2==0 flag=0; else flag=1; end%如果两个染色体不是都可行,则重新交叉 end end ret=chrom;
fori=1:sizepop % 随机选择一个染色体进行变异 pick=rand; while pick==0 pick=rand; end index=ceil(pick*sizepop); % 变异概率决定该轮循环是否进行变异 pick=rand; if pick>pmutation continue; end flag=0; while flag==0 % 变异位置 pick=rand; while pick==0 pick=rand; end pos=ceil(pick*sum(lenchrom)); %随机选择了染色体变异的位置,即选择了第pos个变量进行变异 v=chrom(i,pos); v1=v-bound(pos,1); v2=bound(pos,2)-v; pick=rand; %变异开始 if pick>0.5 delta=v2*(1-pick^((1-pop(1)/pop(2))^2)); chrom(i,pos)=v+delta; else delta=v1*(1-pick^((1-pop(1)/pop(2))^2)); chrom(i,pos)=v-delta; end%变异结束 flag=test(lenchrom,bound,chrom(i,:)); %检验染色体的可行性 end end ret=chrom;
flag=0; while flag==0 pick=rand(1,length(lenchrom)); ret=bound(:,1)'+(bound(:,2)-bound(:,1))'.*pick; %线性插值 flag=test(lenchrom,bound,ret); %检验染色体的可行性 end
test函数
1 2 3 4 5 6 7 8 9 10 11
functionflag=test(lenchrom,bound,code) % lenchrom input : 染色体长度 % bound input : 变量的取值范围 % code output: 染色体的编码值 flag=1; [n,m]=size(code);%%n=1 m=5 fori=1:n if code(i)<bound(i,1) || code(i)>bound(i,2)%%如果编码后的值在取值范围之内,则flag标记为0 flag=0; end end
非线性寻优
1 2 3 4 5 6
functionret = nonlinear(chrom,sizepop)
fori=1:sizepop x=fmincon(inline('-5*sin(x(1))*sin(x(2))*sin(x(3))*sin(x(4))*sin(x(5))-sin(5*x(1))*sin(5*x(2))*sin(5*x(3))*sin(5*x(4))*sin(5*x(5))'),chrom(i,:)',[],[],[],[],[00000],[2.82742.82742.82742.82742.8274]); ret(i,:)=x'; end