【 MATLAB 】遗传算法程序
        【摘要】  有段时间,一直用为知笔记记笔记,可是后来使用了csdn博客后,就不太喜欢用为知笔记了,可惜了我的会员。笔记里的一些东西,例如公式什么的,都不能直接复制过来,很是遗憾。 
准备弃用为知笔记了,把这个遗传算法的程序粘过来吧,即使对我可能没什么用了,但也可能有需要用的人。 
程序很详细,当时上课的时候就是用这个程序编的一篇小报告。程序很详细。 
function main()%% ...
    
    
    
    有段时间,一直用为知笔记记笔记,可是后来使用了csdn博客后,就不太喜欢用为知笔记了,可惜了我的会员。笔记里的一些东西,例如公式什么的,都不能直接复制过来,很是遗憾。
准备弃用为知笔记了,把这个遗传算法的程序粘过来吧,即使对我可能没什么用了,但也可能有需要用的人。
程序很详细,当时上课的时候就是用这个程序编的一篇小报告。程序很详细。
  
   - 
    
     
    
    
     
      function main()
     
    
- 
    
     
    
    
     
      %% -------------主函数-----------------------------------
     
    
- 
    
     
    
    
     
      % 用遗传算法求:
     
    
- 
    
     
    
    
     
      % max: f(x1,x2) = 21.5+x1*sin(4*pi*x1)+x2*sin(20*pi*x2) 
     
    
- 
    
     
    
    
     
      % s.t: -3.0 <= x1 <= 12.1
     
    
- 
    
     
    
    
     
      % 4.1 <= x2 <= 5.8
     
    
- 
    
     
    
    
     
      %---------------------------------------------------------------
     
    
- 
    
     
    
    
     
      clear
     
    
- 
    
     
    
    
     
      clc
     
    
- 
    
     
    
    
     
      close all
     
    
- 
    
     
    
    
     
      popsize = 100; %种群大小
     
    
- 
    
     
    
    
     
      x1_length = 18;   %x1长度为18
     
    
- 
    
     
    
    
     
      x2_length = 15;   %x2长度为15
     
    
- 
    
     
    
    
     
      chromlength = 33;  %二进制编码长度
     
    
- 
    
     
    
    
     
      pc = 0.25; %交叉概率
     
    
- 
    
     
    
    
     
      pm = 0.01; %变异概率
     
    
- 
    
     
    
    
     
      pop = initpop(popsize,chromlength);   %初始种群
     
    
- 
    
     
    
    
     
      for i = 1:1000 % 迭代1000次
     
    
- 
    
     
    
    
     
       [objvalue] = cal_objvalue(pop);%计算计算函数值
     
    
- 
    
     
    
    
     
       fitvalue = objvalue; %令适应度等于函数值
     
    
- 
    
     
    
    
     
       [newpop] = selection(pop,fitvalue);  %选择操作
     
    
- 
    
     
    
    
     
       [newpop] = crossover(newpop,pc); %交叉操作
     
    
- 
    
     
    
    
     
       [newpop] = mutation(newpop,pm); %变异操作
     
    
- 
    
     
    
    
     
       pop = newpop; %更新种群
     
    
- 
    
     
    
    
      % 将种群的每个个体表示出来
     
    
- 
    
     
    
    
     
       [A B] = binary2decimal(newpop);
     
    
- 
    
     
    
    
     
       [y] = cal_objvalue(newpop);  
     
    
- 
    
     
    
    
     
       figure(1);
     
    
- 
    
     
    
    
     
       set(1, 'unit', 'normalized', 'position', [0.1,0.1,0.7,0.7]);
     
    
- 
    
     
    
    
     
       if  i<=100&mod(i,10)==0  %每迭代10次做一次图,画100次以内的图
     
    
- 
    
     
    
    
     
       j = floor(i/10);
     
    
- 
    
     
    
    
      %画3d图
     
    
- 
    
     
    
    
     
       X = -3.0:0.1:12.1;
     
    
- 
    
     
    
    
     
       Y = 4.1:0.1:5.8;
     
    
- 
    
     
    
    
     
       subplot(2,5,j);
     
    
- 
    
     
    
    
     
       [X, Y] = meshgrid(X,Y);
     
    
- 
    
     
    
    
     
       Z = 21.5 + X.*sin(4*pi*X) + Y.*sin(20*pi*Y);
     
    
- 
    
     
    
    
     
       mesh(X,Y,Z);
     
    
- 
    
     
    
    
     
       hold on;
     
    
- 
    
     
    
    
     
       title(['迭代次数为 n=' num2str(i)]);
     
    
- 
    
     
    
    
     
       plot3(A,B,y,'*');
     
    
- 
    
     
    
    
     
       end
     
    
- 
    
     
    
    
     
       [bestindividual,bestfit]=best(pop,fitvalue);%寻找最优解
     
    
- 
    
     
    
    
     
       [x1 x2] = binary2decimal(bestindividual); %将二进制值转换为十进制
     
    
- 
    
     
    
    
     
       BEST(i) = bestfit;
     
    
- 
    
     
    
    
     
       X1(i) = x1;
     
    
- 
    
     
    
    
     
       X2(i) = x2;
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      end 
     
    
- 
    
     
    
    
       
     
    
- 
    
     
    
    
     
       [max_value,index] = max(BEST');
     
    
- 
    
     
    
    
     
       best_x1 = X1(index);
     
    
- 
    
     
    
    
     
       best_x2 = X2(index);
     
    
- 
    
     
    
    
     
       figure(2);
     
    
- 
    
     
    
    
     
       set(2, 'unit', 'normalized', 'position', [0.1,0.1,0.7,0.7]);
     
    
- 
    
     
    
    
     
       i = 1:1000;
     
    
- 
    
     
    
    
     
       plot(i,BEST);
     
    
- 
    
     
    
    
     
       axis([0,1000,0,40]);
     
    
- 
    
     
    
    
     
       xlabel('进化代数');
     
    
- 
    
     
    
    
     
       ylabel('函数值');
     
    
- 
    
     
    
    
     
       text(100,10,'交叉概率pc = 0.6 变异概率pm = 0.01 进化代数1000次');
     
    
- 
    
     
    
    
     
       text(100,8,['After ',num2str(index),' generations,',...
     
    
- 
    
     
    
    
      ' the max value was got.']);
     
    
- 
    
     
    
    
     
       text(100,6,[' x1 = ',num2str(best_x1),' x2= ',num2str(best_x2),...
     
    
- 
    
     
    
    
      ' max value= ', num2str(max_value)]);
     
    
- 
    
     
    
    
     
       fprintf('After %.0f times iterations, max_value was got.\n',index);
     
    
- 
    
     
    
    
     
       fprintf('the best x1 is --->> %5.2f\n',best_x1);
     
    
- 
    
     
    
    
     
       fprintf('the best x2 is --->> %5.2f\n',best_x2);
     
    
- 
    
     
    
    
     
       fprintf('the best y is --->> %5.2f\n',max_value);
     
    
- 
    
     
    
    
     
       fprintf('\n');
     
    
- 
    
     
    
    
     
       fprintf('After %.0f times iterations, final_value was got.\n',1000);
     
    
- 
    
     
    
    
     
       fprintf('the final x1 is --->> %5.2f\n',x1);
     
    
- 
    
     
    
    
     
       fprintf('the final x2 is --->> %5.2f\n',x2);
     
    
- 
    
     
    
    
     
       fprintf('the final y is --->> %5.2f\n',bestfit);
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      function pop = initpop(popsize,chromlength)
     
    
- 
    
     
    
    
     
      %% -------------初始化种群函数----------------
     
    
- 
    
     
    
    
     
      % 初始化种群大小
     
    
- 
    
     
    
    
     
      % 输入变量:
     
    
- 
    
     
    
    
     
      % popsize:种群大小
     
    
- 
    
     
    
    
     
      % chromlength:染色体长度--》转化的二进制长度
     
    
- 
    
     
    
    
     
      % 输出变量:
     
    
- 
    
     
    
    
     
      % pop:种群
     
    
- 
    
     
    
    
     
      %---------------------------------------
     
    
- 
    
     
    
    
     
      pop = round(rand(popsize,chromlength));  %随机产生一个矩阵,每一行是一个长33位染色体;
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      function [pop1 pop2] = binary2decimal(pop)
     
    
- 
    
     
    
    
     
      %% -----------解码函数---------------------
     
    
- 
    
     
    
    
     
      % 二进制转化为十进制数
     
    
- 
    
     
    
    
     
      % 输入变量:
     
    
- 
    
     
    
    
     
      % 二进制种群
     
    
- 
    
     
    
    
     
      % 输出变量:
     
    
- 
    
     
    
    
     
      % 十进制数值
     
    
- 
    
     
    
    
     
      %-----------------------------------------
     
    
- 
    
     
    
    
     
      for i = 1:18
     
    
- 
    
     
    
    
     
       pop_x1(:,i) = 2.^(18 - i).*pop(:,i);
     
    
- 
    
     
    
    
     
      end
     
    
- 
    
     
    
    
     
      for j = 1:15
     
    
- 
    
     
    
    
     
       pop_x2(:,j) = 2.^(15 - j).*pop(:,j+18);
     
    
- 
    
     
    
    
     
      end
     
    
- 
    
     
    
    
     
      %sum(.,2)对行求和,得到列向量
     
    
- 
    
     
    
    
     
      temp1 = sum(pop_x1,2);
     
    
- 
    
     
    
    
     
      temp2 = sum(pop_x2,2);
     
    
- 
    
     
    
    
     
      pop1 = -3.0 + temp1*15.1/(2^18-1); %pop1表示输出x1的十进制数
     
    
- 
    
     
    
    
     
      pop2 = 4.1 + temp2*1.7/(2^15-1);  %pop2表示输出的x2的十进制数
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      function [objvalue] = cal_objvalue(pop)
     
    
- 
    
     
    
    
     
      %% --------------计算函数值函数----------------------
     
    
- 
    
     
    
    
     
      % 计算函数目标值
     
    
- 
    
     
    
    
     
      %输入变量:二进制数值
     
    
- 
    
     
    
    
     
      %输出变量:目标函数值
     
    
- 
    
     
    
    
     
      %---------------------------------------------
     
    
- 
    
     
    
    
     
      [x1 x2] = binary2decimal(pop);
     
    
- 
    
     
    
    
     
      objvalue = 21.5 + x1.*sin(4*pi*x1) + x2.*sin(20*pi*x2);
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      function [newpop] = selection(pop,fitvalue)
     
    
- 
    
     
    
    
     
      %% -----------------根据适应度选择函数-------------------
     
    
- 
    
     
    
    
     
      % 输入变量 :pop:二进制种群
     
    
- 
    
     
    
    
     
      % fitvalue: 适应度
     
    
- 
    
     
    
    
     
      %输出变量: newpop: 选择以后的二进制种群
     
    
- 
    
     
    
    
     
      % -------------------------------------------
     
    
- 
    
     
    
    
     
      %构造轮盘
     
    
- 
    
     
    
    
     
      [px,py] = size(pop);
     
    
- 
    
     
    
    
     
      totalfit = sum(fitvalue);
     
    
- 
    
     
    
    
     
      p_fitvalue = fitvalue/totalfit;
     
    
- 
    
     
    
    
     
      p_fitvalue = cumsum(p_fitvalue);%概率求和后排序
     
    
- 
    
     
    
    
     
      ms = sort(rand(px,1)); %产生一列随机数,从小到大排列,相当于转转盘10次
     
    
- 
    
     
    
    
     
      fitin = 1;
     
    
- 
    
     
    
    
     
      newin = 1;
     
    
- 
    
     
    
    
     
      while newin <= px
     
    
- 
    
     
    
    
     
       if(ms(newin)) < p_fitvalue(fitin) % 转盘转到 fitin 的位置
     
    
- 
    
     
    
    
     
       newpop(newin,:) = pop(fitin,:); %新种群的第 newin 个体为pop中的第fitin 个体
     
    
- 
    
     
    
    
     
       newin = newin + 1;
     
    
- 
    
     
    
    
     
       else
     
    
- 
    
     
    
    
     
       fitin = fitin +1; %相当于每次都从第一个比较起,依次加1,直至比较完,看转到的是哪一个
     
    
- 
    
     
    
    
     
       end
     
    
- 
    
     
    
    
     
      end
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      function [newpop] = crossover(pop,pc)
     
    
- 
    
     
    
    
     
      %% ----------交叉函数--------------------
     
    
- 
    
     
    
    
     
      % 输入变量:pop:二进制的父代种群数
     
    
- 
    
     
    
    
     
      % pc :交叉概率
     
    
- 
    
     
    
    
     
      % 输出变量:newpop: 交叉后的种群数
     
    
- 
    
     
    
    
     
      %---------------------------------------
     
    
- 
    
     
    
    
     
      [px,py] = size(pop);
     
    
- 
    
     
    
    
     
      newpop = ones(size(pop));
     
    
- 
    
     
    
    
     
      for i = 1:2:px-1  % 1与2交叉。3与4交叉。。。。。每次隔一个,因此步子为2
     
    
- 
    
     
    
    
     
       if (rand<pc)  % pc = 0.6,即有60%的机会交叉
     
    
- 
    
     
    
    
     
       cpoint = round(rand*py); %交叉点随机选取,互换交叉点以后的值
     
    
- 
    
     
    
    
     
       if cpoint <= 0
     
    
- 
    
     
    
    
      % cpoint = 1;
     
    
- 
    
     
    
    
     
       continue;
     
    
- 
    
     
    
    
     
       end
     
    
- 
    
     
    
    
     
       newpop(i,:) = [pop(i,1:cpoint),pop(i+1,cpoint+1:py)];%交叉后的第i个个体
     
    
- 
    
     
    
    
     
       newpop(i+1,:) = [pop(i+1,1:cpoint),pop(i,cpoint+1:py)];
     
    
- 
    
     
    
    
     
       else  % 40%的机会不交叉
     
    
- 
    
     
    
    
     
       newpop(i,:) = pop(i,:);
     
    
- 
    
     
    
    
     
       newpop(i+1,:) = pop(i+1,:);
     
    
- 
    
     
    
    
     
       end
     
    
- 
    
     
    
    
     
      end
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      function [newpop] = mutation(pop,pm)
     
    
- 
    
     
    
    
     
      %% ------------变异函数---------------------------
     
    
- 
    
     
    
    
     
      % 输入变量 pop: 二进制种群
     
    
- 
    
     
    
    
     
      % pm : 变异概率
     
    
- 
    
     
    
    
     
      % 输出变量: newpop : 变异以后的种群
     
    
- 
    
     
    
    
     
      %-----------------------------------------------
     
    
- 
    
     
    
    
     
      [px,py] = size(pop);
     
    
- 
    
     
    
    
     
      newpop = ones(size(pop)); %只是起到提前声明的作用,提高运算速度
     
    
- 
    
     
    
    
     
      for i = 1:px
     
    
- 
    
     
    
    
     
       if(rand<pm)
     
    
- 
    
     
    
    
     
       mpoint = round(rand*py);
     
    
- 
    
     
    
    
     
       if mpoint<=0
     
    
- 
    
     
    
    
     
       mpoint = 1;
     
    
- 
    
     
    
    
     
       end
     
    
- 
    
     
    
    
     
       newpop(i,:) = pop(i,:);
     
    
- 
    
     
    
    
     
       if newpop(i,mpoint) == 0
     
    
- 
    
     
    
    
     
       newpop(i,mpoint) = 1;
     
    
- 
    
     
    
    
     
       else
     
    
- 
    
     
    
    
     
       newpop(i,mpoint) = 0;
     
    
- 
    
     
    
    
     
       end
     
    
- 
    
     
    
    
     
       else
     
    
- 
    
     
    
    
     
       newpop(i,:) = pop(i,:);
     
    
- 
    
     
    
    
     
       end
     
    
- 
    
     
    
    
     
      end
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      function [bestindividual,bestfit] = best(pop,fitvalue)
     
    
- 
    
     
    
    
     
      %% --------------选出最优个体函数-----------------------
     
    
- 
    
     
    
    
     
      % 输入变量: pop :种群
     
    
- 
    
     
    
    
     
      % fitvalue : 种群适应度
     
    
- 
    
     
    
    
     
      % 输出变量: bestindividual : 最佳个体(二进制)
     
    
- 
    
     
    
    
     
      % bestfit : 最佳适应度值
     
    
- 
    
     
    
    
     
      % ---------------------------------------------
     
    
- 
    
     
    
    
     
      [px,py] = size(pop);
     
    
- 
    
     
    
    
     
      bestindividual = pop(1,:);
     
    
- 
    
     
    
    
     
      bestfit = fitvalue(1);
     
    
- 
    
     
    
    
     
      for i = 2:px
     
    
- 
    
     
    
    
     
       if fitvalue(i)>bestfit
     
    
- 
    
     
    
    
     
       bestindividual = pop(i,:);
     
    
- 
    
     
    
    
     
       bestfit = fitvalue(i);
     
    
- 
    
     
    
    
     
       end
     
    
- 
    
     
    
    
     
      end
     
    
 
文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。
原文链接:reborn.blog.csdn.net/article/details/82913414
        【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
            cloudbbs@huaweicloud.com
        
        
        
        
        
        
        - 点赞
- 收藏
- 关注作者
 
             
           
评论(0)