cross.m
上传用户:qzfzqd
上传日期:2013-04-17
资源大小:7k
文件大小:1k
源码类别:

matlab例程

开发平台:

Matlab

  1. function  [cpop ,len,v]=cross(child,bounds,CP)
  2. %交叉函数,采取点交叉
  3. %[newpop ,len]=cross(child,bounds,CP)
  4. %child      复制后的种群
  5. %bounds     边界约束
  6. %CP         交叉概率
  7. %newpop     交叉后的新种群
  8. %len        每个变量的编码长度
  9. %           如len返回为[4 3 3];表示有三个变量,第一个变量的二进制编码长度为4,依次类推
  10. %           作者:机自01-2班曾新海
  11. %           zxh21st@163.com
  12. if isempty(CP)
  13.     CP=0.25;
  14. end
  15. [n ,m]=size(child);
  16. B=[];len=[];t=[];
  17. mychild=child(:,1:end-1);
  18. v=[];
  19. p=rand(1,n);
  20. k=1;
  21.     for i=1:n
  22.         if p(i)<CP
  23.             v(k)=i;
  24.             k=k+1;
  25.         end
  26.     end
  27.     if (rem(k,2)==0)
  28.         temp=v(k-1);
  29.         while (temp==v(k-1))
  30.         temp=round(rand*(n-1))+1;
  31.     end
  32.     v(k)=temp;
  33.     k=k+1;
  34.    end 
  35. if isempty(v)
  36.     [B(i,:),len]=B2F(mychild(1,:),bounds);
  37.     B=[];
  38. else
  39.     for i=1:k-1
  40. [B(i,:),len]=B2F(mychild(v(i),:),bounds);
  41. end
  42. for i=1:2:k-2
  43.     p2=round(rand*sum(len)-1)+1;
  44.     t=zeros(1,p2);
  45.     t(i,:)=B(i,1:p2);
  46.     B(i,1:p2)=B(i+1,1:p2);
  47.     B(i+1,1:p2)=t(i,:);
  48. end
  49. for i=1:k-1
  50.    mychild(v(i),:)=F2B(B(i,:),bounds,len);
  51. end
  52. end
  53. cpop=mychild;