找回密码
 注册
Simdroid-非首页
查看: 196|回复: 1

[原创]一个遗传算法的小例子

[复制链接]
发表于 2010-7-4 09:58:00 | 显示全部楼层 |阅读模式 来自 甘肃
遗传算法matlab是有工具箱的,但是掌握其原理有助于更好的运用,下面是我编的一个遗传算法的小例子,对遗传算法有一定了解的初学者,应该会有帮助
% f(x1,x2)=21.5+x1.*sin(4*pi*x1)+x2.*sin(20*pi*x2);
% -3.0<=x1<=12.1
% 4.1<=x2<=5.8
% 求此函数的极大值

  1. % f(x1,x2)=21.5+x1.*sin(4*pi*x1)+x2.*sin(20*pi*x2);
  2. % -3.0<=x1<=12.1
  3. % 4.1<=x2<=5.8
  4. % 求此函数的极小值
  5. % ga
  6. function [x1,x2,ff,j]=Myga(iterN,err)
  7. if nargin==0
  8.     iterN=1000;err=0.8;
  9. end
  10. tic
  11. x1a=-3.0;x1b=12.1;
  12. x2a=4.1;x2b=5.8;
  13. m1=18;m2=15;
  14. M=100;
  15. len=33;
  16. Pc=0.25;Pm=0.01;
  17. chrom=randint(M,len,[0,1]);
  18. U=zeros(size(chrom));
  19. hh= waitbar(0,'Please wait...');
  20. rand('twister', sum(100*clock));
  21. for j=1:iterN
  22.     [evalU,valU]=compute(M,chrom,m1,m2,x1a,x1b,x2a,x2b);
  23.     if max(evalU)-min(evalU)<err
  24.         [cc,dd]=max(evalU);
  25.         x1=valU(dd,1);
  26.         x2=valU(dd,2);
  27.         ff=max(evalU);
  28.         return
  29.     end
  30.     %% 选择
  31.     F=sum(evalU);
  32.     Pk=evalU/F;
  33.     Qk=cumsum(Pk);
  34.     for i=1:M
  35.         a=find(Qk>rand,1);
  36.         U(i,:)=chrom(a,:);
  37.     end
  38.     %% 交叉
  39.     randdata=rand(10,1);
  40.     a=find(randdata<Pc);
  41.     if length(a)>=2
  42.         if mod(length(a),2)==1
  43.             a(end)=[];
  44.         end
  45.         a1=a(1:2:end);
  46.         a2=a(2:2:end);
  47.         for i=1:length(a1)
  48.             p=U(a1(i),:);
  49.             q=U(a2(i),:);
  50.             aa=randint(1,1,[1,len-1]);
  51.             temp=p(aa+1:end);
  52.             p(aa+1:end)=q(aa+1:end);
  53.             q(aa+1:end)=temp;
  54.             U(a1(i),:)=p;
  55.             U(a2(i),:)=q;
  56.         end
  57.     end
  58.     %% 变异
  59.     aa=rand(M,len);
  60.     [I,J]=find(aa<Pm);
  61.     for i=1:length(I)
  62.         U(I(i),J(i))=not(U(I(i),J(i)));
  63.     end
  64.     chrom=U;
  65.     mcc=j/iterN;
  66.     waitbar(mcc,hh,['now....',num2str(round(100*mcc)),'%']);
  67. end
  68. [cc,dd]=max(evalU);
  69. x1=valU(dd,1);
  70. x2=valU(dd,2);
  71. ff=max(evalU);
  72. close(hh);
  73. toc
  74. function [evalU,valU]=compute(M,chrom,m1,m2,x1a,x1b,x2a,x2b)
  75. dat1=0:m1-1;
  76. dat2=0:m2-1;
  77. valU=zeros(M,2);
  78. evalU=zeros(M,1);
  79. for i=1:M
  80.     valUt1=sum(2.^dat1.*chrom(i,1:m1));
  81.     valU(i,1)=x1a+valUt1*(x1b-x1a)/(2^m1-1);
  82.     valUt2=sum(2.^dat2.*chrom(i,m1+1:end));
  83.     valU(i,2)=x2a+valUt2*(x2b-x2a)/(2^m2-1);
  84.     evalU(i)=myfun(valU(i,1),valU(i,2));
  85. end
  86. function y=myfun(x1,x2)
  87. y=21.5+x1.*sin(4*pi*x1)+x2.*sin(20*pi*x2);
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2016-5-13 16:00:05 | 显示全部楼层 来自 湖北武汉
Simdroid开发平台
是挺好的,有多目标物资调度优化方面的吗
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-17 05:42 , Processed in 0.049815 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表