遺傳算法
作者:桂。
時間: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‘])
遺傳算法