乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      matlab gatool 實例

       kakaxi 2008-05-25
      遺傳算法matlab代碼
      2008-02-11 16:13
      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(1:(N-2)/2));
         B=fatherrand(:,ind((N-2)/2+1:end));
      %     多點交叉
         rnd=rand(num,(N-2)/2);
         ind=rnd   tmp=A(ind);
         A(ind)=B(ind);
         B(ind)=tmp;
      % % 兩點交叉
      %     for kk=1:(N-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   [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個個體的評價函數(shù)
         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       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(‘各代的目標函數(shù)值‘);
      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;
      % 這里有待優(yōu)化
      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;

       
       
      遺傳算法程序 matlab
      2006年12月09日 星期六 20:53
      遺傳算法程序
      本程序收集于網(wǎng)絡,本人并未進行過運行,如有問題請與作者聯(lián)系,如有侵權請告之
      遺傳算法程序:
         說明: fga.m 為遺傳算法的主程序; 采用二進制Gray編碼,采用基于輪盤賭法的非線性排名選擇, 均勻交叉,變異操作,而且還引入了倒位操作!
      function [BestPop,Trace]=fga(FUN,LB,UB,eranum,popsize,pCross,pMutation,pInversion,options)
      % [BestPop,Trace]=fmaxga(FUN,LB,UB,eranum,popsize,pcross,pmutation)
      % Finds a  maximum of a function of several variables.
      % fmaxga solves problems of the form: 
      %      max F(X)  subject to:  LB <= X <= UB                           
      %  BestPop       - 最優(yōu)的群體即為最優(yōu)的染色體群
      %  Trace         - 最佳染色體所對應的目標函數(shù)值
      %  FUN           - 目標函數(shù)
      %  LB            - 自變量下限
      %  UB            - 自變量上限
      %  eranum        - 種群的代數(shù),取100--1000(默認200)
      %  popsize       - 每一代種群的規(guī)模;此可取50--200(默認100)
      %  pcross        - 交叉概率,一般取0.5--0.85之間較好(默認0.8)
      %  pmutation     - 初始變異概率,一般取0.05-0.2之間較好(默認0.1)
      %  pInversion    - 倒位概率,一般取0.05-0.3之間較好(默認0.2)
      %  options       - 1*2矩陣,options(1)=0二進制編碼(默認0),option(1)~=0十進制編
      %碼,option(2)設定求解精度(默認1e-4)
      %
      %  ------------------------------------------------------------------------
      T1=clock;
      if nargin<3, error(‘FMAXGA requires at least three input arguments‘); end
      if nargin==3, eranum=200;popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];end
      if nargin==4, popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];end
      if nargin==5, pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];end
      if nargin==6, pMutation=0.1;pInversion=0.15;options=[0 1e-4];end
      if nargin==7, pInversion=0.15;options=[0 1e-4];end
      if find((LB-UB)>0)
         error(‘數(shù)據(jù)輸入錯誤,請重新輸入(LB<UB):‘);
      end
      s=sprintf(‘程序運行需要約%.4f 秒鐘時間,請稍等......‘,(eranum*popsize/1000));
      disp(s);
      global m n NewPop children1 children2 VarNum
      bounds=[LB;UB]‘;bits=[];VarNum=size(bounds,1);
      precision=options(2);%由求解精度確定二進制編碼長度
      bits=ceil(log2((bounds(:,2)-bounds(:,1))‘ ./ precision));%由設定精度劃分區(qū)間
      [Pop]=InitPopGray(popsize,bits);%初始化種群
      [m,n]=size(Pop);
      NewPop=zeros(m,n);
      children1=zeros(1,n);
      children2=zeros(1,n);
      pm0=pMutation;
      BestPop=zeros(eranum,n);%分配初始解空間BestPop,Trace
      Trace=zeros(eranum,length(bits)+1);
      i=1;
      while i<=eranum
          for j=1:m
              value(j)=feval(FUN(1,:),(b2f(Pop(j,:),bounds,bits)));%計算適應度
          end
          [MaxValue,Index]=max(value);
          BestPop(i,:)=Pop(Index,:);
          Trace(i,1)=MaxValue;
          Trace(i,(2:length(bits)+1))=b2f(BestPop(i,:),bounds,bits);
          [selectpop]=NonlinearRankSelect(FUN,Pop,bounds,bits);%非線性排名選擇
      [CrossOverPop]=CrossOver(selectpop,pCross,round(unidrnd(eranum-i)/eranum));
      %采用多點交叉和均勻交叉,且逐步增大均勻交叉的概率
          %round(unidrnd(eranum-i)/eranum)
          [MutationPop]=Mutation(CrossOverPop,pMutation,VarNum);%變異
          [InversionPop]=Inversion(MutationPop,pInversion);%倒位
          Pop=InversionPop;%更新
      pMutation=pm0+(i^4)*(pCross/3-pm0)/(eranum^4);
      %隨著種群向前進化,逐步增大變異率至1/2交叉率
          p(i)=pMutation;
          i=i+1;
      end
      t=1:eranum;
      plot(t,Trace(:,1)‘);
      title(‘函數(shù)優(yōu)化的遺傳算法‘);xlabel(‘進化世代數(shù)(eranum)‘);ylabel(‘每一代最優(yōu)適應度(maxfitness)‘);
      [MaxFval,I]=max(Trace(:,1));
      X=Trace(I,(2:length(bits)+1));
      hold on;  plot(I,MaxFval,‘*‘);
      text(I+5,MaxFval,[‘FMAX=‘ num2str(MaxFval)]);
      str1=sprintf(‘進化到 %d 代 ,自變量為 %s 時,得本次求解的最優(yōu)值 %f\n對應染色體是:%s‘,I,num2str(X),MaxFval,num2str(BestPop(I,:)));
      disp(str1);
      %figure(2);plot(t,p);%繪制變異值增大過程
      T2=clock;
      elapsed_time=T2-T1;
      if elapsed_time(6)<0
          elapsed_time(6)=elapsed_time(6)+60; elapsed_time(5)=elapsed_time(5)-1;
      end
      if elapsed_time(5)<0
          elapsed_time(5)=elapsed_time(5)+60;elapsed_time(4)=elapsed_time(4)-1;
      end  %像這種程序當然不考慮運行上小時啦
      str2=sprintf(‘程序運行耗時 %d 小時 %d 分鐘 %.4f 秒‘,elapsed_time(4),elapsed_time(5),elapsed_time(6));
      disp(str2);
       
      %初始化種群
      %采用二進制Gray編碼,其目的是為了克服二進制編碼的Hamming懸崖缺點
      function [initpop]=InitPopGray(popsize,bits)
      len=sum(bits);
      initpop=zeros(popsize,len);%The whole zero encoding individual
      for i=2:popsize-1
          pop=round(rand(1,len));
          pop=mod(([0 pop]+[pop 0]),2);
          %i=1時,b(1)=a(1);i>1時,b(i)=mod(a(i-1)+a(i),2)
          %其中原二進制串:a(1)a(2)...a(n),Gray串:b(1)b(2)...b(n)
          initpop(i,:)=pop(1:end-1);
      end
      initpop(popsize,:)=ones(1,len);%The whole one encoding individual

       
      %解碼
      function [fval] = b2f(bval,bounds,bits)
      % fval   - 表征各變量的十進制數(shù)
      % bval   - 表征各變量的二進制編碼串
      % bounds - 各變量的取值范圍
      % bits   - 各變量的二進制編碼長度
      scale=(bounds(:,2)-bounds(:,1))‘./(2.^bits-1); %The range of the variables
      numV=size(bounds,1);
      cs=[0 cumsum(bits)];
      for i=1:numV
        a=bval((cs(i)+1):cs(i+1));
        fval(i)=sum(2.^(size(a,2)-1:-1:0).*a)*scale(i)+bounds(i,1);
      end

       
      %選擇操作
      %采用基于輪盤賭法的非線性排名選擇
      %各個體成員按適應值從大到小分配選擇概率:
      %P(i)=(q/1-(1-q)^n)*(1-q)^i,  其中 P(0)>P(1)>...>P(n), sum(P(i))=1
      function [selectpop]=NonlinearRankSelect(FUN,pop,bounds,bits)
      global m n
      selectpop=zeros(m,n);
      fit=zeros(m,1);
      for i=1:m
          fit(i)=feval(FUN(1,:),(b2f(pop(i,:),bounds,bits)));%以函數(shù)值為適應值做排名依據(jù)
      end
      selectprob=fit/sum(fit);%計算各個體相對適應度(0,1)
      q=max(selectprob);%選擇最優(yōu)的概率
      x=zeros(m,2);
      x(:,1)=[m:-1:1]‘;
      [y x(:,2)]=sort(selectprob);
      r=q/(1-(1-q)^m);%標準分布基值
      newfit(x(:,2))=r*(1-q).^(x(:,1)-1);%生成選擇概率
      newfit=cumsum(newfit);%計算各選擇概率之和
      rNums=sort(rand(m,1));
      fitIn=1;newIn=1;
      while newIn<=m
          if rNums(newIn)<newfit(fitIn)
              selectpop(newIn,:)=pop(fitIn,:);
              newIn=newIn+1;
          else
              fitIn=fitIn+1;
          end
      end

       
      %交叉操作
      function [NewPop]=CrossOver(OldPop,pCross,opts)
      %OldPop為父代種群,pcross為交叉概率
      global m n NewPop
      r=rand(1,m);
      y1=find(r<pCross);
      y2=find(r>=pCross);
      len=length(y1);
      if len>2&mod(len,2)==1%如果用來進行交叉的染色體的條數(shù)為奇數(shù),將其調整為偶數(shù)
          y2(length(y2)+1)=y1(len);
          y1(len)=[];
      end
      if length(y1)>=2
         for i=0:2:length(y1)-2
             if opts==0
                 [NewPop(y1(i+1),:),NewPop(y1(i+2),:)]=EqualCrossOver(OldPop(y1(i+1),:),OldPop(y1(i+2),:));
             else
                 [NewPop(y1(i+1),:),NewPop(y1(i+2),:)]=MultiPointCross(OldPop(y1(i+1),:),OldPop(y1(i+2),:));
             end
         end    
      end
      NewPop(y2,:)=OldPop(y2,:);
      %采用均勻交叉
      function [children1,children2]=EqualCrossOver(parent1,parent2)
      global n children1 children2
      hidecode=round(rand(1,n));%隨機生成掩碼
      crossposition=find(hidecode==1);
      holdposition=find(hidecode==0);
      children1(crossposition)=parent1(crossposition);%掩碼為1,父1為子1提供基因
      children1(holdposition)=parent2(holdposition);%掩碼為0,父2為子1提供基因
      children2(crossposition)=parent2(crossposition);%掩碼為1,父2為子2提供基因
      children2(holdposition)=parent1(holdposition);%掩碼為0,父1為子2提供基因
      %采用多點交叉,交叉點數(shù)由變量數(shù)決定
      function [Children1,Children2]=MultiPointCross(Parent1,Parent2)
      global n Children1 Children2 VarNum
      Children1=Parent1;
      Children2=Parent2;
      Points=sort(unidrnd(n,1,2*VarNum));
      for i=1:VarNum
          Children1(Points(2*i-1):Points(2*i))=Parent2(Points(2*i-1):Points(2*i));
          Children2(Points(2*i-1):Points(2*i))=Parent1(Points(2*i-1):Points(2*i));
      end

       
      %變異操作
      function [NewPop]=Mutation(OldPop,pMutation,VarNum)
      global m n NewPop
      r=rand(1,m);
      position=find(r<=pMutation);
      len=length(position);
      if len>=1
         for i=1:len
             k=unidrnd(n,1,VarNum); %設置變異點數(shù),一般設置1點
             for j=1:length(k)
                 if OldPop(position(i),k(j))==1
                    OldPop(position(i),k(j))=0;
                 else
                    OldPop(position(i),k(j))=1;
                 end
             end
         end
      end
      NewPop=OldPop;

       
      %倒位操作
      function [NewPop]=Inversion(OldPop,pInversion)
      global m n NewPop
      NewPop=OldPop;
      r=rand(1,m);
      PopIn=find(r<=pInversion);
      len=length(PopIn);
      if len>=1
          for i=1:len
              d=sort(unidrnd(n,1,2));
              if d(1)~=1&d(2)~=n
                 NewPop(PopIn(i),1:d(1)-1)=OldPop(PopIn(i),1:d(1)-1);
                 NewPop(PopIn(i),d(1):d(2))=OldPop(PopIn(i),d(2):-1:d(1));
                 NewPop(PopIn(i),d(2)+1:n)=OldPop(PopIn(i),d(2)+1:n);
             end
         end
      end

       
       
       

       
      用遺傳算法優(yōu)化BP神經(jīng)網(wǎng)絡的Matlab編程實例
      2007/04/28 23:09
      此文章首次在simwe公開發(fā)表,屬于GreenSim團隊原創(chuàng)作品,轉載請注明!
      由于BP網(wǎng)絡的權值優(yōu)化是一個無約束優(yōu)化問題,而且權值要采用實數(shù)編碼,所以直接利用Matlab遺傳算法工具箱。以下貼出的代碼是為一個19輸入變量,1個輸出變量情況下的非線性回歸而設計的,如果要應用于其它情況,只需改動編解碼函數(shù)即可。

      程序一:GA訓練BP權值的主函數(shù)
      function net=GABPNET(XX,YY)
      %--------------------------------------------------------------------------
      %   GABPNET.m
      %   使用遺傳算法對BP網(wǎng)絡權值閾值進行優(yōu)化,再用BP算法訓練網(wǎng)絡
      %--------------------------------------------------------------------------
      %數(shù)據(jù)歸一化預處理
      nntwarn off
      XX=premnmx(XX);
      YY=premnmx(YY);
      %創(chuàng)建網(wǎng)絡
      net=newff(minmax(XX),[19,25,1],{‘tansig‘,‘tansig‘,‘purelin‘},‘trainlm‘);
      %下面使用遺傳算法對網(wǎng)絡進行優(yōu)化
      P=XX;
      T=YY;
      R=size(P,1);
      S2=size(T,1);
      S1=25;%隱含層節(jié)點數(shù)
      S=R*S1+S1*S2+S1+S2;%遺傳算法編碼長度
      aa=ones(S,1)*[-1,1];
      popu=50;%種群規(guī)模
      initPpp=initializega(popu,aa,‘gabpEval‘);%初始化種群
      gen=100;%遺傳代數(shù)
      %下面調用gaot工具箱,其中目標函數(shù)定義為gabpEval
      [x,endPop,bPop,trace]=ga(aa,‘gabpEval‘,[],initPpp,[1e-6 1 1],‘maxGenTerm‘,gen,...
         ‘normGeomSelect‘,[0.09],[‘arithXover‘],[2],‘nonUnifMutation‘,[2 gen 3]);
      %繪收斂曲線圖
      figure(1)
      plot(trace(:,1),1./trace(:,3),‘r-‘);
      hold on
      plot(trace(:,1),1./trace(:,2),‘b-‘);
      xlabel(‘Generation‘);
      ylabel(‘Sum-Squared Error‘);
      figure(2)
      plot(trace(:,1),trace(:,3),‘r-‘);
      hold on
      plot(trace(:,1),trace(:,2),‘b-‘);
      xlabel(‘Generation‘);
      ylabel(‘Fittness‘);
      %下面將初步得到的權值矩陣賦給尚未開始訓練的BP網(wǎng)絡
      [W1,B1,W2,B2,P,T,A1,A2,SE,val]=gadecod(x);
      net.LW{2,1}=W1;
      net.LW{3,2}=W2;
      net.b{2,1}=B1;
      net.b{3,1}=B2;
      XX=P;
      YY=T;
      %設置訓練參數(shù)
      net.trainParam.show=1;
      net.trainParam.lr=1;
      net.trainParam.epochs=50;
      net.trainParam.goal=0.001;
      %訓練網(wǎng)絡
      net=train(net,XX,YY);


      程序二:適應值函數(shù)
      function [sol, val] = gabpEval(sol,options)
      % val - the fittness of this individual
      % sol - the individual, returned to allow for Lamarckian evolution
      % options - [current_generation]
      load data2
      nntwarn off
      XX=premnmx(XX);
      YY=premnmx(YY);
      P=XX;
      T=YY;
      R=size(P,1);
      S2=size(T,1);
      S1=25;%隱含層節(jié)點數(shù)
      S=R*S1+S1*S2+S1+S2;%遺傳算法編碼長度
      for i=1:S,
          x(i)=sol(i);
      end;
      [W1, B1, W2, B2, P, T, A1, A2, SE, val]=gadecod(x);

      程序三:編解碼函數(shù)
      function [W1, B1, W2, B2, P, T, A1, A2, SE, val]=gadecod(x)
      load data2
      nntwarn off
      XX=premnmx(XX);
      YY=premnmx(YY);
      P=XX;
      T=YY;
      R=size(P,1);
      S2=size(T,1);
      S1=25;%隱含層節(jié)點數(shù)
      S=R*S1+S1*S2+S1+S2;%遺傳算法編碼長度
      % 前R*S1個編碼為W1
      for i=1:S1,
           for k=1:R,
             W1(i,k)=x(R*(i-1)+k);
           end
      end
      % 接著的S1*S2個編碼(即第R*S1個后的編碼)為W2
      for i=1:S2,
          for k=1:S1,
             W2(i,k)=x(S1*(i-1)+k+R*S1);
          end
      end
      % 接著的S1個編碼(即第R*S1+S1*S2個后的編碼)為B1
      for i=1:S1,
          B1(i,1)=x((R*S1+S1*S2)+i);
      end
      % 接著的S2個編碼(即第R*S1+S1*S2+S1個后的編碼)為B2
      for i=1:S2,
          B2(i,1)=x((R*S1+S1*S2+S1)+i);
      end
      % 計算S1與S2層的輸出
      A1=tansig(W1*P,B1);
      A2=purelin(W2*A1,B2);
      % 計算誤差平方和
      SE=sumsqr(T-A2);
      val=1/SE; % 遺傳算法的適應值


      matlab遺傳算法工具箱函數(shù)及實例講解(轉引)
      2007-08-16 19:44
      核心函數(shù):
      (1)function [pop]=initializega(num,bounds,eevalFN,eevalOps,options)--
      初始種群的生成函數(shù)
      【輸出參數(shù)】
      pop--
      生成的初始種群
      【輸入?yún)?shù)】
      num--
      種群中的個體數(shù)目
      bounds--
      代表變量的上下界的矩陣
      eevalFN--
      適應度函數(shù)
      eevalOps--
      傳遞給適應度函數(shù)的參數(shù)
      options--
      選擇編碼形式(浮點編碼或是二進制編碼)[precision F_or_B],
      precision--
      變量進行二進制編碼時指定的精度
      F_or_B--
      1時選擇浮點編碼,否則為二進制編碼,precision指定精度)

      (2)function [x,endPop,bPop,traceInfo] = ga(bounds,evalFN,evalOps,startPop,opts,...
      termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps)--
      遺傳算法函數(shù)
      【輸出參數(shù)】
      x--
      求得的最優(yōu)解
      endPop--
      最終得到的種群
      bPop--
      最優(yōu)種群的一個搜索軌跡
      【輸入?yún)?shù)】
      bounds--
      代表變量上下界的矩陣
      evalFN--
      適應度函數(shù)
      evalOps--
      傳遞給適應度函數(shù)的參數(shù)
      startPop-
      初始種群
      opts[epsilon prob_ops display]--opts(1:2)
      等同于initializegaoptions參數(shù),第三個參數(shù)控制是否輸出,一般為0。如[1e-6 1 0]
      termFN--
      終止函數(shù)的名稱,[‘maxGenTerm‘]
      termOps--
      傳遞個終止函數(shù)的參數(shù),[100]
      selectFN--
      選擇函數(shù)的名稱,[‘normGeomSelect‘]
      selectOps--
      傳遞個選擇函數(shù)的參數(shù),[0.08]
      xOverFNs--
      交叉函數(shù)名稱表,以空格分開,如[‘arithXover heuristicXover simpleXover‘]
      xOverOps--
      傳遞給交叉函數(shù)的參數(shù)表,如[2 0;2 3;2 0]
      mutFNs--
      變異函數(shù)表,如[‘boundaryMutation multiNonUnifMutation nonUnifMutation unifMutation‘]
      mutOps--
      傳遞給交叉函數(shù)的參數(shù)表,[4 0 0;6 100 3;4 100 3;4 0 0]

      注意】matlab工具箱函數(shù)必須放在工作目錄下
      【問題】求f(x)=x+10*sin(5x)+7*cos(4x)的最大值,其中0<=x<=9
      【分析】選擇二進制編碼,種群中的個體數(shù)目為10,二進制編碼長度為20,交叉概率為0.95,變異概率為0.08
      【程序清單】
      %
      編寫目標函數(shù)
      function[sol,eval]=fitness(sol,options)
      x=sol(1);
      eval=x+10*sin(5*x)+7*cos(4*x);
      %
      把上述函數(shù)存儲為fitness.m文件并放在工作目錄下

      initPop=initializega(10,[0 9],‘fitness‘);%
      生成初始種群,大小為10
      [x endPop,bPop,trace]=ga([0 9],‘fitness‘,[],initPop,[1e-6 1 1],‘maxGenTerm‘,25,‘normGeomSelect‘,...
      [0.08],[‘arithXover‘],[2],‘nonUnifMutation‘,[2 25 3]) %25
      次遺傳迭代

      運算借過為:x =
      7.8562 24.8553(
      x7.8562時,fx)取最大值24.8553)

      注:遺傳算法一般用來取得近似最優(yōu)解,而不是最優(yōu)解。



      遺傳算法實例2

      【問題】在-5<=Xi<=5,i=1,2區(qū)間內,求解
      f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(x1.^2+x2.^2)))-exp(0.5*(cos(2*pi*x1)+cos(2*pi*x2)))+22.71282
      的最小值。
      【分析】種群大小10,最大代數(shù)1000,變異率0.1,交叉率0.3
      【程序清單】
      %源函數(shù)的matlab代碼
      function [eval]=f(sol)
      numv=size(sol,2);
      x=sol(1:numv);
      eval=-20*exp(-0.2*sqrt(sum(x.^2)/numv)))-exp(sum(cos(2*pi*x))/numv)+22.71282;
      %
      適應度函數(shù)的matlab代碼
      function [sol,eval]=fitness(sol,options)
      numv=size(sol,2)-1;
      x=sol(1:numv);
      eval=f(x);
      eval=-eval;
      %
      遺傳算法的matlab代碼
      bounds=ones(2,1)*[-5 5];
      [p,endPop,bestSols,trace]=ga(bounds,‘fitness‘)

      注:前兩個文件存儲為m文件并放在工作目錄下,運行結果為
      p =
      0.0000 -0.0000 0.0055



      大家可以直接繪出f(x)的圖形來大概看看fx)的最值是多少,也可是使用優(yōu)化函數(shù)來驗證。matlab命令行執(zhí)行命令:
      fplot(‘x+10*sin(5*x)+7*cos(4*x)‘,[0,9])


      evalops
      是傳遞給適應度函數(shù)的參數(shù),opts是二進制編碼的精度,termops是選擇maxGenTerm結束函數(shù)時傳遞個maxGenTerm的參數(shù),即遺傳代數(shù)。xoverops是傳遞給交叉函數(shù)的參數(shù)。mutops是傳遞給變異函數(shù)的參數(shù)。
       
       
       
       
      一個動態(tài)遺傳算法代碼 matlab的
      2008-03-19 17:11

      %IAGA
      function best=ga
      clear
      MAX_gen=200;            %最大迭代步數(shù)
      best.max_f=0;           %當前最大的適應度
      STOP_f=14.5;            %停止循環(huán)的適應度
      RANGE=[0 255];          %初始取值范圍[0 255]
      SPEEDUP_INTER=5;       %進入加速迭代的間隔
      advance_k=0;            %優(yōu)化的次數(shù)

      popus=init;             %初始化
      for gen=1:MAX_gen
          fitness=fit(popus,RANGE);       %求適應度
          f=fitness.f;
          picked=choose(popus,fitness);   %選擇
          popus=intercross(popus,picked); %雜交
          popus=aberrance(popus,picked); %變異
          if max(f)>best.max_f
              advance_k=advance_k+1;
              x_better(advance_k)=fitness.x;
              best.max_f=max(f);
              best.popus=popus;
              best.x=fitness.x;
          end
          if mod(advance_k,SPEEDUP_INTER)==0
              RANGE=minmax(x_better);
             
              RANGE
             
              advance=0;
          end
      end
      return;
      function popus=init%初始化
      M=50;%種群個體數(shù)目
      N=30;%編碼長度
      popus=round(rand(M,N));
      return;

      function fitness=fit(popus,RANGE)%求適應度
      [M,N]=size(popus);
      fitness=zeros(M,1);%適應度
      f=zeros(M,1);%函數(shù)值
      A=RANGE(1);B=RANGE(2);%初始取值范圍[0 255]

      for m=1:M
          x=0;
          for n=1:N
              x=x+popus(m,n)*(2^(n-1));
          end
          x=x*((B-A)/(2^N))+A;
          for k=1:5
              f(m,1)=f(m,1)-(k*sin((k+1)*x+k));
          end
      end
      f_std=(f-min(f))./(max(f)-min(f));%函數(shù)值標準化
      fitness.f=f;fitness.f_std=f_std;fitness.x=x;
      return;

      function picked=choose(popus,fitness)%選擇
      f=fitness.f;f_std=fitness.f_std;
      [M,N]=size(popus);
      choose_N=3;                 %選擇choose_N對雙親
      picked=zeros(choose_N,2);   %記錄選擇好的雙親
      p=zeros(M,1);               %選擇概率
      d_order=zeros(M,1);

      %把父代個體按適應度從大到小排序
      f_t=sort(f,‘descend‘);%將適應度按降序排列
      for k=1:M
          x=find(f==f_t(k));%降序排列的個體序號
          d_order(k)=x(1);
      end
      for m=1:M
          popus_t(m,:)=popus(d_order(m),:);
      end
      popus=popus_t;
      f=f_t;

      p=f_std./sum(f_std);                    %選擇概率
      c_p=cumsum(p)‘;                          %累積概率

      for cn=1:choose_N
          picked(cn,1)=roulette(c_p); %輪盤賭
          picked(cn,2)=roulette(c_p); %輪盤賭
          popus=intercross(popus,picked(cn,:));%雜交
      end
      popus=aberrance(popus,picked);%變異
      return;

      function popus=intercross(popus,picked) %雜交
      [M_p,N_p]=size(picked);
      [M,N]=size(popus);
      for cn=1:M_p
          p(1)=ceil(rand*N);%生成雜交位置
          p(2)=ceil(rand*N);
          p=sort(p);
          t=popus(picked(cn,1),p(1):p(2));
          popus(picked(cn,1),p(1):p(2))=popus(picked(cn,2),p(1):p(2));
          popus(picked(cn,2),p(1):p(2))=t;
      end
      return;
      function popus=aberrance(popus,picked) %變異
      P_a=0.05;%變異概率
      [M,N]=size(popus);
      [M_p,N_p]=size(picked);
      U=rand(1,2);

      for kp=1:M_p
          if U(2)>=P_a        %如果大于變異概率,就不變異
              continue;
          end
          if U(1)>=0.5
              a=picked(kp,1);
          else
              a=picked(kp,2);
          end
          p(1)=ceil(rand*N);%生成變異位置
          p(2)=ceil(rand*N);
          if popus(a,p(1))==1%0 1變換
              popus(a,p(1))=0;
          else
              popus(a,p(1))=1;
          end
          if popus(a,p(2))==1
              popus(a,p(2))=0;
          else
              popus(a,p(2))=1;
          end
      end
      return;

      function picked=roulette(c_p) %輪盤賭
      [M,N]=size(c_p);
      M=max([M N]);
      U=rand;
      if U<c_p(1)
          picked=1;
          return;
      end
      for m=1:(M-1)
          if U>c_p(m) & U<c_p(m+1)
              picked=m+1;
              break;
          end
      end

      全方位的兩點雜交、兩點變異的改進的加速遺傳算法(IAGA)

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多