【 MATLAB 】遺傳算法程序

      網友投稿 1371 2025-04-01

      有段時間,一直用為知筆記記筆記,可是后來使用了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)

      %% -----------解碼函數---------------------

      % 二進制轉化為十進制數

      % 輸入變量:

      % 二進制種群

      % 輸出變量:

      % 十進制數值

      【 MATLAB 】遺傳算法程序

      %-----------------------------------------

      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

      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

      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

      matlab

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:wps表格中怎樣快速復制相同內容(wps怎么快速復制同樣的內容)
      下一篇:WPS表單可以為公司人員快速生成用戶名和密碼 這很容易完成(員工怎么登錄wps企業賬戶)
      相關文章
      亚洲va在线va天堂va手机| 亚洲色大成网站www永久| 亚洲精品无码乱码成人| 一区二区三区亚洲视频| 亚洲国产av玩弄放荡人妇 | 亚洲色图黄色小说| 亚洲综合激情五月丁香六月| 亚洲精品午夜在线观看| 亚洲综合久久成人69| 亚洲福利一区二区三区| 亚洲男人电影天堂| 精品无码一区二区三区亚洲桃色| 亚洲欧洲一区二区| 亚洲毛片无码专区亚洲乱| 亚洲成年人电影在线观看| 亚洲一线产区二线产区精华| 久久亚洲最大成人网4438| 亚洲午夜无码毛片av久久京东热 | 亚洲精品av无码喷奶水糖心| 亚洲色大成网站www尤物| 亚洲人成电影网站免费| 亚洲av无码专区首页| 国产精品国产亚洲区艳妇糸列短篇 | 亚洲午夜精品一区二区公牛电影院| 亚洲欧洲日韩综合| 亚洲一区二区三区免费在线观看| 亚洲精品亚洲人成在线播放| 亚洲自偷自偷在线成人网站传媒| 亚洲精品又粗又大又爽A片| 精品国产日韩亚洲一区91| 亚洲成av人片在线观看天堂无码 | 亚洲精品中文字幕无码AV| 亚洲一级在线观看| 亚洲国产成人AV在线播放| 亚洲制服丝袜中文字幕| 亚洲人成色在线观看| 国产成人精品亚洲一区| 国产精品亚洲不卡一区二区三区 | jlzzjlzz亚洲jzjzjz| 亚洲成a∨人片在无码2023| 亚洲成av人片在线观看天堂无码 |