1. 程式人生 > >遺傳算法

遺傳算法

進行 準則 概率 lin 說明 ima 網絡 更多 bin

作者:桂。

時間:2017-08-13 13:49:55

鏈接:http://www.cnblogs.com/xingshansi/p/7353340.html


前言

  用到了遺傳算法,簡單記錄思路。遺傳算法(GA)對於學習任何一門學問都有幫助,它是一種普適的學習方法。

一、遺傳算法簡介

  遺傳算法(Genetic algorithm,GA)是仿生算法的一種,基本思想是:優勝劣汰+染色體組合(編碼、交叉、變異)。主要用來求解優化問題,例如一元函數、多元函數、非線性規劃、神經網絡的參數組等等,本質都是參數的優化求解。

二、遺傳算法步驟

  簡要劃分為6個步驟:

1)編碼:例如求解x,給定x範圍,希望參數誤差小於1e-4,這個數據→xmin+(xmax-xmin)/分辨率 進行編碼時,例如采用二進制編碼,編碼長度便可以計算出來。

2)初始群體生成:即初始化參數,並指定個體數目(無限大就相當於遍歷求解)。

3)適應度評估:相當於準則函數(以最小化為例),如果準則函數越小,則適應度越大,後期越可能存活下來(下一步驟:選擇 需要借助適應度);

4)選擇:這一步體現了:適者生存的哲學,從當前個體中選擇優良個體,適應度大的選擇概率更大(這就對應了輪盤算法,概率大的中獎幾率大嘛,有的還將最優結果直接保留,而不參與到概率選擇中。);

5)交叉:交叉的方式很多,最基本的就是選定一個編碼片區,不同的個體進行交換,這一步保證了個體盡量不重復。較差概率通常較大,如0.8。

6)變異:當進化到後期,個體非常相似,交叉可能得到相同的結果,因此變異創造了更多可能,變異因為具有隨機性,因此變異概率較小,如0.01。

指定遺傳的代數N,或者設定適應度門限,完成進化。大概流程:

技術分享

三、工具包

  謝菲爾德(Sheffield)大學的MATLAB遺傳工具箱。網上教程很多,工具箱也自帶使用說明。

  應用舉例:

clc
clear all
close all
addpath(genpath(‘./gatbx/‘));

figure(1);
hold on;
lb=1;ub=2; 
ezplot(‘sin(10*pi*X)/X‘,[lb,ub]);   
xlabel(‘自變量/X‘)
ylabel(‘函數值/Y‘)

NIND=40;        
MAXGEN=20;      
PRECI=20;       
GGAP=0.95;      
px=0.7;         
pm=0.01;        
trace=zeros(2,MAXGEN);                        
FieldD=[PRECI;lb;ub;1;0;1;1];                      
Chrom=crtbp(NIND,PRECI);                      

gen=0;                                  
X=bs2rv(Chrom,FieldD);                 
ObjV=sin(10*pi*X)./X;        
while gen<MAXGEN
   FitnV=ranking(ObjV);                               
   SelCh=select(‘sus‘,Chrom,FitnV,GGAP);              
   SelCh=recombin(‘xovsp‘,SelCh,px);                  
   SelCh=mut(SelCh,pm);                               
   X=bs2rv(SelCh,FieldD);               
   ObjVSel=sin(10*pi*X)./X;             
   [Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); 
   X=bs2rv(Chrom,FieldD);
   gen=gen+1;                                             
   
   [Y,I]=min(ObjV);
   trace(1,gen)=X(I);                            
   trace(2,gen)=Y;                               
end
plot(trace(1,:),trace(2,:),‘bo‘);                            
grid on;
plot(X,ObjV,‘b*‘);   
hold off

figure(2);
plot(1:MAXGEN,trace(2,:));
grid on
xlabel(‘遺傳代數‘)
ylabel(‘解的變化‘)
title(‘進化過程‘)
bestY=trace(2,end);
bestX=trace(1,end);
fprintf([‘最優解:\nX=‘,num2str(bestX),‘\nY=‘,num2str(bestY),‘\n‘])

技術分享

遺傳算法