遺傳演算法執行個體(Matlab實現)

來源:互聯網
上載者:User

標籤:變異   0.12   運算   int   www.   結果   變數   ==   abs   

遺傳演算法最佳化函數y=10*sin(5*x)+7*abs(x-5)+10,這個函數映像為:

下面看代碼:

(1)首先看主函數

function main()clear;clc;%種群大小popsize=100;%二進位編碼長度chromlength=10;%交叉機率pc = 0.6;%變異機率pm = 0.001;%初始種群pop = initpop(popsize,chromlength);for i = 1:100    %計算適應度值(函數值)    objvalue = cal_objvalue(pop);    fitvalue = objvalue;    %選擇操作    newpop = selection(pop,fitvalue);    %交叉操作    newpop = crossover(newpop,pc);    %變異操作    newpop = mutation(newpop,pm);    %更新種群    pop = newpop;    %尋找最優解    [bestindividual,bestfit] = best(pop,fitvalue);    x2 = binary2decimal(bestindividual);    x1 = binary2decimal(newpop);    y1 = cal_objvalue(newpop);    if mod(i,10) == 0        figure;        fplot(‘10*sin(5*x)+7*abs(x-5)+10‘,[0 10]);        hold on;        plot(x1,y1,‘*‘);        title([‘迭代次數為n=‘ num2str(i)]);        %plot(x1,y1,‘*‘);    endendfprintf(‘The best X is --->>%5.2f\n‘,x2);fprintf(‘The best Y is --->>%5.2f\n‘,bestfit);

(2)下面看二進位種群產生的方法

%初始化種群大小%輸入變數:%popsize:種群大小%chromlength:染色體長度-->>轉化的二進位長度%輸出變數:%pop:種群function pop=initpop(popsize,chromlength)pop = round(rand(popsize,chromlength));%rand(3,4)產生3行4列的0-1之間的隨機數% rand(3,4)% % ans =% %     0.8147    0.9134    0.2785    0.9649%     0.9058    0.6324    0.5469    0.1576%     0.1270    0.0975    0.9575    0.9706%round就是四捨五入% round(rand(3,4))=% 1 1 0 1% 1 1 1 0% 0 0 1 1%所以返回的種群就是每行是一個個體,列數是染色體長度

(3)下面看如何把二進位返回對應的十進位

%二進位轉化成十進位函數%輸入變數:%二進位種群%輸出變數%十進位數值function pop2 = binary2decimal(pop)[px,py]=size(pop);for i = 1:py    pop1(:,i) = 2.^(py-i).*pop(:,i);end%sum(.,2)對行求和,得到列向量temp = sum(pop1,2);pop2 = temp*10/1023;

(4)下面看計算適應度函數:

%計算函數目標值%輸入變數:位元值%輸出變數:目標函數值function [objvalue] = cal_objvalue(pop)x = binary2decimal(pop);%轉化位元為x變數的變化域範圍的數值objvalue=10*sin(5*x)+7*abs(x-5)+10;

(5)如何選擇新的個體

上面所有個體的函數值都計算出來了,存在objvalue中,此時它是不是也是100組y值啊,恩,那麼對於現有的隨機產生的100組x,怎麼來再選擇100組新的更好的x呢?這裡我們把選擇放在了交叉與變異之間了,都可以,如何選擇,就要構造機率的那個輪盤了,誰的機率大,是不是選擇的個體就會多一些?也就是現在的選擇就是100中100個,最後出現的就夠就是以前的100個中最優的x有一個的話,選擇完後,可能就變成5個這個x了,多餘的4個是不是相當於頂替了以前的不好的4個x值,這樣才能達到x總數100不變啊。

%如何選擇新的個體%輸入變數:pop二進位種群,fitvalue:適應度值%輸出變數:newpop選擇以後的二進位種群function [newpop] = selection(pop,fitvalue)%構造輪盤[px,py] = size(pop);totalfit = sum(fitvalue);p_fitvalue = fitvalue/totalfit;p_fitvalue = cumsum(p_fitvalue);%機率求和排序ms = sort(rand(px,1));%從小到大排列fitin = 1;newin = 1;while newin<=px    if(ms(newin))<p_fitvalue(fitin)        newpop(newin,:)=pop(fitin,:);        newin = newin+1;    else        fitin=fitin+1;    endend    

(6)怎麼交叉

%交叉變換%輸入變數:pop:二進位的父代種群數,pc:交叉的機率%輸出變數:newpop:交叉後的種群數function [newpop] = crossover(pop,pc)[px,py] = size(pop);newpop = ones(size(pop));for i = 1:2:px-1    if(rand<pc)        cpoint = round(rand*py);        newpop(i,:) = [pop(i,1:cpoint),pop(i+1,cpoint+1:py)];        newpop(i+1,:) = [pop(i+1,1:cpoint),pop(i,cpoint+1:py)];    else        newpop(i,:) = pop(i,:);        newpop(i+1,:) = pop(i+1,:);    endend

(7)怎麼變異

%關於編譯%函數說明%輸入變數:pop:二進位種群,pm:變異機率%輸出變數:newpop變異以後的種群function [newpop] = mutation(pop,pm)[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) == 1            newpop(i,mpoint) = 0;        end    else newpop(i,:) = pop(i,:);    endend  

(8)選擇最優個體

%求最優適應度函數%輸入變數:pop:種群,fitvalue:種群適應度%輸出變數:bestindividual:最佳個體,bestfit:最佳適應度值function [bestindividual bestfit] = best(pop,fitvalue)[px,py] = size(pop);bestindividual = pop(1,:);bestfit = fitvalue(1);for i = 2:px    if fitvalue(i)>bestfit        bestindividual = pop(i,:);        bestfit = fitvalue(i);    endend

到這裡遺傳演算法程式就算是結束了。

看部分圖片結果:

 交叉

基本遺傳演算法(SGA)中交叉運算元採用單點交叉運算元。

單點交叉運算

變異

 

轉:https://www.cnblogs.com/LoganChen/p/7509702.html

遺傳演算法執行個體(Matlab實現)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.