发酵人社区,发酵技术论坛,发酵产品,发酵工艺,发酵服务

 找回密码
 立即注册

微信扫一扫,快捷登录!

搜索
热搜: 活动 交友 discuz
查看: 2593|回复: 0

【加密0】【转贴】遗传算法代码

[复制链接]

2676

主题

5878

回帖

1万

积分

超级版主

将我的知识与大家分享

Rank: 8Rank: 8

积分
12363

社区居民忠实会员社区劳模终身成就奖优秀斑竹奖宣传大使奖

QQ
发表于 2006-10-12 20:53:59 | 显示全部楼层 |阅读模式
可能需要修改一下,不过在学习别人的编程思路时会有所收获,特别是发现问题然后修改!
山城棒棒儿军 @ 2005-01-16 16:09


function youhuafun

D=code;
N=50;         % Tunable
maxgen=50;     % Tunable
crossrate=0.5; %Tunable
muterate=0.08;  %Tunable
generation=1;  
num = length(D);
fatherrand=randint(num,N,3);
score = zeros(maxgen,N);
while generation<=maxgen
  ind=randperm(N-2)+2; % 随机配对交叉
  A=fatherrand(:,ind(1N-2)/2));
  B=fatherrand(:,ind((N-2)/2+1:end));
%     多点交叉
  rnd=rand(num,(N-2)/2);
  ind=rnd<crossrate;
  tmp=A(ind);
  A(ind)=B(ind);
  B(ind)=tmp;

% % 两点交叉
%     for kk=1N-2)/2
%         rndtmp=randint(1,1,num)+1;
%         tmp=A(1:rndtmp,kk);
%         A(1:rndtmp,kk)=B(1:rndtmp,kk);
%         B(1:rndtmp,kk)=tmp;
%     end
  fatherrand=[fatherrand(:,1:2),A,B];
   
  % 变异
  rnd=rand(num,N);
  ind=rnd<muterate;
  [m,n]=size(ind);
  tmp=randint(m,n,2)+1;
  tmp(:,1:2)=0;
  fatherrand=tmp+fatherrand;
  fatherrand=mod(fatherrand,3);
%     fatherrand(ind)=tmp;
   
  %评价、选择
  scoreN=scorefun(fatherrand,D);% 求得N个个体的评价函数
  score(generation,=scoreN;
  [scoreSort,scoreind]=sort(scoreN);
  sumscore=cumsum(scoreSort);
  sumscore=sumscore./sumscore(end);
  childind(1:2)=scoreind(end-1:end);
  for k=3:N
      tmprnd=rand;
      tmpind=tmprnd<sumscore;
      difind=[0,diff(tmpind)];
      if ~any(difind)
          difind(1)=1;
      end
      childind(k)=scoreind(logical(difind));
  end
  fatherrand=fatherrand(:,childind);     
  generation=generation+1;
end
% score
maxV=max(score,[],2);
minV=11*300-maxV;
plot(minV,'*');title('各代的目标函数值');
F4=D(:,4);
FF4=F4-fatherrand(:,1);
FF4=max(FF4,1);
D(:,5)=FF4;
save DData D



function D=code
load youhua.mat
% properties F2 and F3
F1=A(:,1);
F2=A(:,2);
F3=A(:,3);
if (max(F2)>1450)||(min(F2)<=900)
  error('DATA property F2 exceed it''s range (900,1450]')
end
% get group property F1 of data, according to F2 value
F4=zeros(size(F1));
for ite=11:-1:1
  index=find(F2<=900+ite*50);
  F4(index)=ite;
end
D=[F1,F2,F3,F4];

function ScoreN=scorefun(fatherrand,D)
F3=D(:,3);
F4=D(:,4);
N=size(fatherrand,2);
FF4=F4*ones(1,N);
FF4rnd=FF4-fatherrand;
FF4rnd=max(FF4rnd,1);
ScoreN=ones(1,N)*300*11;
% 这里有待优化
for k=1:N
  FF4k=FF4rnd(:,k);
  for ite=1:11
      F0index=find(FF4k==ite);
      if ~isempty(F0index)
          tmpMat=F3(F0index);
          tmpSco=sum(tmpMat);
          ScoreBin(ite)=mod(tmpSco,300);
      end
  end
  Scorek(k)=sum(ScoreBin);
end
ScoreN=ScoreN-Scorek;
欢迎关注发酵人自己的微信号: comefajiaoren
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|发酵人社区发酵技术论坛,发酵产品,发酵工艺,发酵服务 ( 沪ICP备16030267号

GMT+8, 2024-5-15 14:42 , Processed in 0.219339 second(s), 9 queries , MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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